Semplici unit test utilizzando Cabal invece di utilizzare diff e make

Dec 16 2020

Vorrei riscrivere il mio codice di test della shell per la mia applicazione Haskell per utilizzare solo Haskell e Cabal. (per motivi di portabilità)

Lo schema di test corrente è simile a questo

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

Mi piacerebbe avere qualcosa di simile

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

Qual è il modo più semplice per farlo, per favore?

Grazie.

Risposte

1 leftaroundabout Dec 16 2020 at 03:19

Tasty è un framework semplice e versatile in cui eseguire vari tipi di test. (Lo uso principalmente per i test QuickCheck , che - se non l'hai ancora fatto - consiglio vivamente di controllare anche.)

Il particolare tipo di test di cui stai chiedendo è chiamato (almeno in Tasty) un test d'oro . Quindi, ad esempio, se il programma che vuoi testare fosse

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

allora potresti cambiarlo in un test gustoso 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 .cabalfile come

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

Se il programma che vuoi testare ha un output in stdouthard-coded (ad esempio sotto forma di printistruzioni), allora potresti dover aggirare un po 'questo.


† Non c'è davvero bisogno di avere un file testGroupqui, ma in pratica probabilmente vorrai avere più test in quel file. Tasty ti consente di creare un albero arbitrario di test , in qualunque ordine gerarchico sia utile.