# JUnit 5 – Conceptos básicos --- ## 1. Anotaciones esenciales de JUnit 5 JUnit 5 usa anotaciones para indicar qué métodos son tests y cómo preparar o limpiar el entorno. | Anotación | Cuándo se ejecuta | Para qué sirve | |---|---|---| | `@Test` | En cada test | Marca un método como test | | `@BeforeEach` | Antes de cada test | Preparar el estado común (crear objetos, etc.) | | `@AfterEach` | Después de cada test | Limpiar recursos (cerrar conexiones, etc.) | | `@BeforeAll` | Una vez antes de todos | Inicializar recursos costosos (se ejecuta una sola vez) | | `@AfterAll` | Una vez después de todos | Liberar recursos globales | > **Nota:** Los métodos `@BeforeAll` y `@AfterAll` deben ser `static`. ### Ejemplo ```java class AlumnoServiceTest { private AlumnoService service; @BeforeEach void setUp() { service = new AlumnoService(); // Se ejecuta antes de cada @Test } @Test void telefonoDe9DigitosEsValido() { // ... } @Test void telefonoVacioNoEsValido() { // ... } } ``` En este ejemplo, `setUp()` crea una instancia nueva de `AlumnoService` antes de **cada** test, garantizando que los tests son independientes entre sí. --- ## 2. Nomenclatura de los tests El nombre del método de test es muy importante: cuando un test falla, el nombre es lo primero que se lee. ### Convención recomendada ``` metodo_cuandoCondicion_retornaResultado() ``` | Parte | Significado | |---|---| | `metodo` | El método que se está probando | | `cuandoCondicion` | La situación o entrada que se usa | | `retornaResultado` | Lo que se espera que ocurra | ### Ejemplos ```java // ✅ Nombres descriptivos @Test void telefonoValido_cuandoTiene9Digitos_retornaTrue() { ... } @Test void telefonoValido_cuandoEstaVacio_retornaFalse() { ... } @Test void telefonoValido_cuandoTieneLetras_retornaFalse() { ... } // ❌ Nombres que no dicen nada @Test void test1() { ... } @Test void pruebaTest() { ... } ``` Con nombres descriptivos, si falla `telefonoValido_cuandoTiene9Digitos_retornaTrue` sabemos exactamente qué está fallando sin ni siquiera abrir el código. --- ## 3. Given – When – Then (G-W-T) El patrón **Given-When-Then** es una forma de estructurar los tests que viene del enfoque **BDD (Behavior Driven Development)**. Es equivalente al patrón AAA pero con una terminología más orientada al comportamiento. | Fase | Significado | Equivalente AAA | |---|---|---| | **Given** | Dado un contexto inicial | Arrange | | **When** | Cuando ocurre una acción | Act | | **Then** | Entonces se produce un resultado | Assert | ### Ejemplo ```java @Test void telefonoValido_cuandoTiene9Digitos_retornaTrue() { // Given Alumno alumno = new Alumno(); alumno.setTelefono("123456789"); // When boolean resultado = service.telefonoValido(alumno); // Then assertTrue(resultado); } ``` La ventaja de G-W-T es que el test **se lee casi como una frase en lenguaje natural**: > *Dado un alumno con teléfono de 9 dígitos, cuando compruebo si es válido, entonces el resultado es verdadero.* Esto facilita que cualquier componente del equipo, incluso sin conocimientos técnicos, entienda qué se está probando. ![Diagrama de pruebas](img/junit_test_flowchart.svg) --- Fuentes: [ChatGPT](https://chat.openai.com) + [Claude](https://claude.ai)