A l' Exemple: Proves unitàries de pedra, paper i tisores hem vist com fer proves unitàries per
al joc de pedra, paper i tisores, on s'han creat una sèrie de proves
per comprovar que el joc funciona correctament per a tots els casos
possibles.
Podeu observar que l'estructura de les proves és pràcticament la mateixa
per a totes les proves, canviant únicament els valors de les variables.
DebugRockPaperScissorsTest.java
packageud4.examples;importorg.junit.jupiter.api.DisplayName;importorg.junit.jupiter.api.Nested;importorg.junit.jupiter.api.Test;import staticorg.junit.jupiter.api.Assertions.assertEquals;classDebugRockPaperScissorsTest{@NestedclassEmpat{@Test@DisplayName("Empat: Pedra vs Pedra")voidtestEmpatPedraPedra(){intexpected=0;intactual=DebugRockPaperScissors.guanya("pedra","pedra");assertEquals(expected,actual);}@Test@DisplayName("Empat: Paper vs Paper")voidtestEmpatPaperPaper(){intexpected=0;intactual=DebugRockPaperScissors.guanya("paper","paper");assertEquals(expected,actual);}@Test@DisplayName("Empat: Tisores vs Tisora")voidtestEmpatTisoresTisora(){intexpected=0;intactual=DebugRockPaperScissors.guanya("tisores","tisores");assertEquals(expected,actual);}}@NestedclassJugador1{@Test@DisplayName("Jugador 1 guanya: Pedra vs Tisores")voidtestJugador1GuanyaPedraTisores(){intexpected=1;intactual=DebugRockPaperScissors.guanya("pedra","tisores");assertEquals(expected,actual);}@Test@DisplayName("Jugador 1 guanya: Paper vs Pedra")voidtestJugador1GuanyaPaperPedra(){intexpected=1;intactual=DebugRockPaperScissors.guanya("paper","pedra");assertEquals(expected,actual);}@Test@DisplayName("Jugador 1 guanya: Tisores vs Paper")voidtestJugador1GuanyaTisoresPaper(){intexpected=1;intactual=DebugRockPaperScissors.guanya("tisores","paper");assertEquals(expected,actual);}}@NestedclassJugador2{@Test@DisplayName("Jugador 2 guanya: Tisores vs Pedra")voidtestJugador2GuanyaTisoresPedra(){intexpected=2;intactual=DebugRockPaperScissors.guanya("tisores","pedra");assertEquals(expected,actual);}@Test@DisplayName("Jugador 2 guanya: Pedra vs Paper")voidtestJugador2GuanyaPedraPaper(){intexpected=2;intactual=DebugRockPaperScissors.guanya("pedra","paper");assertEquals(expected,actual);}@Test@DisplayName("Jugador 2 guanya: Paper vs Tisores")voidtestJugador2GuanyaPaperTisores(){intexpected=2;intactual=DebugRockPaperScissors.guanya("paper","tisores");assertEquals(expected,actual);}}}
Vegem com podem simplificar la codificació de les proves unitàries
amb proves parametritzades.
DebugRockPaperScissorsParametizedTest.java
packageud4.examples;importorg.junit.jupiter.api.DisplayName;importorg.junit.jupiter.params.ParameterizedTest;importorg.junit.jupiter.params.provider.CsvSource;import staticorg.junit.jupiter.api.Assertions.assertEquals;classDebugRockPaperScissorsParametizedTest{@ParameterizedTest(name="\"{0}\" vs \"{1}\" should be {2}")@DisplayName("RockPaperScissors::guanya(j1, j2)")@CsvSource({"pedra,pedra,0","pedra,paper,2","pedra,tisores,1","paper,pedra,1","paper,paper,0","paper,tisores,2","tisores,pedra,2","tisores,paper,1","tisores,tisores,0",})voidtestGuanya(Stringj1,Stringj2,intexpected){intactual=DebugRockPaperScissors.guanya(j1,j2);assertEquals(expected,actual);}}
A l' Exemple: Proves unitàries d'un cotxe hem vist com fer proves unitàries per
a la classe Car, on s'han creat una sèrie de proves
per comprovar que la classe funciona correctament en diferents
escenaris.
CarTest.java
packageud4.examples.objects;importorg.junit.jupiter.api.BeforeEach;importorg.junit.jupiter.api.DisplayName;importorg.junit.jupiter.api.Nested;importorg.junit.jupiter.api.Test;import staticorg.junit.jupiter.api.Assertions.assertAll;import staticorg.junit.jupiter.api.Assertions.assertEquals;classCarTest{publicstaticfinalStringPLATE="0000 BBB";@Nested@DisplayName("Constructor tests")classConstructor{@Test@DisplayName("Crea un cotxe amb matrícula")voidtestPlate(){Carcar=newCar(PLATE);assertAll(()->assertEquals(PLATE,car.getPlate()),()->assertEquals(0,car.getKilometers()));}@Test@DisplayName("Crea un cotxe amb matrícula i quilòmetres")voidtestPlateAndKilometers(){Carcar=newCar(PLATE,100);assertAll(()->assertEquals(PLATE,car.getPlate()),()->assertEquals(100,car.getKilometers()));}}@Nested@DisplayName("Car::accelerate(int speed) tests")classAccelerateWithSpeed{privateCarcar;@BeforeEachvoidsetup(){car=newCar(PLATE);}@Test@DisplayName("Car::accelerate(1) increments speed by 1")voidsingleAccelerate(){intexpected=1;car.accelerate(1);intactual=car.getSpeed();assertEquals(expected,actual);}@Test@DisplayName("Car::accelerate(5) increments speed by 5")voidmultipleAccelerate(){intexpected=5;car.accelerate(5);intactual=car.getSpeed();assertEquals(expected,actual);}@Test@DisplayName("Car::accelerate() multiples times increments speed")voidmultipleAccelerateCalls(){intexpected=3;car.accelerate(1);car.accelerate(2);intactual=car.getSpeed();assertEquals(expected,actual);}}@Nested@DisplayName("Car::accelerate() tests")classAccelerateWithoutSpeed{privateCarcar;@BeforeEachvoidsetup(){car=newCar(PLATE);}@Test@DisplayName("Car::accelerate() increments speed by 5")voidaccelerate(){intexpected=5;car.accelerate();intactual=car.getSpeed();assertEquals(expected,actual);}@Test@DisplayName("Car::accelerate() multiples times increments speed")voidmultipleAccelerateCalls(){intexpected=15;car.accelerate();car.accelerate();car.accelerate();intactual=car.getSpeed();assertEquals(expected,actual);}}}
En aquest cas, podríem parametritzar les proves
del mètode Car::accelerate().
@DisplayName("Car::accelerate()")@ParameterizedTest(name="{0}x accelerate() should result in speed {1}")@CsvSource({"0, 0","1, 5","3, 15",})voidaccelerateTest(inttimes,intexpectedSpeed){Carcar=newCar("1234ABC");for(inti=0;i<times;i++){car.accelerate();}assertEquals(expectedSpeed,car.getSpeed());}
📌 Aquest document pot quedar desactualitzat després d’imprimir-lo. Pots consultar la versió més recent
a la pàgina web.
🌿 Abans d’imprimir aquest document, considera si és realment necessari. Redueix el consum de paper i ajuda a protegir el nostre entorn.