Organitzar el codi de test és crucial per mantenir la claredat, la mantenibilitat i l'eficàcia dels teus tests. En aquesta secció, explorarem les millors pràctiques per estructurar i organitzar el codi de test en els teus projectes.
- Estructura de Directoris
Una bona pràctica és mantenir els tests en un directori separat del codi de producció. Això ajuda a mantenir el codi net i facilita la navegació. Una estructura comuna és la següent:
/project-root
/src
/main
/java
/com
/example
/app
App.java
/test
/java
/com
/example
/app
AppTest.javaAvantatges:
- Separació clara: Manté el codi de producció i el codi de test separats.
- Facilita la navegació: És fàcil trobar els tests corresponents a cada classe de producció.
- Nomenclatura de Classes de Test
Utilitza una convenció de nomenclatura consistent per a les classes de test. Una pràctica comuna és afegir el sufix Test al nom de la classe que s'està testant.
Exemple:
// Classe de producció
public class Calculator {
public int add(int a, int b) {
return a + b;
}
}
// Classe de test
public class CalculatorTest {
@Test
public void testAdd() {
Calculator calculator = new Calculator();
assertEquals(5, calculator.add(2, 3));
}
}
- Agrupació de Tests
Agrupa els tests relacionats en la mateixa classe de test. Això ajuda a mantenir el codi organitzat i facilita la comprensió de què s'està testant.
Exemple:
public class CalculatorTest {
@Test
public void testAdd() {
Calculator calculator = new Calculator();
assertEquals(5, calculator.add(2, 3));
}
@Test
public void testSubtract() {
Calculator calculator = new Calculator();
assertEquals(1, calculator.subtract(3, 2));
}
}
- Utilització de Mètodes de Configuració
Utilitza les anotacions @Before, @After, @BeforeClass i @AfterClass per configurar i netejar els recursos necessaris per als tests. Això ajuda a evitar la duplicació de codi i a mantenir els tests nets.
Exemple:
public class CalculatorTest {
private Calculator calculator;
@Before
public void setUp() {
calculator = new Calculator();
}
@After
public void tearDown() {
calculator = null;
}
@Test
public void testAdd() {
assertEquals(5, calculator.add(2, 3));
}
@Test
public void testSubtract() {
assertEquals(1, calculator.subtract(3, 2));
}
}
- Utilització de Suites de Test
Les suites de test permeten agrupar múltiples classes de test i executar-les juntes. Això és útil per organitzar tests relacionats i executar-los de manera eficient.
Exemple:
@RunWith(Suite.class)
@Suite.SuiteClasses({
CalculatorTest.class,
AnotherTest.class
})
public class AllTests {
// Aquesta classe roman buida, només s'utilitza com a contenidor per a les anotacions.
}
- Comentaris i Documentació
Afegeix comentaris i documentació als teus tests per explicar el propòsit de cada test i qualsevol configuració especial. Això ajuda altres desenvolupadors a comprendre el codi de test i facilita la seva mantenibilitat.
Exemple:
public class CalculatorTest {
private Calculator calculator;
@Before
public void setUp() {
// Inicialitza la instància de Calculator abans de cada test
calculator = new Calculator();
}
@After
public void tearDown() {
// Neteja la instància de Calculator després de cada test
calculator = null;
}
@Test
public void testAdd() {
// Test per verificar la suma de dos números
assertEquals(5, calculator.add(2, 3));
}
@Test
public void testSubtract() {
// Test per verificar la resta de dos números
assertEquals(1, calculator.subtract(3, 2));
}
}Exercici Pràctic
Exercici:
- Crea una classe
StringUtilsamb un mètodeisPalindrome(String str)que retornitruesi la cadena és un palíndrom ifalseen cas contrari. - Escriu una classe de test
StringUtilsTestper verificar el comportament del mètodeisPalindrome.
Solució:
// Classe de producció
public class StringUtils {
public boolean isPalindrome(String str) {
if (str == null) {
return false;
}
String reversed = new StringBuilder(str).reverse().toString();
return str.equals(reversed);
}
}
// Classe de test
public class StringUtilsTest {
private StringUtils stringUtils;
@Before
public void setUp() {
stringUtils = new StringUtils();
}
@After
public void tearDown() {
stringUtils = null;
}
@Test
public void testIsPalindrome() {
assertTrue(stringUtils.isPalindrome("madam"));
assertFalse(stringUtils.isPalindrome("hello"));
assertTrue(stringUtils.isPalindrome("racecar"));
assertFalse(stringUtils.isPalindrome(null));
}
}Conclusió
Organitzar el codi de test de manera efectiva és essencial per mantenir la qualitat i la mantenibilitat dels teus tests. Seguint aquestes pràctiques, podràs escriure tests més clars, nets i fàcils de mantenir. En el proper tema, explorarem el Desenvolupament Guiat per Tests (TDD) i com pot ajudar-te a escriure codi de millor qualitat.
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
