En aquest tema, aprendrem sobre les anotacions @BeforeClass
i @AfterClass
a JUnit. Aquestes anotacions són útils per configurar i netejar recursos que són compartits per tots els tests d'una classe de test. A diferència de @Before
i @After
, que s'executen abans i després de cada test, @BeforeClass
i @AfterClass
s'executen una sola vegada abans i després de tots els tests de la classe, respectivament.
Conceptes Clau
- @BeforeClass: S'utilitza per executar codi abans de qualsevol test en la classe de test. Ideal per inicialitzar recursos compartits.
- @AfterClass: S'utilitza per executar codi després de tots els tests en la classe de test. Ideal per alliberar recursos compartits.
Exemple Pràctic
A continuació, veurem un exemple pràctic per entendre millor com utilitzar aquestes anotacions.
Exemple de Codi
import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.assertEquals; public class CalculadoraTest { private static Calculadora calculadora; @BeforeClass public static void inicialitzar() { // Aquest mètode s'executa una sola vegada abans de tots els tests calculadora = new Calculadora(); System.out.println("Inicialitzant recursos compartits..."); } @AfterClass public static void netejar() { // Aquest mètode s'executa una sola vegada després de tots els tests calculadora = null; System.out.println("Alliberant recursos compartits..."); } @Test public void testSuma() { int resultat = calculadora.suma(2, 3); assertEquals(5, resultat); } @Test public void testResta() { int resultat = calculadora.resta(5, 3); assertEquals(2, resultat); } }
Explicació del Codi
-
Inicialització amb @BeforeClass:
- El mètode
inicialitzar()
està anotat amb@BeforeClass
, el que significa que s'executarà una sola vegada abans de qualsevol test en la classeCalculadoraTest
. - En aquest mètode, inicialitzem una instància de
Calculadora
que serà compartida per tots els tests.
- El mètode
-
Neteja amb @AfterClass:
- El mètode
netejar()
està anotat amb@AfterClass
, el que significa que s'executarà una sola vegada després de tots els tests en la classeCalculadoraTest
. - En aquest mètode, alliberem la instància de
Calculadora
establint-la anull
.
- El mètode
-
Tests Individuals:
- Els mètodes
testSuma()
itestResta()
són tests individuals que utilitzen la instància compartida deCalculadora
per realitzar operacions i verificar els resultats amb assertions.
- Els mètodes
Exercici Pràctic
Exercici
Crea una classe de test per a una classe BaseDeDades
que necessiti una connexió a la base de dades abans de qualsevol test i que tanqui la connexió després de tots els tests.
- Defineix una classe
BaseDeDadesTest
. - Utilitza
@BeforeClass
per establir una connexió a la base de dades. - Utilitza
@AfterClass
per tancar la connexió a la base de dades. - Escriu almenys dos tests que utilitzin la connexió a la base de dades.
Solució
import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; public class BaseDeDadesTest { private static BaseDeDades baseDeDades; @BeforeClass public static void establirConnexio() { // Aquest mètode s'executa una sola vegada abans de tots els tests baseDeDades = new BaseDeDades(); baseDeDades.connectar(); System.out.println("Connexió a la base de dades establerta..."); } @AfterClass public static void tancarConnexio() { // Aquest mètode s'executa una sola vegada després de tots els tests baseDeDades.desconnectar(); baseDeDades = null; System.out.println("Connexió a la base de dades tancada..."); } @Test public void testConnexioNoNull() { assertNotNull(baseDeDades.getConnexio()); } @Test public void testConsulta() { boolean resultat = baseDeDades.executarConsulta("SELECT * FROM usuaris"); assertTrue(resultat); } }
Explicació de la Solució
-
Inicialització amb @BeforeClass:
- El mètode
establirConnexio()
s'executa abans de qualsevol test per establir una connexió a la base de dades.
- El mètode
-
Neteja amb @AfterClass:
- El mètode
tancarConnexio()
s'executa després de tots els tests per tancar la connexió a la base de dades.
- El mètode
-
Tests Individuals:
testConnexioNoNull()
verifica que la connexió a la base de dades no siguinull
.testConsulta()
verifica que una consulta SQL s'executi correctament.
Resum
En aquesta secció, hem après com utilitzar les anotacions @BeforeClass
i @AfterClass
per inicialitzar i netejar recursos compartits abans i després de tots els tests d'una classe. Aquestes anotacions són especialment útils per gestionar recursos costosos com connexions a bases de dades, fitxers, o altres serveis externs.
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