Testeando con JUnit

La forma más eficiente de escribir tests es hacerlo antes de escribir el código, y este enfoque es lo que se conoce como Test-Driven Development (TDD), escribir un test o serie de tests antes de empezar el desarrollo de una nueva feature, da al desarrollador un objetivo claro de qué desarrollar. Conocido como "red then green", esta filosofía indica que antes del desarrollo de esa nueva funcionalidad, todos los test fallarán, y al terminar todos pasarán.

Dentro de todos los tipos de pruebas a los que podemos someter nuestro código, las pruebas unitarias son la más básicas y utilizadas.

Pruebas Unitarias/Unit Tests

Son los tests más básicos y de más bajo nivel, que sirven para chequear un componente en particular de la aplicación, como por ejemplo chequear que un método de nuestro código maneja adecuadamente los datos que se le pasan como parámetros, o que el estado de un objeto se actualiza correctamente después de que el método de actualización se haya invocado. Unit Tests no chequea User Stories, sino los pasos individuales.

JUnit es la librería estandar de Java para ejecutar las pruebas unitarias. Si tenemos nuestro codigo en /src/main/java/example.java es común que la ubicación para nuestras pruebas unitarias de ese código se ubiquen en /src/test/java/exampleTests.java

Una prueba unitaria no es más que un método en una clase con la anotación @Test y que contiene asserts (aserciones). Estos métodos son siempre públicos y devuelven void. Ejemplo:

Ningún test deberá depender de otro test para poder ser probado! Esto no sólo es una buena práctica sino que desconocemos el orden en el que se ejecutarán las pruebas unitarias.

Si muchos test comparten la misma funcionalidad siempre se puede añadir un método no de pruebas a la clase a modo de helper.

A veces un conjunto de variables u objetos necesitan ser utilizados por nuestras pruebas unitarias, y podemos necesitar entonces preinicializarlos o limpiarlos después de terminar con nuestras pruebas. Para este proposito, JUNit dispone de unas anotaciones especiales de método que nos permitirán ejecutar métodos antes y depués de nuestras pruebas:

@BeforeAll @BeforeEach @Test @AfterEach @AfterAll
Ejemplo de un fichero de pruebas unitarias:

public class ExampleTests { private List testList; public ExampleTests() { } @BeforeEach public void beforeEach() { this.testList = new ArrayList(); this.testList.add(1); this.testList.add(2); this.testList.add(3); } @AfterEach public void afterEach() { this.testList = null; } @Test public void testAddZero() { int a = 10; int b = 0; int c = a + b; Assertions.assertEquals(a, c); } @Test public void testDivideZero() { int a = 10; int b = 0; Assertions.assertThrows(ArithmeticException.class, () -> { int var10000 = a / b; }); } @Test public void testListContains() { Assertions.assertTrue(this.testList.contains(1)); this.testList.remove(0); Assertions.assertFalse(this.testList.contains(1)); } }
JUnit puede ser lanzado desde la consola o desde casi cualquier IDE. La ventaja de hacerlo con el IDE es que podemos debuggear si queremos la ejecución de los test, no es realmente interesante pero se puede hacer. Lo que si que es interesantísimo es que podemos visualizar que partes del código fueron testeadas y cuantas veces.
Documentación oficial con todas las anotaciones posibles, ejemplos y aserciones disponibles:

https://junit.org/junit5/docs/current/user-guide/ https://junit.org/junit5/docs/5.0.1/api/org/junit/jupiter/api/Assertions.html

Comentarios

Entradas populares de este blog

Django REST framework

Envío de checkboxes o selector multiple por AJAX con jQuery

Django: relaciones polimórficas