Einfache Unit-Tests mit Cabal anstelle von Diff und Make

Dec 16 2020

Ich möchte meinen Shell-Testcode für meine Haskell-Anwendung so umschreiben, dass nur Haskell und Cabal verwendet werden. (aus Gründen der Portabilität)

Das aktuelle Testschema sieht folgendermaßen aus

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

Ich hätte gerne so etwas

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

Was ist der einfachste Weg, dies bitte zu tun?

Vielen Dank.

Antworten

1 leftaroundabout Dec 16 2020 at 03:19

Tasty ist ein einfaches und vielseitiges Framework, in dem verschiedene Arten von Tests durchgeführt werden können. (Ich verwende es hauptsächlich für QuickCheck- Tests, die ich - falls Sie es noch nicht getan haben - auch sehr empfehlen.

Die spezielle Art von Test, nach der Sie fragen, wird (zumindest in Tasty) als goldener Test bezeichnet. Zum Beispiel, wenn das Programm, das Sie testen möchten, war

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

dann könnten Sie dies in einen leckeren Test ändern 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 )
   ]

Verwenden Sie eine .cabalDatei wie

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

Wenn das Programm , das Sie testen wollen , hat die Ausgabe zu stdouthart codiert (zB in Form von printAussagen) , dann müssen Sie zu diesem Hack um ein wenig.


Es besteht hier keine wirkliche Notwendigkeit, überhaupt einen testGroupzu haben, aber in der Praxis möchten Sie wahrscheinlich mehrere Tests in dieser Datei haben. Mit Tasty können Sie einen beliebigen Testbaum in beliebiger hierarchischer Reihenfolge erstellen .