如何使用HPC和Stack生成覆盖覆盖?

Jam*_*mes 7 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
Run Code Online (Sandbox Code Playgroud)

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

module Lib
( someFunc, otherFunc
) where

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

otherFunc :: IO ()
otherFunc = putStrLn "otherFunc"
Run Code Online (Sandbox Code Playgroud)

test/spec.hs成为:

import Lib

main :: IO ()
main = someFunc
Run Code Online (Sandbox Code Playgroud)

并运行 stack test --coverage

我们得到的覆盖率报告并非100%覆盖,因此如果我们按照维基页面的说明操作,我们会得到: stack exec hpc -- draft --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;
}
Run Code Online (Sandbox Code Playgroud)

然后,当我们进行下一步并尝试生成叠加层时,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
Run Code Online (Sandbox Code Playgroud)

我在这个过程中做错了什么,我怎样才能让它发挥作用?

Zhu*_*uan 1

:用。。。来代替/。代码草案应为

module "hpcTest-0.1.0.0-HnYRxRg1qoiyMKwsCMtby/Lib" {
  tick function "otherFunc" on line 9;
}
Run Code Online (Sandbox Code Playgroud)

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