0% encontró este documento útil (0 votos)
85 vistas

Testing Haskell

Este documento presenta los conceptos básicos para usar la biblioteca Hspec para crear tests unitarios en Haskell. Explica que se debe importar la biblioteca Hspec y presenta cuatro funciones principales: hspec para ejecutar tests, describe para agrupar tests, it para crear cada test, y shouldBe para realizar aserciones de igualdad. Además, muestra un ejemplo simple de un test que verifica que la suma de 1 + 1 es 2, y discute buenas prácticas como usar shouldSatisfy para evitar comparar Bool directamente y probar errores esperando

Cargado por

Agustin Ber
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
85 vistas

Testing Haskell

Este documento presenta los conceptos básicos para usar la biblioteca Hspec para crear tests unitarios en Haskell. Explica que se debe importar la biblioteca Hspec y presenta cuatro funciones principales: hspec para ejecutar tests, describe para agrupar tests, it para crear cada test, y shouldBe para realizar aserciones de igualdad. Además, muestra un ejemplo simple de un test que verifica que la suma de 1 + 1 es 2, y discute buenas prácticas como usar shouldSatisfy para evitar comparar Bool directamente y probar errores esperando

Cargado por

Agustin Ber
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 2

Conceptos básicos

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:

hspec :: IO [Spec] -> IO ()


Es la función principal a la que llamamos para correr toda una pila de tests.

describe :: String -> [IO (String, Result)] -> IO [Spec]


Sirve para agrupar tests bajo un mismo nombre al correrlos para una mejor organización.

it :: SpecVerifier a => String -> a -> IO (String, Result)


Es la función que usamos para crear cada test; espera el nombre del test y el test en sí, y nos
devuelve el output que veremos por pantalla (Rojo o Verde).

shouldBe :: (Show a, Eq a) => a -> a -> Assertion


El assert básico de igualdad.

Ya podemos crear nuestro primer test!


Probemos que “1 + 1 es 2” (ese String sería una descripción de lo que se está probando, es
importantísimo que sea expresivo, en este caso es difícil pensar en algo que no esté atado a la
implementación del test pero podríamos llevarlo a algo como “la suma básica funciona”):

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

En caso de no haber error, el test fallará.

Para poder utilizar la función evaluate, debemos importarla al comienzo de nuestro módulo de
test. import Control.Exception.

2
2 de 2

También podría gustarte