6

(これに対する答えを見たと思いますが、もう一度見つけることはできません。私が遭遇した最も近いのはこの質問です)。

私は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--versionexit()-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', ...);

MCVE では、回避策はここにあり、ここで使用されます。

4

1 に答える 1