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

如何实现类似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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 07:54:01