diff 및 make를 사용하는 대신 Cabal을 사용하는 간단한 단위 테스트

Dec 16 2020

Haskell 및 Cabal 만 사용하도록 Haskell 응용 프로그램의 셸 테스트 코드를 다시 작성하고 싶습니다. (이동성 이유로)

현재 테스트 스키마는 다음과 같습니다.

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 는 다양한 종류의 테스트를 실행할 수있는 간단하고 다양한 프레임 워크입니다. (I 주로 사용 에 대한 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

그런 다음 이것을 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 )
   ]

다음 .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를 사용하면 유용한 계층 적 순서 로 임의 의 테스트 트리 를 만들 수 있습니다 .