Les proves unitàries són una part fonamental del desenvolupament de programari, ja que permeten verificar que les unitats individuals de codi funcionin correctament. En aquest mòdul, aprendrem com escriure i executar proves unitàries en Groovy utilitzant el framework de proves Spock, que és molt popular en l'ecosistema Groovy.
Continguts
- Introducció a les Proves Unitàries
- Configuració de Spock
- Estructura d'una Prova Spock
- Escriure Proves Bàsiques
- Assertions i Expectatives
- Proves Parametritzades
- Exercicis Pràctics
- Introducció a les Proves Unitàries
Les proves unitàries són proves automàtiques que verifiquen el comportament d'una petita part del codi, com ara una funció o un mètode. Aquestes proves ajuden a detectar errors de manera primerenca i faciliten el manteniment del codi.
Beneficis de les Proves Unitàries
- Detecció primerenca d'errors: Les proves unitàries permeten identificar errors en fases inicials del desenvolupament.
- Facilitat de manteniment: Amb proves unitàries, és més fàcil refactoritzar el codi sense introduir nous errors.
- Documentació: Les proves unitàries serveixen com a documentació viva del comportament del codi.
- Configuració de Spock
Spock és un framework de proves per a Groovy i Java que combina les millors característiques de JUnit i Mockito. Per començar a utilitzar Spock, necessitem afegir les dependències necessàries al nostre projecte.
Configuració amb Gradle
Afegiu les següents dependències al fitxer build.gradle
:
dependencies { testImplementation 'org.spockframework:spock-core:2.0-groovy-3.0' testImplementation 'org.codehaus.groovy:groovy-all:3.0.7' }
Configuració amb Maven
Afegiu les següents dependències al fitxer pom.xml
:
<dependencies> <dependency> <groupId>org.spockframework</groupId> <artifactId>spock-core</artifactId> <version>2.0-groovy-3.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-all</artifactId> <version>3.0.7</version> </dependency> </dependencies>
- Estructura d'una Prova Spock
Una prova Spock es compon de diverses seccions que descriuen el comportament esperat del codi. Les seccions més comunes són:
- setup: Inicialitza l'estat necessari per a les proves.
- when: Descriu l'acció que es vol provar.
- then: Verifica el resultat de l'acció.
- expect: Combina les seccions
when
ithen
en una sola.
Exemple Bàsic
import spock.lang.Specification class CalculatorSpec extends Specification { def "sumar dos nombres"() { setup: def calculator = new Calculator() when: def result = calculator.add(2, 3) then: result == 5 } }
- Escriure Proves Bàsiques
Exemple de Prova Bàsica
Suposem que tenim una classe Calculator
amb un mètode add
que suma dos nombres. Escriurem una prova per verificar aquest comportament.
Prova per al Mètode add
import spock.lang.Specification class CalculatorSpec extends Specification { def "sumar dos nombres"() { setup: def calculator = new Calculator() when: def result = calculator.add(2, 3) then: result == 5 } }
- Assertions i Expectatives
Spock proporciona diverses maneres de fer assertions i establir expectatives sobre el comportament del codi.
Assertions
Les assertions es fan a la secció then
o expect
de la prova.
Expectatives
Les expectatives es poden utilitzar per combinar les seccions when
i then
.
- Proves Parametritzades
Les proves parametritzades permeten executar la mateixa prova amb diferents conjunts de dades.
Exemple de Prova Parametritzada
import spock.lang.Specification import spock.lang.Unroll class CalculatorSpec extends Specification { @Unroll def "sumar #a i #b ha de donar #result"() { setup: def calculator = new Calculator() expect: calculator.add(a, b) == result where: a | b || result 1 | 1 || 2 2 | 3 || 5 3 | 4 || 7 } }
- Exercicis Pràctics
Exercici 1: Escriure una Prova per a la Multiplicació
- Creeu una classe
Calculator
amb un mètodemultiply
que multipliqui dos nombres. - Escriu una prova Spock per verificar el comportament del mètode
multiply
.
Solució
class Calculator { int multiply(int a, int b) { return a * b } } import spock.lang.Specification class CalculatorSpec extends Specification { def "multiplicar dos nombres"() { setup: def calculator = new Calculator() when: def result = calculator.multiply(2, 3) then: result == 6 } }
Exercici 2: Prova Parametritzada per a la Divisió
- Afegiu un mètode
divide
a la classeCalculator
que divideixi dos nombres. - Escriu una prova parametritzada per verificar el comportament del mètode
divide
.
Solució
class Calculator { int divide(int a, int b) { return a / b } } import spock.lang.Specification import spock.lang.Unroll class CalculatorSpec extends Specification { @Unroll def "dividir #a per #b ha de donar #result"() { setup: def calculator = new Calculator() expect: calculator.divide(a, b) == result where: a | b || result 6 | 2 || 3 9 | 3 || 3 8 | 4 || 2 } }
Conclusió
En aquest tema, hem après com configurar i utilitzar Spock per escriure proves unitàries en Groovy. Hem vist com estructurar una prova Spock, fer assertions i expectatives, i escriure proves parametritzades. Les proves unitàries són una eina poderosa per assegurar la qualitat del codi i facilitar el manteniment del projecte.
Curs de Programació Groovy
Mòdul 1: Introducció a Groovy
Mòdul 2: Sintaxi i Característiques del Llenguatge Groovy
Mòdul 3: Programació Orientada a Objectes en Groovy
Mòdul 4: Característiques Avançades de Groovy
Mòdul 5: Groovy en la Pràctica
- Entrada/Sortida de Fitxers
- Treballant amb XML i JSON
- Accés a Bases de Dades
- Desenvolupament Web amb Groovy
Mòdul 6: Proves i Depuració
Mòdul 7: Ecosistema i Eines de Groovy
- Eina de Construcció Gradle
- Framework de Proves Spock
- Framework Grails
- Altres Llibreries i Eines de Groovy
Mòdul 8: Millors Pràctiques i Temes Avançats
- Estil de Codi i Convencions
- Optimització del Rendiment
- Consideracions de Seguretat
- Concurrència en Groovy