Les proves basades en propietats són una tècnica poderosa per assegurar la qualitat del codi. A diferència de les proves unitàries tradicionals, que comproven resultats específics per a entrades concretes, les proves basades en propietats defineixen propietats generals que el codi ha de complir per a qualsevol entrada vàlida. FsCheck és una biblioteca popular en F# per a realitzar aquest tipus de proves.
Continguts
Introducció a les Proves Basades en Propietats
Les proves basades en propietats es centren en definir propietats generals que el codi ha de complir. Aquestes propietats es poden veure com regles o invariants que sempre han de ser certes, independentment de les dades d'entrada.
Avantatges
- Cobertura més àmplia: Les proves basades en propietats poden explorar una gamma més àmplia de casos d'ús.
- Detecció de casos límit: Sovint poden descobrir casos límit que les proves unitàries tradicionals podrien passar per alt.
- Mantenibilitat: Les propietats són més fàcils de mantenir i entendre que un conjunt gran de proves unitàries específiques.
Instal·lació de FsCheck
Per començar a utilitzar FsCheck, primer cal instal·lar la biblioteca. Si utilitzes .NET Core, pots afegir FsCheck al teu projecte amb el següent comandament:
Definició de Propietats
Una propietat és una funció que retorna un valor booleà, indicant si la propietat es compleix o no. Vegem un exemple senzill:
open FsCheck let prop_ReverseTwiceIsOriginal (xs: int list) = List.rev (List.rev xs) = xs Check.Quick prop_ReverseTwiceIsOriginal
En aquest exemple, prop_ReverseTwiceIsOriginal
és una propietat que comprova que revertir una llista dues vegades retorna la llista original.
Generació Automàtica de Dades
FsCheck genera automàticament dades d'entrada per a les propietats. Això permet provar el codi amb una àmplia varietat de casos d'ús sense haver d'escriure manualment cada cas de prova.
Personalització de Generadors
Pots personalitzar els generadors de dades per adaptar-los a les teves necessitats específiques. Per exemple, per generar nombres enters positius:
Exemples Pràctics
Exemple 1: Propietat Commutativa de la Suma
Exemple 2: Propietat Associativa de la Multiplicació
let prop_MultiplicationIsAssociative (a: int) (b: int) (c: int) = (a * b) * c = a * (b * c) Check.Quick prop_MultiplicationIsAssociative
Exercicis Pràctics
Exercici 1: Propietat de la Concatenació de Llistes
Defineix una propietat que comprovi que la longitud de la concatenació de dues llistes és igual a la suma de les seves longituds.
let prop_ConcatLength (xs: 'a list) (ys: 'a list) = List.length (xs @ ys) = List.length xs + List.length ys Check.Quick prop_ConcatLength
Exercici 2: Propietat de la Inversió de Llistes
Defineix una propietat que comprovi que la inversió d'una llista concatenada és igual a la concatenació de les inversions de les llistes en ordre invers.
let prop_ReverseConcat (xs: 'a list) (ys: 'a list) = List.rev (xs @ ys) = (List.rev ys) @ (List.rev xs) Check.Quick prop_ReverseConcat
Conclusió
Les proves basades en propietats amb FsCheck són una eina poderosa per assegurar la qualitat del codi. Permeten definir propietats generals que el codi ha de complir i generen automàticament dades d'entrada per provar aquestes propietats. Això ajuda a descobrir casos límit i errors que podrien passar desapercebuts amb les proves unitàries tradicionals.
En el proper mòdul, explorarem tècniques de depuració per ajudar-te a identificar i corregir errors en el teu codi F#.
Curs de Programació en F#
Mòdul 1: Introducció a F#
Mòdul 2: Conceptes Bàsics
- Tipus de Dades i Variables
- Funcions i Immutabilitat
- Coincidència de Patrons
- Col·leccions: Llistes, Matrius i Seqüències
Mòdul 3: Programació Funcional
Mòdul 4: Estructures de Dades Avançades
Mòdul 5: Programació Orientada a Objectes en F#
- Classes i Objectes
- Herència i Interfícies
- Barreja de Programació Funcional i Orientada a Objectes
- Mòduls i Espais de Noms
Mòdul 6: Programació Asíncrona i Paral·lela
- Fluxos de Treball Asíncrons
- Biblioteca de Tasques Paral·leles
- MailboxProcessor i Agents
- Patrons de Concurrència
Mòdul 7: Accés i Manipulació de Dades
Mòdul 8: Proves i Depuració
- Proves Unitàries amb NUnit
- Proves Basades en Propietats amb FsCheck
- Tècniques de Depuració
- Perfilat de Rendiment