haskell - 如何使用 HPC 和 Stack 生成覆盖范围叠加?

标签 haskell code-coverage haskell-stack

我有一个中小型 Haskell 代码库,我想为其生成覆盖率报告。默认情况下,HPC 提供的覆盖率报告充满了漏报(例如,我使用镜头来访问我的大部分记录字段,而不是自动生成的字段,然后 HPC 报告为未覆盖)。

典型的解决方案是生成一些覆盖,如下所示:https://wiki.haskell.org/Haskell_program_coverage#Hpc_toolkit

当我尝试使用 Stack 执行此操作时,我遇到了问题。

$ stack new --resolver=lts-9.5 hpcTest

如果我们将src/Lib.hs编辑为:

module Lib
( someFunc, otherFunc
) where

someFunc :: IO ()
someFunc = putStrLn "someFunc"

otherFunc :: IO ()
otherFunc = putStrLn "otherFunc"

test/spec.hs为:

import Lib

main :: IO ()
main = someFunc

并运行stack test --coverage

我们得到的覆盖率报告并非 100% 覆盖,因此,如果我们按照 wiki 页面的说明进行操作,我们会得到:stack exec hpc --草案 --hpcdir=.stack-work/dist/x86_64- linux/Cabal-1.24.2.0/hpc/--srcdir=. .stack-work/install/x86_64-linux/lts-9.5/8.0.2/hpc/hpcTest/hpcTest-test/hpcTest-test.tix > myDraft.txt

当我们运行时,myDraft.txt 中会产生以下结果:

module "hpcTest-0.1.0.0-HnYRxRg1qoiyMKwsCMtby:Lib" {
  tick function "otherFunc" on line 9;
}

当我们执行下一步并尝试生成覆盖时 stack exec hpc --overlay --hpcdir=.stack-work/dist/x86_64-linux/Cabal-1.24.2.0/hpc/-- srcdir=. myDraft.txt 进程失败,我们收到以下错误:

hpc: can not find hpcTest-0.1.0.0-HnYRxRg1qoiyMKwsCMtby:Lib in ./.hpc, ./.stack-work/dist/x86_64-linux/Cabal-1.24.2.0/hpc/
CallStack (from HasCallStack):
  error, called at libraries/hpc/Trace/Hpc/Mix.hs:122:15 in hpc-0.6.0.3:Trace.Hpc.Mix

我在这个过程中做错了什么以及如何让它发挥作用?

最佳答案

: 替换为 /。代码草案应为

module "hpcTest-0.1.0.0-HnYRxRg1qoiyMKwsCMtby/Lib" {
  tick function "otherFunc" on line 9;
}

通过查看 stack hpc 创建的 tix 文件,我发现这一点。 (笑)

关于haskell - 如何使用 HPC 和 Stack 生成覆盖范围叠加?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46481633/

相关文章:

haskell - 在哪里可以找到正确的 Haskell 包名称和版本?

haskell - 在 Haskell 中向其他线程抛出异常的操作语义

ant - 使用 Emma 和 Ant 设置覆盖阈值

Haskell Stack 构建失败并显示空白错误消息

c# - 代码覆盖率是否包含在 Visual Studio Team Services (Visual Studio Online) 包中

java - Java 8 中的覆盖率报告

haskell - 如何使用 Stack/Cabal 构建早期部分的程序输出作为同一构建后续部分的源?

haskell - Haskell 中的 FFI,关于 LANGUAGE CPP 的问题以及如何在 FFI 中使用 c 结构

list - 如何在 Haskell 中正确使用守卫?

list - Haskell:不使用 (++) 连接列表