En aquest tema, aprendrem com escriure tests efectius que no només validin el comportament del nostre codi, sinó que també siguin fàcils de mantenir i comprendre. Els tests efectius són una part crucial del desenvolupament de programari, ja que ens ajuden a detectar errors de manera primerenca i assegurar-nos que el nostre codi funcioni com s'espera.
- Principis de Tests Efectius
1.1. Claredat i Simplicitat
- Nom descriptiu: Els noms dels tests han de ser descriptius i indicar clarament què estan provant.
- Un sol cas de prova per test: Cada test ha de provar un sol cas de prova per mantenir la simplicitat i facilitar la identificació d'errors.
1.2. Independència
- Tests independents: Els tests han de ser independents entre si. L'ordre d'execució no ha d'afectar els resultats dels tests.
- Configuració i neteja: Utilitza les anotacions
@Before,@After,@BeforeClassi@AfterClassper configurar i netejar l'entorn de prova.
1.3. Repetibilitat
- Resultats consistents: Els tests han de produir els mateixos resultats cada vegada que s'executen, independentment de l'entorn o l'ordre d'execució.
1.4. Ràpids
- Temps d'execució: Els tests han de ser ràpids per permetre una retroalimentació ràpida durant el desenvolupament.
- Estructura d'un Test Efectiu
Un test efectiu generalment segueix l'estructura AAA (Arrange, Act, Assert):
2.1. Arrange (Preparació)
- Configura l'entorn de prova i inicialitza les dades necessàries.
2.2. Act (Acció)
- Executa el codi que vols provar.
2.3. Assert (Verificació)
- Verifica que els resultats obtinguts siguin els esperats.
- Exemple Pràctic
A continuació, es mostra un exemple pràctic d'un test efectiu utilitzant JUnit:
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
public class CalculatorTest {
private Calculator calculator;
@BeforeEach
public void setUp() {
calculator = new Calculator();
}
@Test
public void testAddition() {
// Arrange
int a = 5;
int b = 3;
// Act
int result = calculator.add(a, b);
// Assert
assertEquals(8, result, "5 + 3 should equal 8");
}
@Test
public void testSubtraction() {
// Arrange
int a = 5;
int b = 3;
// Act
int result = calculator.subtract(a, b);
// Assert
assertEquals(2, result, "5 - 3 should equal 2");
}
}Explicació del Codi
@BeforeEach: Configura l'entorn de prova inicialitzant una instància deCalculatorabans de cada test.testAddition: Prova la funcionalitat d'addició de la calculadora.- Arrange: Inicialitza les variables
aib. - Act: Executa el mètode
addde la calculadora. - Assert: Verifica que el resultat sigui 8.
- Arrange: Inicialitza les variables
testSubtraction: Prova la funcionalitat de substracció de la calculadora.- Arrange: Inicialitza les variables
aib. - Act: Executa el mètode
subtractde la calculadora. - Assert: Verifica que el resultat sigui 2.
- Arrange: Inicialitza les variables
- Exercicis Pràctics
Exercici 1: Test de Multiplicació
Escriu un test per a la funcionalitat de multiplicació de la classe Calculator.
Solució
@Test
public void testMultiplication() {
// Arrange
int a = 5;
int b = 3;
// Act
int result = calculator.multiply(a, b);
// Assert
assertEquals(15, result, "5 * 3 should equal 15");
}Exercici 2: Test de Divisió
Escriu un test per a la funcionalitat de divisió de la classe Calculator, assegurant-te de manejar la divisió per zero.
Solució
@Test
public void testDivision() {
// Arrange
int a = 6;
int b = 3;
// Act
int result = calculator.divide(a, b);
// Assert
assertEquals(2, result, "6 / 3 should equal 2");
}
@Test
public void testDivisionByZero() {
// Arrange
int a = 6;
int b = 0;
// Act & Assert
assertThrows(ArithmeticException.class, () -> {
calculator.divide(a, b);
}, "Division by zero should throw ArithmeticException");
}
- Errors Comuns i Consells
Errors Comuns
- No inicialitzar correctament l'entorn de prova: Assegura't que cada test comenci amb un entorn net.
- Provar múltiples casos en un sol test: Divideix els tests en múltiples mètodes per mantenir la claredat.
- No manejar excepcions esperades: Utilitza
assertThrowsper verificar que es llencin les excepcions esperades.
Consells
- Utilitza noms descriptius: Els noms dels tests han de ser clars i indicar què estan provant.
- Refactoritza els tests: Mantingues els tests nets i llegibles, refactoritzant-los quan sigui necessari.
- Executa els tests freqüentment: Executa els tests sovint per detectar errors de manera primerenca.
Conclusió
Escriure tests efectius és una habilitat essencial per a qualsevol desenvolupador. Seguint els principis i les pràctiques descrites en aquest tema, podràs crear tests que no només validin el teu codi, sinó que també siguin fàcils de mantenir i comprendre. Practica escrivint tests per a diferents casos i escenaris per millorar les teves habilitats en testing.
Curs de JUnit
Mòdul 1: Introducció a JUnit
Mòdul 2: Anotacions Bàsiques de JUnit
- Entenent @Test
- Utilitzant @Before i @After
- Utilitzant @BeforeClass i @AfterClass
- Ignorant Tests amb @Ignore
Mòdul 3: Assertions a JUnit
Mòdul 4: Tests Parametritzats
- Introducció als Tests Parametritzats
- Creant Tests Parametritzats
- Utilitzant @ParameterizedTest
- Tests Parametritzats Personalitzats
Mòdul 5: Suites de Test
Mòdul 6: Mocking amb JUnit
Mòdul 7: Funcions Avançades de JUnit
Mòdul 8: Millors Pràctiques i Consells
- Escrivint Tests Efectius
- Organitzant el Codi de Test
- Desenvolupament Guiat per Tests (TDD)
- Integració Contínua amb JUnit
