尽管存在测试失败,但仍会运行"cabal测试"

zou*_*oul 5 haskell unit-testing cabal

我有一个Cabal测试目标:

test-suite Tests
  type:              exitcode-stdio-1.0
  main-is:           Main.hs
  hs-source-dirs:    test, src
  build-depends:     base, …
  default-language:  Haskell2010
Run Code Online (Sandbox Code Playgroud)

一个简单的测试Main.hs:

import Test.HUnit
testSanity = TestCase $ assertEqual "Should fail" 2 1
main = runTestTT testSanity
Run Code Online (Sandbox Code Playgroud)

现在运行cabal test通行证:

Test suite Tests: RUNNING...
Test suite Tests: PASS
Test suite logged to: dist/test/Project-0.1.0-Tests.log
1 of 1 test suites (1 of 1 test cases) passed.
Run Code Online (Sandbox Code Playgroud)

即使在测试套件日志中正确记录了失败:

Test suite Tests: RUNNING...

Cases: 1  Tried: 0  Errors: 0  Failures: 0

### Failure:
Should fail
expected: 2
 but got: 1
Cases: 1  Tried: 1  Errors: 0  Failures: 1
Test suite Tests: PASS
Test suite logged to: dist/test/Project-0.1.0-Tests.log
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Nov*_*zen 7

main必须是类型的IO a地方a可以是任何东西,而价值是不以任何方式对项目的POSIX退出状态并列.您需要查看Counts返回的runTest并明确选择成功或失败的输出代码.

import System.Exit

main :: IO ()
main = do
    cs@(Counts _ _ errs fails) <- runTestTT testSanity
    putStrLn (showCounts cs)
    if (errs > 0 || fails > 0) 
        then exitFailure
        else exitSuccess
Run Code Online (Sandbox Code Playgroud)