(Я думаю, что я видел ответ на этот вопрос, но я не могу найти его снова. Самое близкое, с чем я столкнулся, это этот вопрос ).
Я взламываю на 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
Прокомментируйте строку 11 из t/01-help.t
для обходного пути, описанного ниже.
Редактировать Причина, по которой я использую system
, заключается в том, чтобы достичь 100% покрытия по -h
/ --help
/ --version
. Эти переключатели обрабатываются Getopt :: Long , который автоматически вызывает 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
+ МНЕС 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
. Вдохновленный этим ответом и соответствующими тестами , у меня есть следующий обходной путь:
# 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 обходной путь - здесь , и он используется здесь .