Cabal的Distribution.TestSuite.Progress数据类型如何正确使用?测试进度无输出问题
如何正确使用Distribution.TestSuite.Progress数据类型?
我在detailed-0.9测试套件中定义了一个简单的TestInstance:
tests :: IO [Test] tests = return [Test testInstance] testInstance :: TestInstance testInstance = TestInstance { run = ioProgress, name = "test 1", tags = [], options = [], setOption = \_ _ -> Left "" } ioProgress :: IO Progress ioProgress = progress 3 where progress :: Int -> IO Progress progress 0 = return (Finished (Fail "failed")) progress n = return (Progress ("n == " ++ show n) (progress (n - 1)))
原本预期测试运行时输出:
n == 3 n == 2 n == 1
但即使使用--test-show-details=always和--test-show-details=streaming参数,也从未看到这些字符串输出。
问题原因与解决方案
核心问题是测试实例未声明支持ShowDetails选项,也未正确处理该选项的设置,导致测试运行器无法启用中间进度消息的输出。
修改后的代码如下:
import Distribution.TestSuite ( TestInstance(..), Test(..), Progress(..), Result(..), Option(ShowDetails), OptionValue(ShowDetailsLevel), ShowDetailsLevel(..) ) tests :: IO [Test] tests = return [Test testInstance] testInstance :: TestInstance testInstance = TestInstance { run = ioProgress, name = "test 1", tags = [], options = [ShowDetails], -- 声明支持ShowDetails选项 setOption = \opt val -> case (opt, val) of (ShowDetails, ShowDetailsLevel _) -> Right testInstance _ -> Left "Unsupported option" } ioProgress :: IO Progress ioProgress = progress 3 where progress :: Int -> IO Progress progress 0 = return (Finished (Fail "failed")) progress n = return (Progress ("n == " ++ show n) (progress (n - 1)))
关键说明
- 在
options字段中添加ShowDetails,告诉测试运行器该实例支持显示进度细节的配置。 setOption函数需要正确处理ShowDetails选项的设置(即使不需要调整内部逻辑,也要返回成功),否则运行器会忽略传入的--test-show-details参数。- 运行测试时使用
cabal test --test-show-details=streaming,即可看到预期的中间进度输出。
内容的提问来源于stack exchange,提问作者ljbw
相关产品推荐
相关产品推荐

