127 lines
3.3 KiB
Markdown
127 lines
3.3 KiB
Markdown
# 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.
|
||
|
||
|
||

|
||
|
||
|
||
---
|
||
Fuentes: [ChatGPT](https://chat.openai.com) + [Claude](https://claude.ai) |