drt*_*vdr 5 perl code-coverage devel-cover module-build test-more
我在合并数据以覆盖Perl脚本和模块时遇到问题。单独运行Devel :: Cover效果很好,但是当我尝试合并数据时,我失去了Perl脚本而不是模块的统计信息。
让我解释..
我有一个看起来像这样的目录树。
Code_Coverage_Test
|
|---->lib
|
|---->t
|
Run Code Online (Sandbox Code Playgroud)
在根Code_Coverage_Test目录中,我具有Build.pl文件,该文件为模块和脚本构建测试,这些模块启动了另外两个脚本,这些脚本可以为我自动执行一些命令。
./Build.pl
#!/usr/bin/perl -w
use strict;
use Module::Build;
my $buildTests = Module::Build->new(
module_name => 'testPMCoverage',
license => 'perl',
dist_abstract => 'Perl .pm Test Code Coverage',
dist_author => 'me@myEmail.com',
build_requires => {
'Test::More' => '0.10',
},
);
$buildTests->create_build_script();
Run Code Online (Sandbox Code Playgroud)
./startTests.sh
#!/bin/sh
cd t
./doPMtest.sh
./doPLtest.sh
cd ../
perl Build testcover
Run Code Online (Sandbox Code Playgroud)
在lib dir内,有我要在其上运行代码覆盖率的文件。
lib / testPLCoverage.pl
#!/usr/bin/perl -w
use strict;
print "Ok!";
Run Code Online (Sandbox Code Playgroud)
lib / testPMCoverage.pm
use strict;
use warnings;
package testPMCoverage;
sub hello {
return "Hello";
}
sub bye {
return "Bye";
}
1;
Run Code Online (Sandbox Code Playgroud)
在t dir中,我有该模块的.t测试文件,以及两个为我启动测试的脚本。.两者均由根目录中的startTests.sh调用
t / testPMCoverage.t
#!/usr/bin/perl -w
use strict;
use Test::More;
require_ok( 'testPMCoverage' );
my $test = testPMCoverage::hello();
is($test, "Hello", "hello() test");
done_testing();
Run Code Online (Sandbox Code Playgroud)
t / doPLtest.sh
#!/bin/sh
#Test 1
cd ../
cd lib
perl -MDevel::Cover=-db,../cover_db testPLCoverage.pl
Run Code Online (Sandbox Code Playgroud)
t / doPMtest.sh
#!/bin/bash
cd ../
perl Build.pl
perl Build test
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,当doPLtests.sh脚本运行时,我得到覆盖率数据,没问题。
---------------------------- ------ ------ ------ ------ ------ ------ ------
File STMT Bran Cond Sub pod Time total
---------------------------- ------ ------ ------ ------ ------ ------ ------
testPLCoverage.pl 100.0 n/a n/a 100.0 n/a 100.0 100.0
Total 100.0 n/a n/a 100.0 n/a 100.0 100.0
---------------------------- ------ ------ ------ ------ ------ ------ ------
Run Code Online (Sandbox Code Playgroud)
但是,当doPMtest.sh脚本完成并且startTests.sh脚本启动Build testcover命令时,我一路上丢失了这些数据,并且得到了这些消息...
Reading database path/Code_Coverage_Tests/cover_db
Devel::Cover: Warning: can't open testPLCoverage.pl for MD5 digest: No such file or directory
Devel::Cover: Warning: can't locate structure for statement in testPLCoverage.pl
Devel::Cover: Warning: can't locate structure for subroutine in testPLCoverage.pl
Devel::Cover: Warning: can't locate structure for time in testPLCoverage.pl
Run Code Online (Sandbox Code Playgroud)
..以某种方式我丢失了数据
---------------------------- ------ ------ ------ ------ ------ ------ ------
File STMT Bran Cond Sub pod Time total
---------------------------- ------ ------ ------ ------ ------ ------ ------
blib/lib/testPMCoverage.pm 87.5 n/a n/a 75.0 0.0 100.0 71.4
testPLCoverage.pl n/a n/a n/a n/a n/a n/a n/a
Total 87.5 n/a n/a 75.0 0.0 100.0 71.4
---------------------------- ------ ------ ------ ------ ------ ------ ------
Run Code Online (Sandbox Code Playgroud)
如何结合使用Perl模块和Perl脚本测试,以在一个文件中获得有效的代码覆盖率?
小智 5
Perl 不存储它使用的文件的完整路径。如果它通过相对路径找到文件,则只存储相对路径。您可以在来自这些文件的警告和错误消息中 perl 显示的路径中看到这一点。
当 Devel::Cover 处理文件时,它使用 perl 给出的路径。您可以在来自 Devel::Cover 的报告中看到这一点,其中有 testPLCoverage.pl 和 blib/lib/testPMCoverage.pm。
这在实践中对您来说意味着,无论何时将coverage 放入coverage DB 时,都应确保从同一目录中执行此操作,以便Devel::Cover 可以匹配并定位coverage DB 中的文件。
我认为这是您遇到的问题。
我的建议是在 t/doPLtest.sh 中你不要 cd 到 lib。您可以运行以下内容:
perl -Mblib -MDevel::Cover=-db,../cover_db lib/testPLCoverage.pl
(顺便说一句,为什么该文件在 lib 中?)
我认为这意味着 Devel::Cover 将在每种情况下从项目根目录运行,因此应该允许它匹配并查找文件。