Pengujian unit sederhana menggunakan Cabal daripada menggunakan diff dan make
Saya ingin menulis ulang kode pengujian shell saya untuk aplikasi Haskell saya agar hanya menggunakan Haskell dan Cabal. (untuk alasan portabilitas)
Skema pengujian saat ini terlihat seperti ini
make -> binary -> ok or fail
make test -> diff $(binary test-in) test-supposed-out ->
Saya mau membeli sesuatu seperti
cabal build -> binary -> ok or fail
cabal test -> ...testing with test-in and test-supposed-out... ->
Apa cara termudah untuk melakukan ini?
Terima kasih.
Jawaban
Tasty adalah framework sederhana dan serbaguna untuk menjalankan berbagai jenis tes. (Saya kebanyakan menggunakannya untuk tes QuickCheck , yang - jika Anda belum melakukannya - saya sangat menyarankan untuk memeriksanya juga.)
Jenis pengujian tertentu yang Anda tanyakan disebut (setidaknya dalam Tasty) tes emas . Jadi, misalnya jika program yang ingin Anda uji adalah
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
maka Anda bisa mengubahnya menjadi tes 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 )
]
Gunakan .cabal
file seperti
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
Jika program Anda ingin tes telah keluaran ke stdout
keras-kode (misalnya dalam bentuk print
laporan) maka Anda mungkin perlu untuk hack sekitar ini sedikit.
† Tidak perlu testGroup
sama sekali di sini, tetapi dalam praktiknya Anda mungkin ingin memiliki beberapa tes dalam file itu. Tasty memungkinkan Anda membuat pohon pengujian arbitrer , dalam urutan hierarki apa pun yang berguna.