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

Haskell项目HUnit测试在cabal test中未正常运行问题排查

排查Cabal测试未运行自定义用例的常见原因

1. Cabal测试套件配置出错

这是最容易踩的坑:

  • 检查你的.cabal测试段,确保main-is指向你的测试入口文件(比如tests.hs),hs-source-dirs包含测试文件所在的目录(比如tests/)。
  • 确认build-depends里加了你用的测试框架(比如HUnit、tasty),没加的话要么编译失败,要么默认跑个空测试,自然只显示1个“通过”。

举个错误配置的例子:

test-suite my-project-tests
type: exitcode-stdio-1.0
hs-source-dirs: src # 错了:测试文件在tests目录却指向src
main-is: Main.hs # 错了:实际入口是tests.hs
build-depends: base # 错了:没加HUnit这类测试框架依赖

2. 测试入口文件没执行测试逻辑

如果你的tests.hs只定义了测试用例,没写运行它们的代码,Cabal会把整个测试套件当成1个“测试”(只要退出码是0就算通过),但实际上你的两个用例根本没跑。

比如HUnit的错误写法:

import Test.HUnit

test1 = TestCase (assertEqual "1+1=2" 2 (1+1))
test2 = TestCase (assertEqual "2+2=4" 4 (2+2))

-- 这里没写main函数执行测试!

正确写法得加个main函数触发测试:

import Test.HUnit
import System.Exit

test1 = TestCase (assertEqual "1+1=2" 2 (1+1))
test2 = TestCase (assertEqual "2+2=4" 4 (2+2))

allTests = TestList [TestLabel "Test 1" test1, TestLabel "Test 2" test2]

main = do
  counts <- runTestTT allTests
  if errors counts + failures counts == 0
    then exitSuccess
    else exitFailure

3. 测试框架输出未被Cabal正确识别

有些测试框架默认的输出格式,Cabal可能没法解析出具体的用例数,就会默认显示整个套件为1个测试。比如用tasty时,要确保用了对应的测试驱动,或者配置框架输出Cabal能识别的格式。

4. 文件路径或模块命名不匹配

  • 确认测试文件的位置和.cabal里的hs-source-dirs一致,比如测试文件在tests/tests.hs,那hs-source-dirs就得设成tests。
  • 如果用了模块结构,要把测试模块加到other-modules里(不用main-is的情况下)。

5. Cabal缓存搞鬼

有时候Cabal用了旧的编译缓存,根本没重新编译你的测试文件。试试先清缓存再测:

cabal clean
cabal test

内容的提问来源于stack exchange,提问作者Dmitry M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 23:16:16