dan*_*rth 4 haskell code-coverage
我试图获得(并证明)我使用HPC在Haskell中编写的一些代码的100%测试覆盖率.但是,如果我写这样的东西:
fac n | n > 0 = n * (fac (n - 1))
| otherwise = 1
Run Code Online (Sandbox Code Playgroud)
然后,guard语句的第二个表达式始终标记为True.在一般情况下,最简单的解决方法是什么?
编辑:只是为了澄清.这段代码:
fac n = if n > 0 then n * (fac (n - 1))
else 1
Run Code Online (Sandbox Code Playgroud)
适用于HPC,(运行它可以提供100%的代码覆盖率).
我基本上遇到了这个问题:http://hackage.haskell.org/trac/ghc/ticket/3175
没有问题.如果表达式标记为始终为true,则这并不意味着您的覆盖率低于100%.举个例子,我刚刚写了一个基于fac的小型可执行文件,然后在它上面运行hpc,hpc报告生成的tix文件.
这是来源:
fac n | n > 0 = n * (fac (n - 1))
| n == 0 = 1
| otherwise = 125 -- An arbitrary value. This of couse is demo code, and not actually a factorial.
main = print (fac 12) >> print (fac (negate 100))
Run Code Online (Sandbox Code Playgroud)
这是结果:
100% expressions used (23/23)
66% boolean coverage (2/3)
66% guards (2/3), 1 always True
100% 'if' conditions (0/0)
100% qualifiers (0/0)
100% alternatives used (3/3)
100% local declarations used (0/0)
100% top-level declarations used (2/2)
Run Code Online (Sandbox Code Playgroud)
关键是使用100%表达式,使用100%替代,使用100%顶级声明.您拥有66%布尔覆盖率这一事实无关紧要.这就是为什么如果你运行hpc标记并查看生成的hpc_index文件,它会报告顶级,替代和表达式,但不报告布尔覆盖.