【问题标题】:Is this a bug in Devel::Cover code coverage?这是 Devel::Cover 代码覆盖率中的错误吗?
【发布时间】:2020-11-12 07:29:32
【问题描述】:

我有一个示例代码,其中有if 语句和or 运算符。在我的测试中,我检查:

0X
10
11

当我检查代码覆盖率时,它显示条件的覆盖率为 67%。我在这里遗漏了什么或者这是Devel:Cover中的一个错误@

这是我的代码:

use strict;
use diagnostics;
use warnings;
use Test::More tests => 3;


sub defined_values{
    my ($a,$b) = @_;

    if( not defined $a or not defined $b ){
        return 'not defined';
    }

    return 'defined';
}

test_defined_values_aNotDefined_returns_notDefined();
test_defined_values_bNotDefined_returns_notDefined();
test_defined_values_abDefined_returns_Defined();

sub test_defined_values_aNotDefined_returns_notDefined{
    is(defined_values(undef, 'b'), 'not defined', 'test_defined_values_aNotDefined_returns_notDefined');
}

sub test_defined_values_bNotDefined_returns_notDefined{
    is(defined_values('a', undef), 'not defined', 'test_defined_values_bNotDefined_returns_notDefined');    
}

sub test_defined_values_abDefined_returns_Defined{
    is(defined_values('a', 'b'), 'defined', 'test_defined_values_abDefined_returns_Defined');    
}

顺便说一下,实际的子程序在包里,这是写在测试文件中的示例代码。

我使用 Jenkins 来运行开发覆盖以进行代码覆盖。以下是我使用的命令:

cd .\usr

if exist cover_db\NUL call cover -delete
if exist test_output\NUL rmdir /S /Q test_output
del /S t\*.tap

set HARNESS_PERL_SWITCHES=-MDevel::Cover
set PERL_TEST_HARNESS_DUMP_TAP=.\test_output
call prove -I .\lib --formatter=TAP::Formatter::Jenkins -l t

for /f "tokens=*" %%A in ('forfiles /S /P t /C "cmd /c if @isdir==TRUE echo @relpath"') do (
    set "file=%%~A"
    setlocal enableDelayedExpansion
    call prove -I .\lib --formatter=TAP::Formatter::Jenkins -l t!file:~1!
    endlocal
)

cover -report html

【问题讨论】:

  • 如何传递定义的值(undef,undef); ?
  • @toolic 我的错,标题是骗人的。我意识到这个错误不在于 Test::More,而是代码覆盖率。 @jmcneirney 条件 undef undef undef defined 相同,因为布尔运算符是短路运算符。
  • BTW 避免使用$a$b。这些是神奇的全局变量,总是被sort 声明和使用。如果您在未声明的情况下使用它们,您将不会收到来自strict 的警告。

标签: perl unit-testing code-coverage


【解决方案1】:

是的,您应该将其报告为 Devel::Cover 中的错误。如果我重新编码你的潜艇,我会得到 100%:

sub defined_values{
    my ($a,$b) = @_;

    if( defined $a and defined $b ){
        return 'defined';
    }
    return 'not defined';
}

This issue may be related.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    相关资源
    最近更新 更多