cpancover.com的Perl模块覆盖率报告

时间:2019-05-07 15:53:07

标签: perl code-coverage cpan

cpancover.com 生成有关Perl模块代码覆盖率的报告。

我知道这只是使用Devel :: Cover的Web服务器,但是我想简单地理解报告的含义,例如: http://cpancover.com/latest/JSON-PP-4.02/blib-lib-JSON-PP-pm--condition.html

表中的列如下:

  • !l
  • l &&!r
  • l && r

能否请您链接相关文档以理解这一点或向我提供这些报告的初步指导?

2 个答案:

答案 0 :(得分:4)

此处是提供报告格式信息的文档的一部分。

在覆盖测试中,如Devel::Cover tells us,代码中可能存在无法检查的位置:它们是“不可覆盖的”

  

有时您的代码由于某种原因而无法恢复。可能是无法到达的else子句,或者是检查永远不会发生的错误情况。您可以告诉Devel :: Cover某些条件是不可发现的,因此在不执行这些条件时就不会将其视为错误。实际上,如果它们被行使,则被视为错误。 [...]

在处理此问题时,可以考虑语句,分支,条件和子例程。您提供的示例报告涉及“条件”交易,为此文档会说

  

由于Perl短路布尔运算的方式,有三种方法可以使这种条件无法被发现。例如,在$x && $y的情况下,左运算符可能永远不会为真,右运算符可能永远不会为真,整个操作可能永远不会为假。这些条件可以这样建模:

# uncoverable branch true
# uncoverable condition left
# uncoverable condition false
if ($x && !$y) {
    $x++;  # uncoverable statement
}

# uncoverable branch true
# uncoverable condition right
# uncoverable condition false
if (!$x && $y) {
}

通过此讨论,链接的报告更有意义。

例如,这就是我如何想到您链接的第一行。这是一种A && B条件,对可能的情况有以下覆盖:

  • 左侧为假---被测试覆盖(两个)

  • 左为true,右为false --- 包含

  • 左右都正确---覆盖(两个)

然后,我们单击“ 214行”(这是一个链接),以查看总体百分位数覆盖率(66-三分之二)。颜色很明显,可以在this page

上看到代码

文档还说存在多种报告格式,因此您可能需要进一步挖掘。但是,我看不到要看的地方,感到有些不安。

答案 1 :(得分:3)

lr表示表达式的右侧和左侧,数字表示关联表达式为真的次数。

例如,对于以下表达式,0的覆盖范围为l && !r

exists $self->{'true'} and exists $self->{'false'} 

这意味着0测试涵盖了满足以下条件的情况:

(exists $self->{'true'}) && !(exists $self->{'false'})

“逻辑与”和“逻辑或”具有两个输入,可以采用两个值中的每个。

+-----------------+-----------------+
| Left-hand side  | Right-hand side |
+-----------------+-----------------+
| False           | False           |
| False           | True            |
| True            | False           |
| True            | True            |
+-----------------+-----------------+

但是,由于短路,Perl并不总是评估右侧。实际情况如下:

+-----------------------------------+
| Logical AND                       |
+-----------------+-----------------+
| Left-hand side  | Right-hand side |
+-----------------+-----------------+
| False           | -               |
| True            | False           |
| True            | True            |
+-----------------+-----------------+

+-----------------------------------+
| Logical OR                        |
+-----------------+-----------------+
| Left-hand side  | Right-hand side |
+-----------------+-----------------+
| False           | False           |
| False           | True            |
| True            | -               |
+-----------------+-----------------+

Devel :: Cover正在报告这组输入中的哪些已经过测试。

+--------------------------------------------------------+
| Logical AND                                            |
+--------------------+-----------------+-----------------+
| Devel::Cover label | Left-hand side  | Right-hand side |
+--------------------+-----------------+-----------------+
| !l                 | False           | -               |
| l && !r            | True            | False           |
| l && r             | True            | True            |
+--------------------+-----------------+-----------------+

+--------------------------------------------------------+
| Logical OR                                             |
+--------------------+-----------------+-----------------+
| Devel::Cover label | Left-hand side  | Right-hand side |
+--------------------+-----------------+-----------------+
| l                  | True            | -               |
| !l && r            | False           | True            |
| !l && !r           | False           | False           |
+--------------------+-----------------+-----------------+

如果我们查看链接页面的第一行,就会看到

!l        2
l && !r   0
l && r    2

exists $self->{'true'} and exists $self->{'false'} 

那是

!l       meaning  !(exists $self->{'true'})                               was true  2  times.
l && !r  meaning  (exists $self->{'true'}) && !(exists $self->{'false'})  was true  0  times.
l && r   meaning  (exists $self->{'true'}) && (exists $self->{'false'})   was true  2  times.

这意味着(exists $self->{'true'}) && !(exists $self->{'false'})为真从未经过测试。