如何处理Perl脚本和模块的代码覆盖?

时间:2009-12-23 17:05:13

标签: perl code-coverage

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

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

所以我正在使用CPAN中的Devel::CoverModule::BuildTest::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模块完成相同的操作吗?

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

1 个答案:

答案 0 :(得分:5)

收集覆盖率统计信息

要收集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实用程序输出已执行的所有行。您应该在执行所有测试后运行它。默认情况下,标准模块将从报告中排除。