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

如何合并多架构下的HPC测试覆盖率报告?

跨OS/架构合并Haskell代码覆盖率报告解决方案

核心问题分析

你遇到的问题本质是HPC的.tix覆盖文件与编译生成的.mix符号文件强绑定:不同OS/架构下,Stack的构建哈希(由依赖、系统库、编译选项共同决定)不同,导致生成的.mix文件哈希不一致。直接合并不同环境的.tix文件时,HPC无法识别它们属于同一代码库,因此出现找不到文件或合并为空的情况。

具体解决步骤

1. 统一构建环境(关键前提)

要正确合并覆盖率数据,必须保证两次测试使用完全相同的编译产物(即.mix文件一致):

  • Stack环境:在Linux上使用stack test --coverage --docker,指定与macOS相同的resolver,确保依赖快照和编译环境一致,消除哈希差异。
  • Cabal环境:切换到Cabal后,使用cabal v2-build --enable-coverage,它的构建产物结构更稳定,跨OS的哈希一致性更好。

2. 正确合并.tix文件并生成报告

当.mix文件一致后:

  1. 将其中一个环境的.tix文件(比如Linux的all.tix)复制到另一个环境的项目目录中。
  2. 执行合并命令:
    hpc combine --output combined.tix .stack-work/install/x86_64-linux-tinfo6/hash2/9.10.2/hpc/combined/all/all.tix .stack-work/install/aarch64-osx/hash1/9.10.2/hpc/combined/all/all.tix
    
  3. 生成合并后的覆盖率报告:
    # Stack环境
    stack hpc report combined.tix
    # Cabal环境
    cabal v2-test --enable-coverage --hpc-report --hpc-combine combined.tix
    
    此时报告会正确显示两次测试中都未执行的代码(如果有的话),你的示例代码中两个分支都会被标记为已覆盖。

3. 哈希无法统一的临时处理方案

如果无法统一构建哈希,只能手动处理覆盖数据:

  • 分别在两个环境生成HTML报告,提取每个分支的执行状态,手动合并结果。
  • 编写Haskell脚本,使用hpc库解析两个.tix文件,合并每个代码位置的执行计数,再生成自定义报告。这种方式能保留分支级的覆盖精度,比行统计更准确。

4. 工具替代方案

  • 使用hpc-coveralls工具,它支持合并多个.tix文件,并生成兼容主流覆盖率服务的报告格式。
  • 更换覆盖率服务为支持HPC跨环境合并的平台,这类服务能自动识别同一代码库的不同环境覆盖数据,合并后生成准确的分支覆盖报告。

针对你遇到的错误解释

  • stack hpc report报错找不到哈希:因为不同环境的构建哈希不同,Stack无法找到对应环境下的.mix文件。
  • hpc combine生成空文件:两个.tix文件对应的.mix文件哈希不匹配,HPC认为它们不属于同一程序,因此合并后无有效数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 11:14:51