【问题标题】:Coverage report for Perl modules by cpancover.comcpancover.com 的 Perl 模块覆盖率报告
【发布时间】:2019-09-25 08:07:09
【问题描述】:

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

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

表中的列如下:

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

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

【问题讨论】:

  • 最后评论:提高了对测试覆盖率的理解,让我发现了一个使用较少的方法的错误,该方法“以前可以工作”????

标签: perl code-coverage cpan


【解决方案1】:

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

在覆盖测试中,如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 的条件,它涵盖了以下可能的情况:

  • left side false --- 被测试覆盖(二)

  • 左真右假 --- 没有覆盖

  • 左右为真---覆盖(二)

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

文档还说有多种报告格式,因此您可能需要进一步挖掘。但是,我不知道该往哪里看,我觉得有点不安。

【讨论】:

  • 谢谢!我对此很陌生,可能我什至没有问正确的问题。现在更清楚了
【解决方案2】:

l和r指表达式的左右两边,数字代表关联表达式为真的次数。

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

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

这意味着0 测试涵盖了以下情况:

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

Logical-and 和logical-or 有两个输入,可以分别取两个值。

+-----------------+-----------------+
| 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'}) 的真实性从未经过测试。

【讨论】:

    猜你喜欢
    • 2016-10-08
    • 1970-01-01
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多