我正在尝试使用HPC在Haskell中编写的某些代码获得(并证明)100%的测试覆盖率。但是,如果我写这样的话:

fac n | n > 0 = n * (fac (n - 1))
      | otherwise = 1

然后,guard语句的第二个表达式始终带有True标记。在一般情况下,最简单的解决方法是什么?

编辑:
只是为了澄清。这段代码:
fac n = if n > 0 then n * (fac (n - 1))
        else 1

与HPC配合良好,(运行它可提供100%的代码覆盖率)。

我基本上正在遭受这个问题的困扰:http://hackage.haskell.org/trac/ghc/ticket/3175

最佳答案

没问题如果将表达式标记为始终为真,则并不意味着覆盖率低于100%。例如,我只是编写了一个基于fac的小型可执行文件,然后在其上运行hpc,并在生成的tix文件上生成hpc报告。

来源:

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))

结果如下:
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)

关键是使用100%表达式,使用100%替代项,使用100%顶级声明。您拥有66%的布尔值覆盖率这一事实是无关紧要的。因此,如果您运行hpc标记并查看生成的hpc_index文件,它将报告顶层,替代项和表达式,但不会报告布尔值。

08-26 05:22