16

10,000 以上のテストを含む Perl ベースのテスト スイートを持っていますが、これをより高速に実行したいと考えています。-jフラグ toを使用してテストしましたproveが、すべてではありませんがほとんどのテストが並行して実行できることがわかりました。

残りのテストを「並列処理に適した」ものにする作業はできますが、そうでないテストが常にあると思います。これを管理する良い方法は何ですか?テストのセット全体を効率的に実行しやすくし、必要に応じてテストを「並列準備ができていない」と簡単にマークできるようにしたいと考えています。

ここに私が見るいくつかのオプションがあります:

  1. いくつかのテストを非並列対応としてサポートするために、prove にパッチを適用することができます
  2. Jenkins は、テスト スイートの実行を管理するために使用されています。非並列テストを独自の実行に分割できます。つまり、あきらめて 2 回のテスト ランを使用します。
  3. TAPおそらく、まだ回復していない2 つの結果ストリームをマージする方法があります。

例外のリストをどのように管理するかについては、あまり関心がありません。テスト ハーネス インフラストラクチャの一部としてリストをファイルに保持するか、各テスト ヘッダーにそのようにマークする何かを入れて、テスト ハーネスが例外のリストを動的に決定することができます。

(テスト スイートは部分的に Test::Class に基づいており、高速化のために Test::Class::Load も検討します。)

4

5 に答える 5

11

解決策を見つけました。TAP::Harness の aggregate_tests()のドキュメントにあります。この目的のために独自のハーネスを作成する方法のコード サンプルが含まれています。

...これは、たとえば、一部のテストを並行して実行する必要があるが、他のテストは並行実行に適していない場合に役立ちます。

my $formatter   = TAP::Formatter::Console->new;
my $ser_harness = TAP::Harness->new( { formatter => $formatter } );
my $par_harness = TAP::Harness->new(
    {   formatter => $formatter,
        jobs      => 9
    }
);
my $aggregator = TAP::Parser::Aggregator->new;

$aggregator->start();
$ser_harness->aggregate_tests( $aggregator, @ser_tests );
$par_harness->aggregate_tests( $aggregator, @par_tests );
$aggregator->stop();
$formatter->summary($aggregator);

そこから、私ができるように見えます:

  • 上記の新しい機能をマージできるサブクラスApp::Proveとオーバーライド。_runtests()
  • の代わりにprove呼び出すようにforkします。My::App::ProveApp::Prove

ピースがどのように組み合わされるかをよりよく理解したので、並列テストから除外するテスト ファイルのリストを含むファイルを指定できるようにする、proveのようなオプションを追加するパッチを作成する方法がわかります。--exclude-from-parallel FILE

UPDATE 2012-08-16:今のところパッチを持ってproveおり、レビューのために提出しました。プル リクエストを表示してコメントすることができます。実行出力の後に要約は生成されません。理由は明らかではありません。

于 2012-08-15T21:19:10.180 に答える
6

私は今、この問題に対するこれまでのところ最良の解決策を見つけました。2008年prove以降、一部のテストを並列ではなく順番に実行するようにマークするための文書化されていないサポートがありました。これは、TAP :: Parser::Schedulerのかなり凝った「ルール」システムに支えられています。並列および順次のテスト実行。

これが基本的な現在のレシピですprove

 # All tests are allowed to run in parallel, except those starting with "p"
 --rules='seq=t/p*.t' --rules='par=**'

この機能のドキュメントを追加する新しいプルリクエストがあり、基本的な例外に対してもより単純な構文を提供する可能性についての議論を開始しました。詳細については、プルリクエストを参照してください。

于 2012-08-20T11:46:50.220 に答える
2

この機能を宣伝する別のソリューションを見つけましたが、簡単なケースしか機能しませんでした。Test::Steeringを使用することです。これにより、次のことが可能になります。

include_tests( { jobs => 4 }, @parallel_tests );
include_tests( @serial_tests  );

このソリューションでは、次のことに注意してください。

  • 実際に機能する前に、現在、コードにパッチを適用して、何年もパッチが適用されていない基本的なバグを修正する必要があります。
  • 実行する並列テストと直列テストのリストの生成を処理するには、追加のコードが必要です。
  • 実世界のテストでは、実際にはまとめられた要約を取得できませんでした...両方のセクションが独自の要約レポートを出力したため、実際には機能しませんでした。多分私は何かを逃したか、多分壊れています。
于 2012-08-17T18:01:10.043 に答える
0

Test::Parallel は、いくつかのテストを並行して実行する簡単な方法も提供します。 https://metacpan.org/pod/Test::Parallelのサンプルを見てください。

于 2013-11-25T16:15:51.547 に答える