Diff ve make kullanmak yerine Cabal kullanarak basit birim testleri

Dec 16 2020

Haskell uygulamam için kabuk test kodumu yalnızca Haskell ve Cabal kullanacak şekilde yeniden yazmak istiyorum. (taşınabilirlik nedenleriyle)

Mevcut test şeması şuna benzer

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

Bir şeye sahip olmak isterim

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

Bunu yapmanın en kolay yolu nedir lütfen?

Teşekkürler.

Yanıtlar

1 leftaroundabout Dec 16 2020 at 03:19

Tasty , çeşitli test türlerinin çalıştırılabileceği basit ve çok yönlü bir çerçevedir. (Çoğunlukla QuickCheck testleri için kullanıyorum , ki - henüz yapmadıysanız - kontrol etmenizi de şiddetle tavsiye ederim.)

Sorduğunuz belirli test türüne (en azından Tasty'de) altın test denir . Yani, örneğin test etmek istediğiniz program

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

sonra bunu Lezzetli bir teste dönüştürebilirsiniz 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 )
   ]

.cabalGibi bir dosya kullan

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

Test etmek istediğiniz programın çıktıları stdoutsabit kodlanmışsa (örn. printİfadeler şeklinde ), bu konuda biraz uğraşmanız gerekebilir .


Burada gerçekten a olması gerekmez testGroup, ancak pratikte muhtemelen o dosyada birden fazla test yaptırmak isteyeceksiniz. Tasty, hangi hiyerarşik sıralama yararlı olursa olsun, rastgele bir test ağacı oluşturmanıza olanak tanır .