12

如果我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没有收到测试失败的警告。

4

1 回答 1

6

根据Cabal 用户指南

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

你已经定义了

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

这会运行测试,打印出测试信息,然后总是成功退出。如果你想让 Cabal 知道测试失败,你需要捕获Counts,检查errorsand failures,如果你发现这样,则以非零状态退出。

import System.Exit

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界面。

于 2015-10-02T19:01:51.370 回答