(我想我已经看到了这个问题的答案,但我再也找不到了。我遇到的最接近的是这个问题)。
我正在破解prt并试图为我的更改获取完整的覆盖数据。我的一些新测试调用system($^X, 'prt', ...)
运行子进程。然后我测试这些进程的输出。但是,Devel::Cover 不会在子进程中收集覆盖率数据。我如何收集这些数据,而不会导致 Devel::Cover 在我执行常规操作时运行make test
?目前我有一个丑陋的解决方法(见下文),但我认为必须有一个更简单的方法。
完整的 MCVE 在这里。为了您的方便,要复制的命令行:
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
上达到 100% 的覆盖率。这些开关由自动调用的Getopt::Long处理。如有必要,我可以在自己的代码中使用和处理出口。-h
--help
--version
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
+EUMMmake 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
。受此答案和相应测试的启发,我有以下解决方法:
# 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', ...);