El Desenvolupament Guiat per Tests (TDD) és una metodologia de desenvolupament de programari que es basa en escriure tests abans de desenvolupar el codi funcional. Aquesta tècnica ajuda a assegurar que el codi compleix els requisits especificats i facilita la detecció d'errors des de les primeres etapes del desenvolupament.
Objectius del TDD
- Millorar la qualitat del codi: Escriure tests abans del codi funcional ajuda a identificar errors i defectes des del principi.
- Facilitar el manteniment: Els tests actuen com a documentació viva del codi, facilitant la comprensió i el manteniment.
- Fomentar el disseny modular: El TDD promou la creació de codi modular i desacoblat, ja que els tests es centren en unitats petites i independents.
Cicle del TDD
El cicle del TDD es pot resumir en tres passos principals:
- Escriure un test: Escriure un test que defineixi una nova funcionalitat o millora. Aquest test inicialment fallarà perquè la funcionalitat encara no està implementada.
- Fer que el test passi: Escriure el codi mínim necessari per fer que el test passi.
- Refactoritzar: Millorar el codi assegurant-se que els tests continuen passant.
Aquest cicle es repeteix fins que es completa la funcionalitat desitjada.
Exemple Pràctic de TDD amb JUnit
Pas 1: Escriure un Test
Suposem que volem implementar una classe Calculator
amb una funció add
que sumi dos números. Primer, escrivim un test per aquesta funcionalitat.
import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; public class CalculatorTest { @Test public void testAdd() { Calculator calculator = new Calculator(); int result = calculator.add(2, 3); assertEquals(5, result, "2 + 3 hauria de ser 5"); } }
Pas 2: Fer que el Test Passi
Implementem el codi mínim necessari per fer que el test passi.
Pas 3: Refactoritzar
En aquest cas, el codi és prou simple i no necessita refactorització. Però si fos més complex, podríem millorar la seva estructura i llegibilitat mantenint els tests verds.
Exercicis Pràctics
Exercici 1: Multiplicació
Escriu un test per una funció multiply
que multipliqui dos números i implementa la funcionalitat.
Solució
Test:
@Test public void testMultiply() { Calculator calculator = new Calculator(); int result = calculator.multiply(2, 3); assertEquals(6, result, "2 * 3 hauria de ser 6"); }
Implementació:
Exercici 2: Divisió
Escriu un test per una funció divide
que divideixi dos números i implementa la funcionalitat. Assegura't de gestionar la divisió per zero.
Solució
Test:
@Test public void testDivide() { Calculator calculator = new Calculator(); int result = calculator.divide(6, 3); assertEquals(2, result, "6 / 3 hauria de ser 2"); } @Test public void testDivideByZero() { Calculator calculator = new Calculator(); assertThrows(ArithmeticException.class, () -> { calculator.divide(6, 0); }, "Dividir per zero hauria de llençar una excepció"); }
Implementació:
public int divide(int a, int b) { if (b == 0) { throw new ArithmeticException("No es pot dividir per zero"); } return a / b; }
Resum
El Desenvolupament Guiat per Tests (TDD) és una metodologia que ajuda a millorar la qualitat del codi i facilita el manteniment. El cicle del TDD consisteix en escriure un test, fer que el test passi i refactoritzar el codi. Mitjançant exemples pràctics, hem vist com aplicar el TDD amb JUnit per implementar funcionalitats de manera efectiva.
En el següent tema, explorarem com integrar JUnit en un procés d'Integració Contínua per assegurar que els tests s'executin automàticament en cada canvi de codi.
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