Proste testy jednostkowe przy użyciu Cabal zamiast używać diff i make

Dec 16 2020

Chciałbym przepisać mój kod testujący powłokę dla mojej aplikacji Haskell, aby używał tylko Haskell i Cabal. (ze względu na przenośność)

Obecny schemat testowania wygląda następująco

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

Chciałbym mieć coś takiego

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

Jaki jest najłatwiejszy sposób, aby to zrobić, proszę?

Dzięki.

Odpowiedzi

1 leftaroundabout Dec 16 2020 at 03:19

Tasty to prosty i wszechstronny framework do uruchamiania różnego rodzaju testów. (Używam go głównie do testów QuickCheck , które - jeśli jeszcze tego nie zrobiłeś - gorąco polecam sprawdzić.)

Konkretny rodzaj testu, o który pytasz, nazywa się (przynajmniej w Tasty) złotym testem. Na przykład, jeśli program, który chcesz przetestować, to

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

wtedy możesz zmienić to na Tasty test 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 )
   ]

Użyj .cabalpliku takiego jak

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

Jeśli program, który chcesz przetestować, wyświetla dane wyjściowe stdoutzakodowane na stałe (np. W postaci printinstrukcji), być może będziesz musiał trochę obejść ten problem .


Nie ma takiej potrzeby testGroup, ale w praktyce prawdopodobnie będziesz chciał mieć wiele testów w tym pliku. Tasty pozwala na stworzenie dowolnego drzewa testów , w dowolnej hierarchicznej kolejności, która jest przydatna.