当我的测试失败时,为什么我的HUnit测试套件会通过?

时间:2015-10-02 18:28:53

标签: unit-testing haskell hunit

如果我有test/Test.hs

module Main where

import Test.HUnit

test1 :: Test
test1 = TestCase $ assertEqual "Should be one" 1 5

test2 :: Test
test2 = TestCase $ assertEqual "Shold both be zero" 0 0

main :: IO Counts
main = runTestTT $ TestList [test1, test2, test1]

.cabal

test-suite my-test
    type:               exitcode-stdio-1.0
    hs-source-dirs:     test
    main-is:            Test.hs
    build-depends:      base >= 4.8.1.0 && <4.9,
                        HUnit >= 1.3
    default-language:   Haskell2010

我运行cabal test --show-details='always'然后我

Test suite my-test: RUNNING...
### Failure in: 0
test/Test.hs:6
Should be one
expected: 1
 but got: 5
### Failure in: 2
test/Test.hs:6
Should be one
expected: 1
 but got: 5
Cases: 3  Tried: 3  Errors: 0  Failures: 2
Test suite my-test: PASS

为什么我的测试套件在我出现故障时通过?同样,如果我cabal sdist我没有得到任何关于我的测试失败的警告。

1 个答案:

答案 0 :(得分:5)

根据Cabal users' guide

  

使用exitcode-stdio-1.0接口的测试套件是可执行文件,用于指示运行时出现非零退出代码的测试失败;它们可以通过标准输出和错误通道提供人类可读的日志信息。

您已定义

main :: IO Counts
main = runTestTT $ TestList [test1, test2, test1]

这会运行测试,打印出测试信息,然后始终成功退出。如果您希望Cabal知道测试失败,您需要捕获Counts,检查errorsfailures,如果找到,则退出非零状态。< / p>

main :: IO ()
main = do
  results <- runTestTT $ TestList [test1, test2, test1]
  if (errors results + failures results == 0)
    then
      exitWith ExitSuccess
    else
      exitWith (ExitFailure 1)

test-framework包提供了方便的defaultMain函数来执行此类操作;你可能想要考虑这种方法。

您应该注意exitcode-stdio-1.0接口被视为半弃用; Cabal维护者建议切换到他们更多的Haskellian detailed-0.9界面。