Ir al contenido principal

Pruebas unitarias con JUnit

JUnit es un conjunto de bibliotecas que nos permiten escribir y ejecutar pruebas unitarias para Java.

Las pruebas unitarias nos sirven para comprobar el funcionamiento de nuestro código. Éstas nos permiten asegurar la robustez del código, preever futuros errores, corregir errores en caso de haberlos. Pueden ser manuales o automatizadas en el despliegue.

Estas pruebas se ejecutan en el tiempo de compilación y se aseguran de que los componentes individuales de la aplicación funcionen correctamente.

También existen alternativas para crear pruebas unitarias y son:

  1. Pruebas integración con Arquillian: Arquillian es un marco de pruebas de integración que permite realizar pruebas integradas de la aplicación en un entorno de ejecución en vivo. Esto permite verificar la integración de los componentes de la aplicación y asegurarse de que funcionen correctamente juntos.

  2. Pruebas de rendimiento con Gatling: Gatling es una herramienta de pruebas de rendimiento que permite medir el rendimiento de la aplicación en diferentes escenarios de carga. Esto ayuda a identificar cuellos de botella y a mejorar la escalabilidad de la aplicación.

  3. Pruebas de aceptación con Cucumber: Cucumber es un marco de pruebas de aceptación que permite escribir pruebas de aceptación en un lenguaje fácil de entender y ejecutarlas automáticamente. Esto ayuda a asegurarse de que la aplicación cumpla con los requisitos funcionales especificados.

JUnit se compone de:

  1. JUnit Platform (el núcleo): el que ejecuta las pruebas unitarias.
  2. JUnit Jupiter: donde escribimos nuestras pruebas unitarias  
  3. JUnit Vintage:como JUnit Jupiter, pero ya obsoleto.

Se puede integrar con otros frameworks de pruebas(como Mockito).

Algunas anotaciones de JUnit Jupiter:

  • @Test. 
  • @DisplayName. 
  • @Tag. 
  • @BeforeEach. 
  • @AfterEach. 
  • @BeforeAll. 
  • @AfterAll. 
  • @Disable. 
  • @Nested. 
  • @ExtendWith.

Generamos un proyecto Maven con este comando y seguimos el modo interactivo. Para después ubicarnos en el directorio del proyecto creado

$ mvn archetype:generate
$ cd proyecto-maven

Supongamos que tenemos una clase como esta:

Main.java

package com.inforhomex.app;

public class Main{
  public static int sumaInt(int a, int b){
      return a + b;
  }
}

En esta clase tenemos un método estático que suma dos números enteros. Para poder probar nuestro código usando JUnit debemos tener estas dependencias en nuestro proyecto (estamos usando Maven):

pom.xml

 <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-api</artifactId>
      <scope>test</scope>
    </dependency>
    
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-params</artifactId>
      <scope>test</scope>
    </dependency>

Ahora nos ubicamos en la carpeta de tests. Veremos una clase ``MainTest.java`` (puedes renombrar las clases como te parezca). Esta clase nos servirá para probar el método estático de suma de la clase principal del programa. Importamos la clase y creamos un test que falle (rojo en TDD).

package com.inforhomex.app;

import static org.junit.jupiter.api.Assertions.assertTrue;

import org.junit.jupiter.api.Test;
import com.inforhomex.app.Main;

public class MainTest {

    @Test
    public void testSumaIntFail() {
        int a = 43;
        int b = 56;
        int suma = Main.sumaInt(a, b);
        assertTrue(suma == 990);
    }
}

La anotación @Test nos permite crear una prueba. El método assertTrue evalua que una expresión o valor booleano que puede devolver falso o verdadero. En este test queremos que falle. Por lo que al ejecutar la prueba veremos el error.

Probemos el test:

$ mvn clean test

Si todo fue "correcto", la prueba fallará. Pues el resultado de la suma no concuerda el valor que evaluamos. Ahora escribimos un método que pase la prueba (verde en TDD).

MainTest.java

package com.inforhomex.app;

import static org.junit.jupiter.api.Assertions.assertTrue;
import org.junit.jupiter.api.Test;
import com.inforhomex.app.Main;

public class MainTest {

    @Test
    public void testSumaInt() {
        int a = 43;
        int b = 56;
        int suma = Main.sumaInt(a, b);
        assertTrue(suma == 99);
    }
}

Al ejecutar la prueba dará como válido el resultado. Pues el valor de la suma (99) es igual al valor que colocamos en la expresión (99).

Probemos con un método estático para "formatear" una fecha de la forma YYYY-mm-dd a este otra forma YYYY/mm/dd.

Main.java

package com.inforhomex.app;

import java.time.LocalDate;

public class Main {
    public static void main(String[] args) {
        System.out.println("Hola, mundo");
    }

    public static String formatDate(String fecha){
        String fechaFormato = null;
        LocalDate hoy = LocalDate.now();
        fechaFormato = hoy.toString().replaceAll("-","/");
        return fechaFormato;
    }
}

Ahora la clase tipo Test donde escribimos dos test, uno que falle y el otro que pase. Ocuparemos el método assertEquals para evaluar si dos objetos son iguales o no.

MainTest.java

package com.inforhomex.app;

import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
import com.inforhomex.app.Main;

public class MainTest {

 
    @Test 
    public void testFormatDate(){
        String fecha = "2025-10-04";
        String nuevaFecha = Main.formatDate(fecha);
        assertEquals(nuevaFecha, "2025/10/04");
    }


     @Test 
    public void testFormatDateFail(){
        String fecha = "2025-10-04";
        String nuevaFecha = Main.formatDate(fecha);
        assertEquals(nuevaFecha, "2025-10-04");
    }

   
}

Ejecutamos el test:

$ mvn clean test

Nos dará como resultado un test exitoso y uno fallido.

¡Hemos hecho nuestras pruebas unitarias con JUnit!

Más sobre este tema en próximas entregas.

Enlaces:

https://junit.org/
https://code.visualstudio.com/docs/java/java-testing
https://medium.com/@sharmapraveen91/deep-dive-into-junit-5-and-mockito-annotations-and-use-cases-3b170698f1b2


Comentarios

Entradas populares de este blog

Programación Windows Batch (CMD) parte 3

Crear ciclos para efectuar operaciones tediosas nos ahorrará tiempo para realizar otras tareas. En está ocasión veremos ciclos con FOR . ¿Cuál es la síntaxis de bucle FOR en Windows Batch? Si está dentro de un archivo *.bat : FOR %%variable IN (seq) DO operaciones Si lo ejecutamos en una terminal: FOR %variable IN (seq) DO operaciones Ejemplo 1 . Recorrer una secuencia de números del 0 al 5: recorrer.bat @ echo off FOR %%i in ( 0 1 2 3 4 5 ) DO echo Hola no. %%i pause Nos imprimirá en pantalla: Hola no. 0 Hola no. 1 Hola no. 2 Hola no. 3 Hola no. 4 Hola no. 5 ¿Puedo usar contadores? Si, se pueden usar. Ejemplo 2 . Uso de contadores: contador.bat @ echo off set numeros = 1 2 3 4 5 6 7 8 9 10 set cont = 0 for %%a in ( %numeros% ) do ( echo Hola no. %%a :: Contador set /a cont+ = 1 ) echo Total: %cont% Este código nos imprimirá, además de los mensajes Hola no. 0 ..., el total de valores conta...

TIOBE index 2024

El índice TIOBE (o índice de la comunidad de programación TIOBE) mide la popularidad de los lenguajes de programación. Su índice no se basa en qué lenguaje de programación es mejor, si tiene mejor perfomance, si posee escalabilidad, si es más sencillo de aprender, de usar, de implementar, etc. Sólo se basa en la popularidad. En el número de referencias ya sea en blogs, foros de consulta, etc. No necesariamente si las empresas lo están usando en alguno de sus desarrollos. Este índice es útil para darse una idea qué lenguaje está cobrando más popularidad y prestigio. Enseguida una tabla con los primeros 5 lenguajes más populares. Índice de Noviembre 2024   Nov 2024  Nov 2023  Change  Programming Language  Ratings  Change  1  1    Python  22.85%  +8.69%  2  3  +  C++  10.64%  +0.29%  3  4  +  Java  9.60%  +1.26%  4 ...

Programación Windows Batch (CMD) parte 4

Siguiendo con la serie de post sobre programación ( 1 , 2 , y 3 ) batch ahora veremos algunas cosas como operaciones aritméticas, operadores lógicos  y uso de ficheros. Cuando somos administradores de servidores o desarrolladores muchas veces tenemos que realizar tareas que nos quitan, relativamente, tiempo valioso que podríamos ocupar para otras cosas (como ver nuestro Facebook, jeje, broma).  Aprender a escribir scripts que nos faciliten algunas tareas siempre es útil. Por ejemplo, conocer todas las características técnicas de nuestro equipo de cómputo nos servirá cuando se realiza peritajes informáticos y soporte al equipo. Realizar respaldos automáticos a nuestras carpetas , archivos y directorios será más sencillo gracias a un script. Pero antes debemos aprender lo básico de la programación en batch. Ejemplo 1. Operaciones aritméticas básicas. aritmetica.bat @ echo off ::Nombre del archivo, imprimirá: aritmetica.bat echo %0 :: Set nos servirá para a...