如何实现类似Jest的按文件匹配运行Haskell测试,配合stack执行相邻.test.hs用例
问题解答
关于package.yaml的匹配能力
package.yaml由hpack工具负责解析,本身不直接支持正则表达式路径匹配,但内置的glob通配符语法完全可以实现你需要的相邻filename.test.hs文件匹配需求。
实现配置示例
你可以参考以下配置修改你的package.yaml:
# 库配置段,要先排除测试文件 library: source-dirs: src other-modules: !exclude "**/*.test" exposed-modules: # 此处填写你正式对外暴露的模块列表 dependencies: - base # 其他库依赖 # 测试套件配置段 tests: your-package-name-test: main: Main.hs source-dirs: - src - test # 通用测试辅助代码可放在该目录下 other-modules: - "**/*.test" # 自动匹配所有后缀为.test.hs的文件,hpack会自动补全.hs后缀 dependencies: - base - your-package-name # 依赖自身库模块 - hspec - hspec-discover # 用于自动发现所有测试模块
如果使用hspec-discover做自动测试加载,只需要在test目录下新建Main.hs,内容仅需一行:
{-# OPTIONS_GHC -F -pgmF hspec-discover #-}
核心注意事项
- 模块名冲突规避:测试文件的模块名要和路径对应,比如
src/A/B.hs的测试文件src/A/B.test.hs需要声明模块为A.B.Test,不要和正式模块重名 - 正式库排除测试文件:必须在库的配置段添加上述的
!exclude规则,避免测试代码被打包到发布的库中,增大体积同时可能泄露内部逻辑 - 自定义测试执行范围:配置完成后执行
stack test会自动运行所有测试,需要单独跑某几个文件的测试时,可以用stack test --test-arguments="-m 模块名关键词"来过滤,和Jest的文件匹配执行逻辑类似 - 大型项目优化:如果项目源码文件超过数千个,直接在src目录下放测试文件会增加glob匹配和模块解析的耗时,这种情况建议在test目录下复刻src的目录结构,把所有
.test.hs放到test目录对应路径下,匹配规则改成test/**/*.test.hs即可
内容的提问来源于stack exchange,提问作者lmonninger
相关产品推荐
相关产品推荐

