Haskell 如何在执行过程中利用hpc信息
考虑以下用例: 我有一个快速检查测试套件,包括两个测试用例Haskell 如何在执行过程中利用hpc信息,haskell,ghc,quickcheck,Haskell,Ghc,Quickcheck,考虑以下用例: 我有一个快速检查测试套件,包括两个测试用例prop\u testCase1和prop\u testCase2。使用我可以观察我的测试套件的代码覆盖率 但是,我希望得到关于prop_testCase1和prop_testCase2的覆盖范围的单独结果(然后进一步处理结果)。 一种解决方法是多次运行可执行文件,将测试用例明确指定为命令行参数,并在每次运行后处理生成的tix文件 然而,我宁愿把这种逻辑藏在图书馆里。实际上,我希望运行的测试用例远远不止两个。因此,为每个测试用例显式地重新
prop\u testCase1
和prop\u testCase2
。使用我可以观察我的测试套件的代码覆盖率
但是,我希望得到关于prop_testCase1
和prop_testCase2
的覆盖范围的单独结果(然后进一步处理结果)。
一种解决方法是多次运行可执行文件,将测试用例明确指定为命令行参数,并在每次运行后处理生成的tix文件
然而,我宁愿把这种逻辑藏在图书馆里。实际上,我希望运行的测试用例远远不止两个。因此,为每个测试用例显式地重新执行二进制代码似乎相当不方便。
同时,我可以想象hpc在程序执行期间将覆盖率数据保存在某种中间数据结构中
问题:是否有办法识别程序已使用hpc符号编译,并以某种方式访问hpc在运行时生成的数据?我想我找到了一种方法来达到预期效果。 所需功能由模块提供。 不幸的是,文档有点缺乏 然而,这里有一个似乎有效的最小示例:
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
因此,在程序执行时,您可以利用hpc提供的覆盖率数据
如果在没有hpc支持的情况下编译可执行文件,则该程序仍能工作,但由Testetix返回的Tix对象包含空列表
$ 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]]"