11

我有一个 cabal 包,我使用该类型对其进行了test-suite设置,如下所示:exitcode-stdio-1.0

当我使用 运行它时cabal test,cabal 不会打印可执行文件的标准输出/标准错误;它只打印自己的日志信息:

$ cabal test

Running 1 test suites...
Test suite test-foo: RUNNING...
Test suite test-foo: PASS
Test suite logged to: dist/test/foo-0.0.1-test-foo.log
1 of 1 test suites (1 of 1 test cases) passed.
$ 

我想要的输出在该日志文件中:

$ cat dist/test/foo-0.0.1-test-fo.log 
Test suite test-foo: RUNNING...
HUnit group 1:
  Expected connect: [OK]

         Test Cases  Total      
 Passed  1           1          
 Failed  0           0          
 Total   1           1          
Test suite test-foo: PASS
Test suite logged to: dist/test/foo-0.0.1-test-foo.log
$ 

如何让 cabal 将此输出打印到自己的标准输出?我在文档中找不到它。

4

3 回答 3

15

如果您使用的是 Cabal 新测试(在 Cabal 3+ 上默认):

$ cabal new-test --test-show-details=streaming

较旧的 Cabal 版本允许使用以下方式流式传输输出:

$ cabal test --show-details=streaming

--show-details=过滤器

确定单个测试用例的结果是否显示在终端上。可能总是(总是显示)、从不(从不显示)、失败(仅显示失败的结果)或流式传输(实时显示所有结果)。

Cabal 用户指南中阅读更多信息。

于 2013-04-12T09:56:42.037 回答
4

有几个月的新方法了,测试结果甚至写入文件的stdout,最后不刷新

cabal test --show-details=streaming
于 2015-02-14T08:25:11.517 回答
0

使用exitcode-stdio-1.0cabal 时,仅当测试程序返回退出代码(显式“失败”)时才会报告测试日志。一个解决方案是让您的测试程序在任何测试失败时返回错误代码:

import System.Exit (exitFailure, exitSuccess)

main :: IO ()
main = do
  result <- runTests
  if result
    then exitSuccess
    else exitFailure

runTests :: IO Bool
runTests = do
  ...
  return True/False

您仅在编写“手动”测试程序时才需要它:大多数测试报告框架(例如:tastetest-frameworkhspec)已经自动执行此操作。

如果您真的想始终看到结果,您可以随时使用:

  • cabal test --log=/dev/stdout(在另一个答案中给出)
  • exitFailure在执行结束时
于 2014-07-30T17:58:55.933 回答