Diff ve make kullanmak yerine Cabal kullanarak basit birim testleri
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
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 )
]
.cabal
Gibi 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ı stdout
sabit 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 .