Отчет о покрытии для модулей Perl cpancover.com - PullRequest
3 голосов
/ 07 мая 2019

cpancover.com создает отчеты о покрытии кода модулями Perl.

Я понимаю, что это просто веб-сервер, использующий Devel :: Cover, но я хотел бы просто понять значение таких отчетов: http://cpancover.com/latest/JSON-PP-4.02/blib-lib-JSON-PP-pm--condition.html

где в таблице есть такие столбцы, как:

  • ! Л
  • l &&! R
  • л && г

Не могли бы вы, пожалуйста, дать ссылку на соответствующий документ, чтобы понять это, или дать мне некоторые начальные указания к этим отчетам?

Ответы [ 2 ]

4 голосов
/ 07 мая 2019

Вот одна часть документации, которая предоставляет информацию о формате отчета.

В тестировании покрытия, как Devel::Cover сообщает нам , в коде могут быть места, которые нельзя проверить: они "неуязвимы"

Иногда у вас есть код, который по какой-то причине невозможно найти. Возможно, это условие 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 - покрыто (два)

Затем мы нажимаем «строку 214» (это ссылка) и видим общий процентный охват (66 - две трети). Цвет говорит о том, и коды можно увидеть на этой странице

В документах также говорится, что существует множество форматов отчетов, так что вы можете копать дальше. Однако я не вижу, где искать, что немного тревожит.

3 голосов
/ 07 мая 2019

l и r относятся к правой и левой части выражения, а число представляет число случаев, когда связанное выражение было истинным.

Например, есть покрытие 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'}) истинность никогда не проверялась.

...