【问题标题】:How to handle code coverage of both Perl scripts and modules?如何处理 Perl 脚本和模块的代码覆盖率?
【发布时间】:2010-12-29 13:40:53
【问题描述】:

我对处理我的 Perl 脚本的代码覆盖率有一个独特的要求。

我编写了一些 Perl 脚本,这些脚本又使用了一些 Perl 模块。我的要求是使用它们支持的不同选项运行这些 Perl 脚本,并评估 Perl 脚本和 Perl 模块的代码覆盖率。

所以我正在使用来自 CPAN 的 Devel::Cover、Module::Build 和 Test::More。如果我直接在测试脚本中调用 Perl 模块中的函数,这一切都很好。但如果我直接调用脚本,它就不起作用(在这种情况下,我不会生成 Perl 模块和脚本的代码覆盖率)。

这是我使用 Test::More 的示例测试脚本:

use strict;
use warnings;
use Test::More; 

BEGIN { plan tests => 1 }

ok(sub {
   my @args = ("ex4200fw","-query-fw","-i","192.168.168.1");
   #print "# Executing @args \n";
   `@args`;
   my $rc = $? >> 8;
   #print "# Return code: $rc \n";
   $rc == 1
}->(),"Query Juniper EX4200 FW, incorrect IP address.\n");

这里ex4200fw(在路径中)是我编写的Perl脚本,它又调用依赖模块updates.pm。

  • 我们有什么工具可以满足这个要求吗?
  • 运行 Perl 脚本并获取脚本及其相关模块的代码覆盖率?
  • 我们可以使用上面的 CPAN 模块完成同样的任务吗?

任何示例脚本对我来说都非常有用。

【问题讨论】:

标签: perl code-coverage


【解决方案1】:

收集覆盖率统计数据

要收集覆盖率统计信息,您需要use Devel::Cover。 (如果您不能直接更改包含脚本的源核心,您可以指定-MDevel::Cover 作为 perl 的参数。)

所以你应该改变你的“测试脚本”来在调用其他 Perl 脚本时添加这个参数,如下所示:

my @args = ("perl", "-MDevel::Cover", "ex4200fw","-query-fw","-i","192.168.168.1");

或者您可以在执行顶级测试脚本之前指定环境变量PERL5OPT=-MDevel::Cover。在这种情况下,您不需要更改任何脚本源。这是一个小外壳示例:

## run tests and gather coverage statistics
export PERL5OPT=-MDevel::Cover
perl test1.pl
perl test2.pl
...

计算结果覆盖率

cover 实用程序可以输出所有已执行的行。您应该在执行完所有测试后运行它。默认情况下,标准模块会从报告中排除。

【讨论】:

    猜你喜欢
    • 2014-05-08
    • 2015-04-02
    • 2018-09-30
    • 1970-01-01
    • 2019-09-25
    • 2011-06-24
    • 1970-01-01
    • 2014-11-09
    • 2012-12-12
    相关资源
    最近更新 更多