Testing Haskell
Testing Haskell
Para usar las funciones de la biblioteca de Hspec, necesitamos importarla a nuestro sistema
poniendo al inicio de nuestro código:
import Test.Hspec
Este framework nos otorga 4 funciones muy copadas para crear nuestros tests:
runTests1 = hspec $ do
describe "Tests con números:" $ do
it "1 + 1 es 2" $ do
1 + 1 `shouldBe` 2
1 Si estás usando stack test para correr los tests, reemplazá la función runTests por main
1 de 2
Buenas prácticas
Si queremos testear si una lista infinita de números contiene al 87, por lo que vimos hasta
ahora, podríamos hacer (como ahora testeamos listas, podemos escribirlo bajo otro describe):
describe "Tests con listas:" $ do
it "Lista infinita de números tiene el 87" $ do
elem 87 [1,2..] `shouldBe` True
Pero sabemos que comparar Bool’s mucho no nos gusta. Para evitar eso podemos usar
shouldSatisfy 2:: Show a => a -> (a -> Bool) -> Assertion
Que espera un a y una condición que tenga que cumplir. Así podemos reescribir nuestro test:
runTests = hspec $ do
describe "Tests con números:" $ do
it "1 + 1 es 2" $ do
1 + 1 `shouldBe` 2
describe "Tests con listas:" $ do
it "Lista infinita de números tiene el 87" $ do
[1,2..] `shouldSatisfy` elem 87
Testeo de errores
A veces vamos a querer verificar que nuestro programa falle. En ese caso esperamos que haya
un error, lo que indica que nuestro test pasa ok:
runTests = hspec $ do
describe "Tests con listas:" $ do
it "Una lista vacía no tiene primer elemento" $ do
evaluate (head []) `shouldThrow` anyException
Para poder utilizar la función evaluate, debemos importarla al comienzo de nuestro módulo de
test. import Control.Exception.
2
2 de 2