Tests unitaires simples utilisant Cabal au lieu d'utiliser diff et make

Dec 16 2020

Je voudrais réécrire mon code de test shell pour mon application Haskell afin d'utiliser uniquement Haskell et Cabal. (pour des raisons de portabilité)

Le schéma de test actuel ressemble à ceci

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

J'aimerais avoir quelque chose comme

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

Quelle est la manière la plus simple de le faire s'il vous plaît?

Merci.

Réponses

1 leftaroundabout Dec 16 2020 at 03:19

Tasty est un cadre simple et polyvalent dans lequel exécuter différents types de tests. (Je l'utilise principalement pour les tests QuickCheck , que - si vous ne l'avez pas encore fait - je recommande vivement de vérifier également.)

Le type particulier de test dont vous parlez s'appelle (au moins dans Tasty) un test d' or . Ainsi, par exemple, si le programme que vous souhaitez tester était

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

alors vous pouvez changer cela en un test 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 )
   ]

Utilisez un .cabalfichier comme

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 le programme que vous souhaitez tester a une sortie stdoutcodée en dur (par exemple sous forme d' printinstructions), vous devrez peut-être pirater un peu.


Il n'est pas vraiment nécessaire d'en avoir un testGroupici, mais en pratique, vous voudrez probablement avoir plusieurs tests dans ce fichier. Tasty vous permet de créer un arbre arbitraire de tests , dans n'importe quel ordre hiérarchique utile.