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:

dotnet add package FsCheck

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:

let positiveInt = Arb.generate<int> |> Gen.suchThat (fun x -> x > 0)

Exemples Pràctics

Exemple 1: Propietat Commutativa de la Suma

let prop_SumIsCommutative (a: int) (b: int) =
    a + b = b + a

Check.Quick prop_SumIsCommutative

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#.

© Copyright 2024. Tots els drets reservats