Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Before y After 8
Asserts 10
Ejemplo 11
Expected y Timeout 13
expected 13
timeout 15
BeforeClass y AfterClass 16
Pruebas parametrizadas 18
Test Suite 20
Creamos un Java Project llamado Calculadora, donde iremos haciendo pruebas unitarias
para comprobar que la calculadora está bien.
Dentro del proyecto creamos una clase llamada Calculadora y en el paquete calculadora.
A esta clase vamos a darle un poco de funcionalidad
Ejecutamos este código y vemos como la salida por consola es
Esto es una pequeña prueba que nos dice que nuestra calculadora funciona. Hacer las
pruebas manualmente tiene unos inconvenientes. Si cambiamos el código a lo siguiente
Podríamos no percatarnos de ese fallo porque quizas lo tenemos junto a muchas pruebas,
por lo que probar las cosas manualmente no es la mejor práctica.
Ahora vamos a rehacer el código de la clase CalculadoraTest para realizar las pruebas
unitarias.
Ahora le tendremos que decir a JUnit que pruebe si las variables resultado y esperado s on
iguales. Para eso, JUnit me ofrece una serie de funciones que empiezan por “assert”,
llamaremos al assertEquals (el long, ya que se castea bien a entero).
En excepted le pondre el nombre de la variable que contiene el valor esperado (expected) y
en actual le pondré el valor del resultado obtenido(variable resultado)
Esto nos va a venir bien porque podemos tener pruebas hechas y si por ejemplo
cambiamos código parcialmente de vez en cuando, nos podemos dar cuenta que algo ha
fallado.
Before y After
Son dos anotaciones que nos permiten ejecutar código antes y después dentro de una
determinada prueba. Para ello vamos a introducir una serie de cambios en nuestra
calculadora.
Hemos añadido un método constructor y 5 métodos donde todos ellos van a devolver el
valor de ans. Ans será interpretado como ese botón de una calculadora que guarda el último
valor. Por último, hemos añadido un método que nos va a poner ans a 0.
Asserts
Todos los assertions están en la clase Assert (public class Assert extends java.lang.Object)
Esta clase ofrece una serie de métodos assertions, útiles para escribir tests. Solo los
assertions fallidos son grabados.
Algunos de los métodos de la clase Assert más importantes son los siguientes
Ejemplo
Vamos a usar algunos de los métodos mencionados anteriormente en un ejemplo.
Crearemos una clase java llamada TestRunner
Expected y Timeout
La anotación @Test tiene por característica que se le puede pasar un parametro, estos
pueden ser expected y timeout.
expected
Expected es un parámetro que puede usarse para indicar que un método se espera que
tiene una determinada excepción. Así conseguimos que una prueba unitaria falle en el caso
de que no se lance una excepción que se supone debería lanzarse.
¿Pero qué ocurre si hacemos una división de un número entre 0? Que su resultado es
infinito y nos devolverá un error.
Por lo tanto, deberíamos capturar ese error.
Ahora vamos al test, y lo dejamos como estaba antes, con la división entre un número
distinto de 0.
Pero imaginemos que yo quiero hacer una división entre 0. Quiero comprobar que cuando
divido entre 0 se genera un error. Tendremos que diseñar la prueba de la siguiente forma.
Se va a mostrar la excepción.
timeout
Sirve para hacer que una prueba falle, si una prueba se alarga en el tiempo más de lo
normal.
Por lo tanto, detendrá la ejecución si una función tarda “x” tiempo en ejecutarse.
Ejemplo. Tenemos un método que tiene una operación que debe ser óptima.
BeforeClass y AfterClass
Son dos anotaciones que se comportan como @Before y @After, pero que tienen la
particularidad de que se van a ejecutar una sola vez.
@BeforeClass se va a ejecutar antes de cualquier prueba unitaria que se ejecute dentro de
la clase
@AfterClass se va a ejecutar después de cualquier otra prueba que se haya ejecutado
Ejemplo. Siguiendo con nuestra calculadora, podríamos crear un BeforeClass que nos cree
la calculadora y un before que llame al método clear, de este modo la calculadora solo se
inicializa una única vez, no obstante se va a resetear antes de cada prueba para
asegurarnos de que se queda limpia y a la prueba unitaria (test) no le entra nada, es decir,
comienza limpio, no le entran ejecuciones anteriores.
Lo que hemos hecho es crear un método estático llamado beforeClass() con la anotación
@BeforeClass que va a crear una instancia de la clase Calculadora, mientras que el método
before() lo que va a hacer ahora es llamar al método clear() para que cuando comience la
prueba, esta empiece limpia.
Por otro lado, crearemos un método estático llamado afterClass() con su anotación
@AfterClass que simplemente va a imprimir por pantalla un mensaje para que veamos que
solo se ejecuta una única vez. Además, al método after() le vamos a borrar la línea de
código en la que llama al método clear(), ya que no va a hacer falta.
Ahora lo ejecutamos (para que nos funcione hay que eliminar el @Test que teníamos con
timeout llamado testAlgoritmoOptimo).
En la ejecución vemos como todo va bien y en la consola se imprime 1 vez beforeClass y
afterClass.
Con el afterClass() lo que haremos sera que todos los recursos que se hayan cargado en el
before(), los podamos limpiar
Pruebas parametrizadas
Es una forma cómoda para ejecutar pruebas unitarias en las que lo que queremos es
comprobar que para varios valores obtenemos varios resultados.
Imaginemos que queremos comprobar varios casos de la función testSum(). Ahora mismo
tenemos la prueba de sumar 3+2, y queremos comprobar que un número positivo por otro
positivo da como resultado un número positivo, positivo por negativo da negativo, etc, es
decir, voy a tener varios grupos de datos que tengo que probar. Entonces, en vez de estar
utilizando esta prueba varias veces…
...cambiando los valores, puedo utilizar parámetros para darle a JUnit la prueba y los datos
y que JUnit se encargue.
Con esto lo que conseguimos es que a partir de varios parámetros de entrada, podemos
correr de forma mas rapida, muchas más pruebas.
Test Suite
¿Cómo podemos correr una serie de pruebas de forma controlada y en orden?
Y se correrán las pruebas de todas las clases de la forma que crea conveniente
A veces me interesa decirle a JUnit que se corran las clases de forma seguida porque
tienen que ver una con la otra.
Con el asistente de Eclipse se podrá crear un JUnit test suite de forma muy sencilla.
Ejecutamos la clase como si fuera una prueba más.
Se ejecutaran simultáneamente todas las pruebas en el orden en el que se le haya
especificado.
En resumen, el Test Suite se utiliza para agrupar unos cuantos casos de prueba de
unidades y ejecutarlos juntos. En JUnit, tanto las anotaciones @RunWith como @Suite se
utilizan para ejecutar los suite tests.