Les proves unitàries són una tècnica de verificació de programari que s'utilitza per assegurar
que cada part (unitat) del programa funciona correctament. Aquesta tècnica es basa a dividir
el programa en parts més xicotetes i escriure proves per a cadascuna.
Això és útil perquè, quan es fan canvis en un programa, és més fàcil determinar què ha fallat
si es poden comprovar les parts individuals. A més, ajuda a detectar errors més ràpidament
i a evitar introduir-ne de nous durant el manteniment del programa.
Java té diverses ferramentes per escriure i executar proves, com JUnit.
En aquest exemple es creen proves unitàries per comprovar que el programa
DebugRockPaperScissors funciona correctament.
Per poder provar aquest codi, s'ha creat una nova versió del programa que incorpora el mètode
int guanya(String jugador1, String jugador2), que determina qui ha guanyat la partida:
RockPaperScissorsError.java
packageud4.methods;importjava.util.Locale;importjava.util.Scanner;publicclassRockPaperScissorsError{/** * Determina quin jugador ha guanyat la partida de pedra paper i tisores. * <p> * Aquest mètode retorna 0 si hi ha hagut un empat, 1 si el jugador1 ha guanyat la partida, * i 2 si el jugador2 ha guanyat. * * @param jugador1 Jugada del jugador1 (pedra, paper o tisores) * @param jugador2 Jugada del jugador1 (pedra, paper o tisores) * @return 0 si hi ha un empat; 1 si guanya jugador1; 2 si guanya jugador 2. */publicstaticintguanya(Stringjugador1,Stringjugador2){if(jugador1.equals(jugador2))return0;elseif(jugador1.equals("paper")){returnjugador2.equals("pedra")?2:1;}elseif(jugador1.equals("pedra")){returnjugador2.equals("paper")?1:2;}else{returnjugador2.equals("paper")?1:2;}}publicstaticvoidmain(String[]args){Scannerin=newScanner(System.in).useLocale(Locale.US);System.out.print("Introdueix l'elecció del jugador 2 (pedra/paper/tisores): ");Stringp1=in.nextLine();System.out.print("Introdueix l'elecció del jugador 2 (pedra/paper/tisores): ");Stringp2=in.nextLine();intguanyador=guanya(p1,p2);if(guanyador==0)System.out.println("Empat");elseSystem.out.printf("Guanya el jugador %d\n",guanyador);}}
Per comprovar si el mètode està ben implementat, se segueixen aquests passos:
Situa't sobre el nom de la classe RockPaperScissors, prem Alt+Ins i selecciona Test.
També pots prémer Alt+Enter o fer clic amb el botó dret i seleccionar Show Context Actions.
Des del menú, selecciona Create Test (Figura 1).
Figura 1. Crear una prova des del menú contextual.
Selecciona en el diàleg els mètodes que vols provar i prem OK (Figura 2).
Figura 2. Configuració de la prova.
L'acció anterior crea un fitxer nou en src/test/java, la carpeta on es guarden les proves del projecte
(Figura 3). El fitxer nou es troba en la mateixa estructura de paquets que el codi
font: ud4.methods.
Figura 3. Fitxer de prova creat.
Dissenya les proves per comprovar si el mètode guanya() funciona correctament en tots els casos:
Jugador 1
Jugador 2
Resultat
Pedra
Pedra
Empat
Pedra
Paper
Jugador 2 guanya
Pedra
Tisores
Jugador 1 guanya
Paper
Pedra
Jugador 1 guanya
Paper
Paper
Empat
Paper
Tisores
Jugador 2 guanya
Tisores
Pedra
Jugador 2 guanya
Tisores
Paper
Jugador 1 guanya
Tisores
Tisores
Empat
Modifica el fitxer de proves per incloure els casos anteriors. Les proves s'han organitzat
en classes internes @Nested per millorar-ne l'organització.
RockPaperScissorsTest.java
packageud4.methods;importorg.junit.jupiter.api.DisplayName;importorg.junit.jupiter.api.Nested;importorg.junit.jupiter.api.Test;import staticorg.junit.jupiter.api.Assertions.*;classRockPaperScissorsTest{@NestedclassEmpats{@Test@DisplayName("Tisores VS Tisores")voidtisoresVsTisores_shouldReturn0(){// ArrangeStringj1="tisores";Stringj2="tisores";intexpected=0;// Actintactual=RockPaperScissors.guanya(j1,j2);// AssertassertEquals(expected,actual);}@Test@DisplayName("Pedra VS Pedra")voidpedraVsPedra_shouldReturn0(){// ArrangeStringj1="pedra";Stringj2="pedra";intexpected=0;// Actintactual=RockPaperScissors.guanya(j1,j2);// AssertassertEquals(expected,actual);}@Test@DisplayName("Paper VS Paper")voidpaperVsPaper_shouldReturn0(){// ArrangeStringj1="paper";Stringj2="paper";intexpected=0;// Actintactual=RockPaperScissors.guanya(j1,j2);// AssertassertEquals(expected,actual);}}@NestedclassJugador1{@Test@DisplayName("Pedra VS Tisores")voidpedraVsTisores_shouldReturn1(){// ArrangeStringj1="pedra";Stringj2="tisores";intexpected=1;// Actintactual=RockPaperScissors.guanya(j1,j2);// AssertassertEquals(expected,actual);}@Test@DisplayName("Paper VS Pedra")voidpaperVsPedra_shouldReturn1(){// ArrangeStringj1="paper";Stringj2="pedra";intexpected=1;// Actintactual=RockPaperScissors.guanya(j1,j2);// AssertassertEquals(expected,actual);}@Test@DisplayName("Tisores VS Paper")voidtisoresVsPaper_shouldReturn1(){// ArrangeStringj1="tisores";Stringj2="paper";intexpected=1;// Actintactual=RockPaperScissors.guanya(j1,j2);// AssertassertEquals(expected,actual);}}@NestedclassJugador2{@Test@DisplayName("Pedra VS Paper")voidpedraVsPaper_shouldReturn2(){// ArrangeStringj1="pedra";Stringj2="paper";intexpected=2;// Actintactual=RockPaperScissors.guanya(j1,j2);// AssertassertEquals(expected,actual);}@Test@DisplayName("Paper VS Tisores")voidpaperVsTisores_shouldReturn2(){// ArrangeStringj1="paper";Stringj2="tisores";intexpected=2;// Actintactual=RockPaperScissors.guanya(j1,j2);// AssertassertEquals(expected,actual);}@Test@DisplayName("Tisores VS Pedra")voidtisoresVsPedra_shouldReturn2(){// ArrangeStringj1="tisores";Stringj2="pedra";intexpected=2;// Actintactual=RockPaperScissors.guanya(j1,j2);// AssertassertEquals(expected,actual);}}}
Una vegada implementades les proves, cal executar-les per comprovar si el mètode
int guanya(String jugador1, String jugador2) funciona correctament.
Per executar-les, fes clic en el botó Run (Figura 4).
Figura 4. Execució de les proves.
Una vegada executades, es poden consultar els resultats (Figura 5).
Figura 5. Resultats de les proves.
S'observen els resultats de cada prova per separat. En aquest cas, algunes proves han fallat i,
per tant, caldrà revisar els errors i corregir el codi.
📌 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.