如何在执行期间使用hpc信息

时间:2014-04-06 14:57:02

标签: haskell ghc quickcheck

考虑以下用例: 我有一个QuickCheck测试套件,包含两个测试用例prop_testCase1prop_testCase2。使用hpc我可以观察我的测试套件的代码覆盖率。

但是,我希望<{1}}和prop_testCase1覆盖单独的结果(然后进一步处理结果)。 一种方法可能是多次运行可执行文件,将测试用例明确指定为命令行参数,并在每次运行后处理生成的tix文件。

然而,我宁愿在图书馆中隐藏这种逻辑。实际上,我想运行的不只是两个测试用例。因此,为每个测试用例显式地重新执行二进制文件似乎相当不方便。 与此同时,我想象hpc在程序执行期间将覆盖数据保存在某种中间数据结构中。

问题:有没有办法认识到程序是用hpc符号编译的,并以某种方式访问​​hpc在运行时生成的数据?

1 个答案:

答案 0 :(得分:0)

我想我找到了达到预期效果的方法。 所需的功能由Trace.Hpc.Reflect模块提供。 不幸的是,文档有点缺乏。

尽管如此,这是一个似乎有用的最小例子:

import Trace.Hpc.Reflect

main :: IO () 
main = do 
  print (show $ f 5)
  tix <- examineTix 
  print (show tix)
  print (show $ f 6)
  print (show $ f 7)
  tix <- examineTix 
  print (show tix)
  return ()


f x = x*2

编译并运行如下:

$ ghc -fhpc Main
[1 of 1] Compiling Main             ( Main.hs, Main.o )
Linking Main ...
$ ./Main
"10"
"Tix [TixModule \"Main\" 3889152622 31 [1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1]]"
"12"
"14"
"Tix [TixModule \"Main\" 3889152622 31 [3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, in1,1,1,1,0,0,0,0,0,1,1]]"

因此,使用此功能可以在程序执行时使用hpc提供的覆盖率数据。

如果在没有hpc支持的情况下编译可执行文件,程序仍然有效,但examineTix返回的Tix对象包含空列表。