Как собрать покрытие из дочерних процессов при запуске `cover -test`, а не иначе? (Devel :: Обложка) - PullRequest
2 голосов
/ 02 июля 2019

(Я думаю, что я видел ответ на этот вопрос, но я не могу найти его снова. Самое близкое, с чем я столкнулся, это этот вопрос ).

Я взламываю на 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 обходной путь - здесь , и он используется здесь .

1 Ответ

2 голосов
/ 03 июля 2019

Я думаю, что это, или что-то подобное, вероятно, лучшее из того, что вы можете сделать.

Devel :: Cover в значительной степени разработан как инструмент разработки и поэтому предполагает, что вы будете тестировать один проект за раз. Кажется, вы действительно хотите протестировать два проекта здесь. Если это не так, то, возможно, есть лучший способ объединения частей, чем использование системы?

Но если ваше текущее решение является лучшим способом объединения этого кода, то я не уверен, что есть лучший способ получить полное покрытие. Возможно, вы могли бы быть явным и установить переменную окружения, например, если вы хотите охватить, или вы могли бы установить $ PERL5OPT, а не изменять системный вызов, но, по сути, это то же решение.

...