Простые модульные тесты с использованием Cabal вместо использования diff и make

Dec 16 2020

Я хотел бы переписать свой код тестирования оболочки для моего приложения Haskell, чтобы использовать только Haskell и Cabal. (по причинам переносимости)

Текущая схема тестирования выглядит так

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

Я бы хотел что-то вроде

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

Как проще всего это сделать?

Благодарю.

Ответы

1 leftaroundabout Dec 16 2020 at 03:19

Tasty - это простой и универсальный фреймворк, в котором можно запускать различные виды тестов. (Я в основном использую его для тестов QuickCheck , которые, если вы еще этого не сделали, я также настоятельно рекомендую проверить.)

Конкретный вид тестирования, о котором вы спрашиваете, называется (по крайней мере, в Tasty) золотым тестом. Так, например, если программа, которую вы хотите протестировать, была

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

тогда вы можете изменить это на Вкусный тест 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 )
   ]

Используйте .cabalфайл вроде

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

Если программа, которую вы хотите протестировать, имеет stdoutжестко запрограммированный вывод (например, в форме printоператоров), вам, возможно, придется немного поработать над этим .


На самом деле нет необходимости иметь здесь testGroupвообще, но на практике вы, вероятно, захотите иметь несколько тестов в этом файле. Tasty позволяет создавать произвольное дерево тестов в любом полезном иерархическом порядке.