考虑以下用例:
我有一个QuickCheck测试套件,包含两个测试用例prop_testCase1
和prop_testCase2
。使用hpc我可以观察我的测试套件的代码覆盖率。
但是,我希望<{1}}和prop_testCase1
覆盖单独的结果(然后进一步处理结果)。
一种方法可能是多次运行可执行文件,将测试用例明确指定为命令行参数,并在每次运行后处理生成的tix文件。
然而,我宁愿在图书馆中隐藏这种逻辑。实际上,我想运行的不只是两个测试用例。因此,为每个测试用例显式地重新执行二进制文件似乎相当不方便。 与此同时,我想象hpc在程序执行期间将覆盖数据保存在某种中间数据结构中。
问题:有没有办法认识到程序是用hpc符号编译的,并以某种方式访问hpc在运行时生成的数据?
答案 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对象包含空列表。