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
,@BeforeClass
i@AfterClass
per 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 deCalculator
abans de cada test.testAddition
: Prova la funcionalitat d'addició de la calculadora.- Arrange: Inicialitza les variables
a
ib
. - Act: Executa el mètode
add
de 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
a
ib
. - Act: Executa el mètode
subtract
de 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
assertThrows
per 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