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.