JUnit: Introducción al Testing

  • Tiempo de lectura:10 minutos de lectura
  • Autor de la entrada:
  • Última modificación de la entrada:14/07/2024

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.

Sigue Aprendiendo JUnit

Si quieres aprender más sobre testing, aquí te dejo mis cursos recomendados para iniciarse:

curso testing software coursera

Curso de Especialización en Testing de Software

Curso de especialización en testing de software ofrecido por la universidad de Minnesota en Coursera. Aprenderás a desarrollar todo tipo de tests efectivos a través de lecciones teóricas y prácticas con herramientas específicas. Se compone de 4 módulos: Introducción al testing, testing de caja negra y blanca y análisis automatizado.

Y si eres más de papel, un buen libro:

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.


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


Deja una respuesta