En aquest tema, aprendrem com provar i depurar el codi Haskell. La prova i la depuració són parts essencials del desenvolupament de programari, ja que ens ajuden a assegurar-nos que el nostre codi funciona correctament i a identificar i corregir errors.

Contingut

Introducció a les Proves

Les proves són una manera de verificar que el nostre codi funciona com s'espera. Hi ha diversos tipus de proves, però en aquest tema ens centrarem en les proves unitàries i les proves de propietats.

Tipus de Proves

  • Proves Unitàries: Verifiquen el funcionament correcte de funcions individuals.
  • Proves de Propietats: Verifiquen que el codi compleix certes propietats generals.

Proves Unitàries amb HUnit

HUnit és una biblioteca de proves unitàries per a Haskell. Permet definir proves per a funcions individuals i verificar que els resultats siguin els esperats.

Instal·lació de HUnit

Per instal·lar HUnit, pots utilitzar cabal o stack:

cabal install HUnit

o

stack add HUnit

Exemple de Prova Unitària

A continuació, es mostra un exemple de com definir i executar una prova unitària amb HUnit:

import Test.HUnit

-- Funció a provar
sumar :: Int -> Int -> Int
sumar x y = x + y

-- Prova unitària
testSumar :: Test
testSumar = TestCase (assertEqual "per sumar 1 i 2" 3 (sumar 1 2))

-- Executar les proves
main :: IO Counts
main = runTestTT testSumar

Explicació del Codi

  • import Test.HUnit: Importa la biblioteca HUnit.
  • sumar: Defineix una funció simple que suma dos enters.
  • testSumar: Defineix una prova unitària que verifica que sumar 1 2 retorna 3.
  • main: Executa la prova unitària.

Proves de Propietats amb QuickCheck

QuickCheck és una altra biblioteca de proves per a Haskell que permet definir propietats que el codi ha de complir i genera casos de prova aleatoris per verificar aquestes propietats.

Instal·lació de QuickCheck

Per instal·lar QuickCheck, pots utilitzar cabal o stack:

cabal install QuickCheck

o

stack add QuickCheck

Exemple de Prova de Propietats

A continuació, es mostra un exemple de com definir i executar una prova de propietats amb QuickCheck:

import Test.QuickCheck

-- Propietat a provar
prop_SumaCommutativa :: Int -> Int -> Bool
prop_SumaCommutativa x y = sumar x y == sumar y x

-- Executar les proves
main :: IO ()
main = quickCheck prop_SumaCommutativa

Explicació del Codi

  • import Test.QuickCheck: Importa la biblioteca QuickCheck.
  • prop_SumaCommutativa: Defineix una propietat que verifica que la suma és commutativa.
  • main: Executa la prova de propietats.

Depuració amb GHCi

GHCi és el REPL de Haskell i també es pot utilitzar per a la depuració. A continuació, es mostren algunes tècniques de depuració amb GHCi.

Utilització de :trace i :history

GHCi proporciona comandes com :trace i :history per ajudar a depurar el codi.

-- Exemple de funció amb error
dividir :: Int -> Int -> Int
dividir _ 0 = error "Divisió per zero"
dividir x y = x `div` y

-- Carregar el fitxer en GHCi
-- :l fitxer.hs

-- Traçar l'execució
-- :trace dividir 10 0

-- Veure l'historial
-- :history

Explicació del Codi

  • dividir: Defineix una funció que divideix dos enters, però genera un error si el divisor és zero.
  • :trace: Traça l'execució de la funció.
  • :history: Mostra l'historial de l'execució.

Exercicis Pràctics

Exercici 1: Prova Unitària

Defineix una funció multiplicar que multiplica dos enters i escriu una prova unitària per verificar que multiplicar 3 4 retorna 12.

Solució

import Test.HUnit

-- Funció a provar
multiplicar :: Int -> Int -> Int
multiplicar x y = x * y

-- Prova unitària
testMultiplicar :: Test
testMultiplicar = TestCase (assertEqual "per multiplicar 3 i 4" 12 (multiplicar 3 4))

-- Executar les proves
main :: IO Counts
main = runTestTT testMultiplicar

Exercici 2: Prova de Propietats

Defineix una propietat que verifica que la multiplicació és commutativa i escriu una prova de propietats per a aquesta propietat.

Solució

import Test.QuickCheck

-- Propietat a provar
prop_MultiplicacioCommutativa :: Int -> Int -> Bool
prop_MultiplicacioCommutativa x y = multiplicar x y == multiplicar y x

-- Executar les proves
main :: IO ()
main = quickCheck prop_MultiplicacioCommutativa

Conclusió

En aquest tema, hem après com provar i depurar el codi Haskell utilitzant HUnit per a proves unitàries, QuickCheck per a proves de propietats i GHCi per a la depuració. Les proves i la depuració són eines essencials per assegurar-nos que el nostre codi funciona correctament i per identificar i corregir errors.

© Copyright 2024. Tots els drets reservats