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
相关产品推荐
相关产品推荐

