Consulta de la Librería JUnit - ProgOrientadaObjetos-P-AA2020/tarea-consulta-semana05-2bim-HernanSan GitHub Wiki

Introducción JUnit

Cuando probamos un programa, lo ejecutamos con unos datos de entrada (casos de prueba) para verificar que el funcionamiento cumple los requisitos esperados. Definimos prueba unitaria como la prueba de uno de los módulos que componen un programa.

Los casos de prueba son clases o módulos que disponen de métodos para probar los métodos de una clase o módulo concreta/o. Así, para cada clase que quisiéramos probar definiríamos su correspondiente clase de caso de prueba. Mediante las suites podemos organizar los casos de prueba, de forma que cada suite agrupa los casos de prueba de módulos que están funcionalmente relacionados.

Las pruebas que se van construyendo se estructuran así en forma de árbol, de modo que las hojas son los casos de prueba, y podemos ejecutar cualquier subárbol (suite).

De esta forma, construimos programas que sirven para probar nuestros módulos, y que podremos ejecutar de forma automática. A medida que la aplicación vaya avanzando, se dispondrá de un conjunto importante de casos de prueba, que servirá para hacer pruebas de regresión. Eso es importante, puesto que cuando cambiamos un módulo que ya ha sido probado, el cambio puede haber afectado a otros módulos, y sería necesario volver a ejecutar las pruebas para verificar que todo sigue funcionando.

Implementación de los casos de prueba

Para implementar las pruebas en JUnit utilizaremos dos elementos básicos:

  • Por un lado, marcaremos con la anotación @Test los métodos que queramos que JUnit ejecute. Estos serán los métodos en los que implementemos nuestras pruebas. En estos métodos llamaremos al método probado y comprobaremos si el resultado obtenido es igual al esperado.

  • Para comprobar si el resultado obtenido coincide con el esperado utilizaremos los métodos assert de la librería JUnit. Estos son una serie de métodos estáticos de la clase Assert (para simplificar el código podríamos hacer un import estático de dicha clase), todos ellos con el prefijo assert-. Existen multitud de variantes de estos métodos, según el tipo de datos que estemos comprobando (assertTrue, assertFalse, assertEquals, assertNull, etc). Las llamadas a estos métodos servirán para que JUnit sepa qué pruebas han tenido éxito y cuáles no.

Cuando ejecutemos nuestras pruebas con JUnit, se nos mostrará un informe con el número de pruebas éxitosas y fallidas, y un detalle desglosado por casos de prueba. Para los casos de prueba que hayan fallado, nos indicará además el valor que se ha obtenido y el que se esperaba.

Además de estos elementos básicos anteriores, a la hora de implementar las pruebas con JUnit deberemos seguir una serie de buenas prácticas que se detallan a continuación:

  • La clase de pruebas se llamará igual que la clase a probar, pero con el sufijo -Test.

  • Los métodos de prueba (los que están anotados con @Test), tendrán como nombre el mismo nombre que el del método probado, pero con prefijo test-.

  • Aunque dentro de un método de prueba podemos poner tantos assert como queramos, es recomendable crear un método de prueba diferente por cada caso de prueba que tengamos.

Ejemplo

package example;

public class MiClase {

public int numero_mayor(int a, int b, int c) {

    if (a > b && a > c) {

        return a;

    } else if (c > b) {

        return c;

    } else {

        return b;

    }

}

}

@Test

2 public void testNumero_mayor() {

3 System.out.println("numero_mayor");

4 int a = 0;

5 int b = 0;

6 int c = 0;

7 MiClase instance = new MiClase();

8 int expResult = 0;

9 int result = instance.numero_mayor(a, b, c);

10 assertEquals(expResult, result);

11 // TODO review the generated test code and remove the default call to fail.

12 fail("The test case is a prototype.");

13 }

@Test public void testNumero_mayor_caso1() {

    int a = 5;

    int b = 3;

    int c = 7;

    MiClase instance = new MiClase();

    int expResult = 7;

    int result = instance.numero_mayor(a, b, c);

    assertEquals(expResult, result);        

}



@Test

public void testNumero_mayor_caso2() {        

    int a = 5;

    int b = 3;

    int c = 4;

    MiClase instance = new MiClase();

    int expResult = 5;

    int result = instance.numero_mayor(a, b, c);

    assertEquals(expResult, result);        

}

@Test

public void testNumero_mayor_caso3() {        

    int a = 5;

    int b = 7;

    int c = 6;

    MiClase instance = new MiClase();

    int expResult = 7;

    int result = instance.numero_mayor(a, b, c);

    assertEquals(expResult, result);        

}

@Test

public void testNumero_mayor_caso4() {        

    int a = 5;

    int b = 7;

    int c = 9;

    MiClase instance = new MiClase();

    int expResult = 9;

    int result = instance.numero_mayor(a, b, c);

    assertEquals(expResult, result);       

}