运行`cover -test`时,如何从子进程中收集覆盖率? (开发::封面)

时间:2019-07-02 16:25:24

标签: perl code-coverage spawn perl5 devel-cover

(我想我已经找到了答案,但是我找不到了。我遇到的最接近的是this question。)

我正在入侵prt,并试图获取有关更改的完整报告。我的一些新测试调用system($^X, 'prt', ...)运行子进程。然后,我测试这些过程的输出。但是,Devel :: Cover不会在子进程中收集coverage数据。在执行常规make test时,如何在不导致Devel :: Cover运行的情况下收集数据?目前,我有一个丑陋的解决方法(请参阅下文),但我认为必须有一种更简单的方法。

完整的MCVE为here。方便复制的命令行:

git clone https://github.com/cxw42/multi-process-devel-cover-test.git ; cd multi-process-devel-cover-test ; perl Makefile.PL ; make ; cover -test

t/01-help.t的第11行中注释以下解决方法。

编辑我使用system的原因是为了获得-h / --help / --version的100%覆盖率。这些开关由Getopt::Long处理,this answer自动调用exit()。如有必要,我可以使用-exitval=>NOEXIT并用自己的代码处理退出。

不起作用的东西

PERL5OPT

$ PERL5OPT=-MDevel::Cover=-silent,1 cover -test
/home/cxw/perl5/perlbrew/perls/perlcygbrew-5.26.2-1/bin/cover shouldn't be run with coverage turned on.

HARNESS_PERL_SWITCHES + cover

$ HARNESS_PERL_SWITCHES=-MDevel::Cover=-silent,1 cover -test
...
t/01-help.t .. # Devel::Cover not covering
...
----- ------ ------ ------ ------ ------ ------ ------
File    stmt   bran   cond    sub    pod   time  total
----- ------ ------ ------ ------ ------ ------ ------
Total    n/a    n/a    n/a    n/a    n/a    n/a    n/a
----- ------ ------ ------ ------ ------ ------ ------

HARNESS_PERL_SWITCHES + EUMM make test

$ HARNESS_PERL_SWITCHES=-MDevel::Cover=-silent,1 make test
...
t/01-help.t .. # Devel::Cover not covering
...
$ (export HARNESS_PERL_SWITCHES=-MDevel::Cover=-silent,1 ; make test)
...
t/01-help.t .. # Devel::Cover not covering
...

当前解决方法

目前,我发现的唯一方法是在调用-MDevel::Cover时手动将system添加到命令行中。受the corresponding testshere的启发,我有以下解决方法:

# Detect whether Devel::Cover is running
my $is_covering = !!(eval 'Devel::Cover::get_coverage()');
my @perl = ($^X, $is_covering ? ('-MDevel::Cover=-silent,1') : ());
diag $is_covering ? 'Devel::Cover running' : 'Devel::Cover not covering';

# Pass the Devel::Cover option, if any, to the child process
system(@perl, 'prt', ...);

在MCVE中,解决方法是here,使用的是concatenate periods to get time sequences, simultaneously for different starting points

1 个答案:

答案 0 :(得分:2)

我认为这或类似的事情可能是您能做的最好的事情。

Devel :: Cover几乎被设计为一种开发工具,因此,假设您一次将测试一个项目。看来您真的想在这里测试两个项目。如果不是这种情况,那么也许有比使用系统更好的组合部件的方法?

但是,如果您当前的解决方案是组合此代码的最佳方法,那么我不确定是否有更好的方法来获得完整的覆盖范围。例如,如果您想要覆盖,则可能是明确的并设置了环境变量,或者可以设置$ PERL5OPT而不是更改系统调用,但是从本质上讲,这是相同的解决方案。