You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 20:12:41