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
:
Escribiendo tu Primera Prueba
Vamos a escribir una prueba simple para una clase Calculadora
que tiene un método sumar
.
Clase Calculadora
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 a5
.
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
- Introducción a Java
- Configuración del Entorno de Desarrollo
- Sintaxis y Estructura Básica
- Variables y Tipos de Datos
- Operadores
Módulo 2: Flujo de Control
Módulo 3: Programación Orientada a Objetos
- Introducción a la POO
- Clases y Objetos
- Métodos
- Constructores
- Herencia
- Polimorfismo
- Encapsulamiento
- Abstracción
Módulo 4: Programación Orientada a Objetos Avanzada
Módulo 5: Estructuras de Datos y Colecciones
Módulo 6: Manejo de Excepciones
- Introducción a las Excepciones
- Bloque Try-Catch
- Throw y Throws
- Excepciones Personalizadas
- Bloque Finally
Módulo 7: Entrada/Salida de Archivos
- Lectura de Archivos
- Escritura de Archivos
- Flujos de Archivos
- BufferedReader y BufferedWriter
- Serialización
Módulo 8: Multihilo y Concurrencia
- Introducción al Multihilo
- Creación de Hilos
- Ciclo de Vida de un Hilo
- Sincronización
- Utilidades de Concurrencia
Módulo 9: Redes
- Introducción a las Redes
- Sockets
- ServerSocket
- DatagramSocket y DatagramPacket
- URL y HttpURLConnection