Pengujian unit sederhana menggunakan Cabal daripada menggunakan diff dan make

Dec 16 2020

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

1 leftaroundabout Dec 16 2020 at 03:19

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 .cabalfile 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 stdoutkeras-kode (misalnya dalam bentuk printlaporan) maka Anda mungkin perlu untuk hack sekitar ini sedikit.


Tidak perlu testGroupsama 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.