JUnit: Introducción al testing

Última actualización: 11/10/2020

El testing es una práctica fundamental en el desarrollo de software, ya que permite reducir los errores y los bugs introducidos en los programas. En esta entrada realizamos una introducción al testing con JUnit.

Testing con JUnit

Vamos a explorar el papel que juega JUnit en el desarrollo de tests para java y cómo la automatización de tests se ha convertido en esencial para los desarrolladores de software.

¿Qué son los tests?

Cuando escribimos código necesitamos saber si el programa se está comportando de la manera en la que queremos. En el caso de que no sea así, podemos decir que el resultado es incorrecto, y que por lo tanto no cumple con la especificación y los requisitos iniciales.

Para determinar si el programa cumple con los requisitos se diseñan tests. Los tests son los componentes que verifican que el software se ajusta a la especificación.

La práctica más común en testing es la denominada de “caja negra“. En este caso se trata la implementación interna de la aplicación como algo que se desconoce, y simplemente se verifica que unas entradas determinadas producen el resultado esperado.

Tests de caja negra
Tests de caja negra

Cada test de este tipo sobre un componente del sistema se denomina test unitario. Existen otros tipos de tests encargados de verificar la interacción entre componentes del sistema llamados tests de integración. Por último, existen tests sobre el sistema en su totalidad llamados tests de sistema.

Los tests unitarios ofrecen numerosas ventajas:

  • Sirven como documentación: describen el comportamiento esperado de cada componente.
  • Aumentan la reusabilidad del código: para implementar tests unitarios, el software debe estar dividido en componentes y ser modular.
  • Facilitan los cambios en el código y determinar su impacto.

Automatización de tests

En la práctica, cada vez que se introduce un cambio en el código de una aplicación, resulta conveniente realizar toda una serie de tests para comprobar que el cambio no ha introducido defectos en las funcionalidades ya implementadas.

Este tipo de bugs se denominan “regressions“. Para reducir su número, cada vez que se recompila la aplicación se vuelven a ejecutar (de forma automática) todos los tests implementados para el programa hasta ese momento.

Los tests automáticos se implementan al igual que una aplicación, sin embargo su función es comprobar que el software cumple unos requisitos determinados. Son código que prueba el funcionamiento de otro código. Entre los frameworks más usados para implementar tests se encuentra JUnit.

Introducción al testing con JUnit

En un proyecto Java, es habitual usar gradle o maven como gestor de dependencias. Para tener disponible JUnit, bastaría con introducir la siguiente dependencia:

testImplementation('org.junit.jupiter:junit-jupiter:5.5.2')

Y en Maven:

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>5.5.2</version>
    <scope>test</scope>
</dependency>

Una vez que tenemos disponible el framework JUnit en nuestro proyecto Java, podemos proceder a escribir los tests. Para este ejemplo, vamos a considerar la clase “Calculadora” como el componente de código sobre el que implementar los tests.

Vamos a analizar el siguiente caso como un test sencillo sobre esta clase:

import static org.junit.jupiter.api.Assertions.assertEquals;
import example.util.Calculadora;
import org.junit.jupiter.api.Test;

class MyFirstJUnitJupiterTests {
    private final Calculadora calculator = new Calculadora();
    @Test
    void addition() {
        assertEquals(2, calculator.add(1, 1));
    }
}

En este ejemplo, se está probando la función “add” de la clase Calculadora. Cada uno de los tests comienza con una anotación java: @Test.

En el método addition(), que implementa el test, se usa la “assertEquals“. Un Assert es una sentencia que esperamos que sea cierta en un punto de la ejecución del código. En nuestro caso, esto significa que esperamos que el primer parámetro (2) y el segundo parámetro (calculator.add(1, 1)) sean iguales.

Si la aserción evalúa a True, el test pasa, si evalúa False, el test falla. Junit incorpora muchos tipos de asserts. Entre los más usados se encuentran assertTrue, assertFalse, assertNull, etc. Es posible tener más de un assert en cada test.

En entradas posteriores, exploraremos JUnit con más profundidad, realizaremos una introducción a los mocks de dependencias externas y aprenderemos a abstraer la lógica de inicialización de nuestros tests.

Preguntas frecuentes – FAQ

¿Para qué se usa JUnit?

JUnit es un framework open source usado para implementar tests unitarios en Java. Nos proporciona herramientas como aserciones y anotaciones para integrarlo en nuestro desarrollo.

¿Para qué valen los tests unitarios?

Los tests unitarios permiten validar el funcionamiento de funciones y métodos individuales y comprobar que se ajusta a la especificación. Tienen muchos beneficios adicionales, como facilitar los cambios posteriores en el software sin introducir nuevos errores.

¿Qué son los tests de caja negra?

Los tests de caja negra tratan la implementación interna de la aplicación como algo desconocido, simplemente verifican que unas entradas determinadas producen el resultado que se espera.


Si quieres aprender más sobre testing, ¡aquí te dejo un buen libro recomendado!


A continuación el vídeo-resumen. ¡No te lo pierdas!


¡Echa un ojo a mi lista de reproducción de Big Data en Youtube!

Si te ayuda el contenido del blog, por favor considera unirte a la lista de correo para reconocer el trabajo!

Deja una respuesta