Pruebas unitarias simples usando Cabal en lugar de usar diff y make

Dec 16 2020

Me gustaría reescribir mi código de prueba de shell para que mi aplicación Haskell use solo Haskell y Cabal. (por razones de portabilidad)

El esquema de prueba actual se ve así

make      ->    binary                                     ->  ok or fail
make test ->    diff $(binary test-in) test-supposed-out   ->

Me gustaria tener algo como

cabal build  ->  binary                                             ->  ok or fail
cabal test   ->  ...testing with test-in and test-supposed-out...   ->

¿Cuál es la forma más fácil de hacer esto, por favor?

Gracias.

Respuestas

1 leftaroundabout Dec 16 2020 at 03:19

Tasty es un marco simple y versátil en el que ejecutar varios tipos de pruebas. (Lo uso principalmente para las pruebas QuickCheck , que, si aún no lo ha hecho, le recomiendo que consulte también).

El tipo particular de prueba por el que está preguntando se llama (al menos en Tasty) una prueba de oro . Entonces, por ejemplo, si el programa que desea probar fue

module ComplicatedProc where

import System.IO
import System.Environment (getArgs)

complicatedProc :: String -> Handle -> IO ()
complicatedProc input outHandle = do
   hPutStr outHandle $ drop 37 input ++ take 46 input

main :: IO ()
main = do
  [inpFp] <- getArgs
  input <- readFile inpFp
  complicatedProc input stdout

entonces podrías cambiar esto a una prueba Tasty test/golden.hs:

import Test.Tasty
import Test.Tasty.Golden

import ComplicatedProc (complicatedProc)

import System.IO

main :: IO ()
main = do
 complicAlgo_input <- readFile "test-in"
 let complicAlgo_outFp = "test-supposed-out"
 defaultMain $ testGroup "Tests" -- †
   [ goldenVsFile "complicatedAlgo (golden)"
      "test-supposed-out" complicAlgo_outFp
      ( withFile complicAlgo_outFp WriteMode
            $ complicatedProc complicAlgo_input )
   ]

Usa un .cabalarchivo como

cabal-version:       >=1.10

name:                compli-algo
version:             5.7.6.8
build-type:          Simple
-- ...

library
  exposed-modules:     ComplicatedProc
  build-depends:       base
  default-language:    Haskell2010

test-suite compli-algo-goldentest
  main-is:         golden.hs
  type:            exitcode-stdio-1.0
  build-depends:       base
                       , compli-algo
                       , tasty >=1.4 && <1.5
                       , tasty-golden >=2.3 && <2.4
  hs-source-dirs:   test

Si el programa que desea probar tiene una salida stdoutcodificada de forma rígida (por ejemplo, en forma de printdeclaraciones), es posible que deba modificar esto un poco.


No hay ninguna necesidad real de tener una testGroupaquí, pero en la práctica probablemente querrá tener varias pruebas en ese archivo. Tasty le permite crear un árbol arbitrario de pruebas , en cualquier orden jerárquico que sea útil.