Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何在执行过程中利用hpc信息_Haskell_Ghc_Quickcheck - Fatal编程技术网

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]]"