JUnit es un marco de pruebas unitarias para el lenguaje de programación Java. Es una herramienta esencial para los desarrolladores de Java, ya que permite escribir y ejecutar pruebas automatizadas para asegurar que el código funcione correctamente. En esta sección, aprenderás a configurar y utilizar JUnit para escribir pruebas unitarias efectivas.

Contenido

Introducción a JUnit

JUnit es un marco de pruebas unitarias que permite a los desarrolladores de Java escribir y ejecutar pruebas automatizadas. Las pruebas unitarias son pequeñas pruebas que verifican el comportamiento de una unidad de código, como un método o una clase. JUnit facilita la creación de estas pruebas y su integración en el ciclo de desarrollo.

Beneficios de Usar JUnit

  • Automatización de Pruebas: Permite ejecutar pruebas automáticamente, lo que ahorra tiempo y reduce errores humanos.
  • Detección Temprana de Errores: Ayuda a identificar errores en el código de manera temprana, antes de que se conviertan en problemas mayores.
  • Documentación del Código: Las pruebas actúan como documentación adicional, mostrando cómo se espera que funcione el código.
  • Refactorización Segura: Facilita la refactorización del código, ya que las pruebas aseguran que el comportamiento del código no cambie inesperadamente.

Configuración de JUnit

Para comenzar a usar JUnit, primero necesitas agregar la biblioteca JUnit a tu proyecto. Aquí te mostramos cómo hacerlo utilizando Maven y Gradle.

Usando Maven

Agrega la siguiente dependencia a tu archivo pom.xml:

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

Usando Gradle

Agrega la siguiente dependencia a tu archivo build.gradle:

dependencies {
    testImplementation 'junit:junit:4.13.2'
}

Escribiendo tu Primera Prueba

Vamos a escribir una prueba simple para una clase Calculadora que tiene un método sumar.

Clase Calculadora

public class Calculadora {
    public int sumar(int a, int b) {
        return a + b;
    }
}

Clase de Prueba

import org.junit.Test;
import static org.junit.Assert.assertEquals;

public class CalculadoraTest {

    @Test
    public void testSumar() {
        Calculadora calculadora = new Calculadora();
        int resultado = calculadora.sumar(2, 3);
        assertEquals(5, resultado);
    }
}

Explicación del Código

  • @Test: Indica que el método testSumar es una prueba que debe ser ejecutada por JUnit.
  • assertEquals: Verifica que el resultado de calculadora.sumar(2, 3) sea igual a 5.

Anotaciones en JUnit

JUnit proporciona varias anotaciones para gestionar el ciclo de vida de las pruebas.

Anotaciones Comunes

  • @Test: Marca un método como una prueba.
  • @Before: Ejecuta un método antes de cada prueba.
  • @After: Ejecuta un método después de cada prueba.
  • @BeforeClass: Ejecuta un método una vez antes de todas las pruebas en la clase.
  • @AfterClass: Ejecuta un método una vez después de todas las pruebas en la clase.

Ejemplo de Uso de Anotaciones

import org.junit.*;

public class CalculadoraTest {

    private Calculadora calculadora;

    @Before
    public void setUp() {
        calculadora = new Calculadora();
    }

    @Test
    public void testSumar() {
        int resultado = calculadora.sumar(2, 3);
        assertEquals(5, resultado);
    }

    @After
    public void tearDown() {
        calculadora = null;
    }
}

Aserciones

Las aserciones son métodos que verifican si una condición es verdadera. Si la condición es falsa, la prueba falla.

Aserciones Comunes

  • assertEquals(expected, actual): Verifica que dos valores sean iguales.
  • assertTrue(condition): Verifica que una condición sea verdadera.
  • assertFalse(condition): Verifica que una condición sea falsa.
  • assertNotNull(object): Verifica que un objeto no sea nulo.
  • assertNull(object): Verifica que un objeto sea nulo.

Ejemplo de Aserciones

import org.junit.Test;
import static org.junit.Assert.*;

public class AsercionesTest {

    @Test
    public void testAserciones() {
        String str = "JUnit";
        assertEquals("JUnit", str);
        assertTrue(5 > 3);
        assertFalse(5 < 3);
        assertNotNull(str);
        assertNull(null);
    }
}

Pruebas Parametrizadas

Las pruebas parametrizadas permiten ejecutar una prueba varias veces con diferentes valores.

Ejemplo de Prueba Parametrizada

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

import java.util.Arrays;
import java.util.Collection;

import static org.junit.Assert.assertEquals;

@RunWith(Parameterized.class)
public class PruebaParametrizadaTest {

    private int input1;
    private int input2;
    private int expected;

    public PruebaParametrizadaTest(int input1, int input2, int expected) {
        this.input1 = input1;
        this.input2 = input2;
        this.expected = expected;
    }

    @Parameterized.Parameters
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][]{
            {1, 1, 2},
            {2, 3, 5},
            {3, 3, 6}
        });
    }

    @Test
    public void testSumar() {
        Calculadora calculadora = new Calculadora();
        assertEquals(expected, calculadora.sumar(input1, input2));
    }
}

Ejercicios Prácticos

Ejercicio 1: Prueba de Multiplicación

Crea una clase Calculadora con un método multiplicar y escribe una prueba unitaria para verificar su funcionamiento.

Ejercicio 2: Prueba de División

Crea una prueba unitaria para un método dividir en la clase Calculadora. Asegúrate de manejar la división por cero.

Ejercicio 3: Pruebas Parametrizadas

Escribe una prueba parametrizada para el método restar en la clase Calculadora.

Soluciones

Solución Ejercicio 1

public class Calculadora {
    public int multiplicar(int a, int b) {
        return a * b;
    }
}

import org.junit.Test;
import static org.junit.Assert.assertEquals;

public class CalculadoraTest {

    @Test
    public void testMultiplicar() {
        Calculadora calculadora = new Calculadora();
        int resultado = calculadora.multiplicar(2, 3);
        assertEquals(6, resultado);
    }
}

Solución Ejercicio 2

public class Calculadora {
    public int dividir(int a, int b) {
        if (b == 0) {
            throw new IllegalArgumentException("División por cero");
        }
        return a / b;
    }
}

import org.junit.Test;
import static org.junit.Assert.*;

public class CalculadoraTest {

    @Test
    public void testDividir() {
        Calculadora calculadora = new Calculadora();
        int resultado = calculadora.dividir(6, 3);
        assertEquals(2, resultado);
    }

    @Test(expected = IllegalArgumentException.class)
    public void testDividirPorCero() {
        Calculadora calculadora = new Calculadora();
        calculadora.dividir(6, 0);
    }
}

Solución Ejercicio 3

public class Calculadora {
    public int restar(int a, int b) {
        return a - b;
    }
}

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

import java.util.Arrays;
import java.util.Collection;

import static org.junit.Assert.assertEquals;

@RunWith(Parameterized.class)
public class PruebaParametrizadaTest {

    private int input1;
    private int input2;
    private int expected;

    public PruebaParametrizadaTest(int input1, int input2, int expected) {
        this.input1 = input1;
        this.input2 = input2;
        this.expected = expected;
    }

    @Parameterized.Parameters
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][]{
            {5, 3, 2},
            {10, 5, 5},
            {7, 2, 5}
        });
    }

    @Test
    public void testRestar() {
        Calculadora calculadora = new Calculadora();
        assertEquals(expected, calculadora.restar(input1, input2));
    }
}

Conclusión

En esta sección, hemos aprendido a configurar y utilizar JUnit para escribir pruebas unitarias en Java. Hemos cubierto desde la configuración inicial hasta la creación de pruebas parametrizadas. Las pruebas unitarias son una herramienta poderosa para asegurar la calidad del código y facilitar el desarrollo ágil. En el próximo módulo, exploraremos cómo manejar excepciones en Java.

Curso de Programación en Java

Módulo 1: Introducción a Java

Módulo 2: Flujo de Control

Módulo 3: Programación Orientada a Objetos

Módulo 4: Programación Orientada a Objetos Avanzada

Módulo 5: Estructuras de Datos y Colecciones

Módulo 6: Manejo de Excepciones

Módulo 7: Entrada/Salida de Archivos

Módulo 8: Multihilo y Concurrencia

Módulo 9: Redes

Módulo 10: Temas Avanzados

Módulo 11: Frameworks y Librerías de Java

Módulo 12: Construcción de Aplicaciones del Mundo Real

© Copyright 2024. Todos los derechos reservados