junitEmpezando con Junit


Observaciones

JUnit es un marco simple para escribir pruebas repetibles para el lenguaje de programación Java . Es una instancia de la arquitectura xUnit para marcos de prueba de unidades.

Las características principales consisten en:

  • Afirmaciones , que le permiten personalizar cómo probar los valores en sus pruebas
  • Corredores de prueba , que le permiten especificar cómo ejecutar las pruebas en su clase
  • Reglas , que le permiten modificar con flexibilidad el comportamiento de las pruebas en su clase
  • Suites , que le permiten construir juntos un conjunto de pruebas de muchas clases diferentes

Extensión útil para JUnit:

Versiones

Versión Fecha de lanzamiento
JUIT 5 Hito 2 2016-07-23
JUIT 5 Hito 1 2016-07-07
JUnit 4.12 2016-04-18
JUnit 4.11 2012-11-14
JUIT 4.10 2011-09-28
JUnit 4.9 2011-08-22
JUnit 4.8 2009-12-01
JUIT 4,7 2009-07-28
JUIT 4,6 2009-04-14

Instalación o configuración

Ya que JUnit es una biblioteca de Java, todo lo que tiene que hacer para instalarla es agregar algunos archivos JAR en la ruta de clases de su proyecto Java y estará listo para comenzar.

Puede descargar estos dos archivos JAR manualmente: junit.jar & hamcrest-core.jar .

Si está utilizando Maven, simplemente puede agregar una dependencia en su pom.xml :

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
  <scope>test</scope>
</dependency>
 

O si está utilizando Gradle, agregue una dependencia en su build.gradle :

apply plugin: 'java'

dependencies {
    testCompile 'junit:junit:4.12'
}
 

Después de esto puedes crear tu primera clase de prueba:

import static org.junit.Assert.assertEquals;

import org.junit.Test;

public class MyTest {
    @Test
    public void onePlusOneShouldBeTwo() {
        int sum = 1 + 1;
        assertEquals(2, sum);
    }
}
 

y ejecutarlo desde la línea de comando:

  • Windows java -cp .;junit-X.YY.jar;hamcrest-core-XYjar org.junit.runner.JUnitCore MyTest
  • Linux o OsX java -cp .:junit-X.YY.jar:hamcrest-core-XYjar org.junit.runner.JUnitCore MyTest

o con Maven: mvn test

@Antes después

Se ejecutará un método anotado con @Before antes de cada ejecución de los métodos @Test . Análogo un @After método anotado es ejecutado después de cada @Test método. Esto se puede usar para establecer repetidamente una configuración de prueba y limpiar después de cada prueba. Así que las pruebas son independientes y el código de preparación no se copia dentro del método @Test .

Ejemplo:

import static org.junit.Assert.assertEquals;

import java.util.ArrayList;
import java.util.List;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class DemoTest {

    private List<Integer> list;

    @Before
    public void setUp() {
        list = new ArrayList<>();
        list.add(3);
        list.add(1);
        list.add(4);
        list.add(1);
        list.add(5);
        list.add(9);
    }

    @After
    public void tearDown() {
        list.clear();
    }

    @Test
    public void shouldBeOkToAlterTestData() {
        list.remove(0); // Remove first element of list.
        assertEquals(5, list.size()); // Size is down to five
    }

    @Test
    public void shouldBeIndependentOfOtherTests() {
        assertEquals(6, list.size());
    }
}
 

Los métodos anotados con @Before o @After deben ser public void y con cero argumentos.

Ejemplo de prueba de unidad básica

Este ejemplo es una configuración básica para unittesting StringBuilder.toString () usando junit.

import static org.junit.Assert.assertEquals;

import org.junit.Test;

public class StringBuilderTest {

    @Test
    public void stringBuilderAppendShouldConcatinate()  {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("String");
        stringBuilder.append("Builder");
        stringBuilder.append("Test");

        assertEquals("StringBuilderTest", stringBuilder.toString());
    }

}
 

Atrapa la excepción esperada

Es posible atrapar fácilmente la excepción sin ningún bloque try catch .

public class ListTest {
  private final List<Object> list = new ArrayList<>();

  @Test(expected = IndexOutOfBoundsException.class)
  public void testIndexOutOfBoundsException() {
    list.get(0);
  }
}
 

El ejemplo anterior debería ser suficiente para casos más simples, cuando no desea o necesita verificar el mensaje transmitido por la excepción lanzada.

Si desea verificar la información sobre la excepción, puede usar el bloque try / catch:

@Test
public void testIndexOutOfBoundsException() {
    try {
        list.get(0);
        Assert.fail("Should throw IndexOutOfBoundException");
    } catch (IndexOutOfBoundsException ex) {
        Assert.assertEquals("Index: 0, Size: 0", ex.getMessage());
    }
}
 

Para este ejemplo, debe tener en cuenta que siempre debe agregar Assert.fail() para asegurarse de que la prueba no se Assert.fail() cuando no se lance una excepción.

Para casos más elaborados, JUnit tiene la ExpectedException @Rule , que también puede probar esta información y se utiliza de la siguiente manera:

public class SimpleExpectedExceptionTest {
     @Rule
     public ExpectedException expectedException = ExpectedException.none();

     @Test
     public void throwsNothing() {
         // no exception expected, none thrown: passes.
     }

     @Test
     public void throwsExceptionWithSpecificType() {
         expectedException.expect(NullPointerException.class);

         throw new NullPointerException();
     }

     @Test
     public void throwsExceptionWithSpecificTypeAndMessage() {
         expectedException.expect(IllegalArgumentException.class);
         expectedException.expectMessage("Wanted a donut.");

         throw new IllegalArgumentException("Wanted a donut.");
     }
}
 

Pruebas de excepciones en JUnit5

Para lograr lo mismo en JUnit 5, utiliza un mecanismo completamente nuevo :

El metodo probado

public class Calculator {
    public double divide(double a, double b) {
        if (b == 0.0) {
            throw new IllegalArgumentException("Divider must not be 0");
        }
        return a/b;
    }
}
 

El metodo de prueba

public class CalculatorTest {
    @Test
    void triangularMinus5() { // The test method does not have to be public in JUnit5
        Calculator calc = new Calculator();

        IllegalArgumentException thrown = assertThrows(
            IllegalArgumentException.class, 
            () -> calculator.divide(42.0, 0.0));
        // If the exception has not been thrown, the above test has failed.

        // And now you may further inspect the returned exception...
        // ...e.g. like this:
        assertEquals("Divider must not be 0", thrown.getMessage());
}
 

Ignorando las pruebas

Para ignorar una prueba, simplemente agregue la anotación @Ignore a la prueba y, opcionalmente, proporcione un parámetro a la anotación con el motivo.

@Ignore("Calculator add not implemented yet.")
@Test
public void testPlus() {
    assertEquals(5, calculator.add(2,3));
}
 

En comparación con comentar la prueba o eliminar la anotación @Test , el corredor de la prueba seguirá informando esta prueba y notará que se ignoró.

También es posible ignorar un caso de prueba condicionalmente utilizando supuestos de JUnit. Un ejemplo de caso de uso sería ejecutar el caso de prueba solo después de que un desarrollador arregle un determinado error. Ejemplo:

import org.junit.Assume;
import org.junit.Assert;
...

@Test 
public void testForBug1234() {

    Assume.assumeTrue(isBugFixed(1234));//will not run this test until the bug 1234 is fixed

    Assert.assertEquals(5, calculator.add(2,3));
}
 

El corredor predeterminado trata las pruebas con suposiciones fallidas como ignoradas. Es posible que otros corredores se comporten de manera diferente, por ejemplo, trátelos como pasados.

JUnit - Ejemplos básicos de anotación.

Aquí hay algunas anotaciones básicas de JUnit que debes entender:

@BeforeClass – Run once before any of the test methods in the class, public static void 
@AfterClass – Run once after all the tests in the class has been run, public static void
@Before – Run before @Test, public void
@After – Run after @Test, public void
@Test – This is the test method to run, public void