13

私はかなり大規模な Python プロジェクトに取り組んでおり、多くのテストを行ってきました。

アプリケーションの特定の部分には、CPU を集中的に使用するテストが必要であり、コミット前にすべてをテストするという私たちのアプローチは意味をなさないものでした。

それ以来、タグベースの選択的テスト アプローチを採用しています。問題は、コードベースが大きくなるにつれて、このタグ付けスキームを維持するのがやや面倒になることであり、よりスマートなものを構築できないか検討を開始したいと考えています。

以前のジョブでは、テスト システムは、コミットの変更によって影響を受けるコードのみをテストするようなものでした。

Mighty Mooseは、言語に対して同様のアプローチを採用しているようですCLR。これらをインスピレーションとして使用して、私の質問は、プロジェクトでのスマートな選択的テストの代替手段 (ある場合) はありPythonますか?

何もない場合、そのようなものを構築するための最初の良いアプローチは何でしょうか?

4

8 に答える 8

2

アプリケーションの一部の選択的テストを自動化するというアイデアは、確かに興味深いものに思えます。ただし、これは静的に型付けされた言語で達成するのがはるかに簡単であるように感じますが、Python の動的な性質を考えると、特定のコミットによって影響を受けるすべてのテストを確実に検出できるものを取得するには、おそらく深刻な時間の投資になるでしょう。 .

問題を読み、選択的なテストのアイデアを脇に置くと、テスト スイートを分離して実行できるようにテストをグループ化し、フィードバックを短縮できる多くの有用な自動テスト実行戦略を有効にするアプローチが思い浮かびます。次のようなループ:

  • 異なるマシンでの個別のテスト スイートの並列実行
  • ビルド パイプラインのさまざまな段階でテストを実行する
  • 各コミットでいくつかのテストを実行し、夜間ビルドで他のテストを実行します。

したがって、タグを使用してテストを異なる「グループ」に分割するアプローチは賢明だと思いますが、大規模なテスト スイートではこれらの管理が難しくなります。このことを考えると、テスト スイートの管理、特にタグの管理を支援するツールの構築に時間を割く価値があるかもしれません。このようなシステムは、次の情報を収集することで構築できます。

  • テスト結果出力(合否、実行時間、ログ出力)
  • コードカバレッジ出力
  • ソースコード分析

頑張ってください。解決しようとしているのは間違いなく興味深い問題です。これらのアイデアが役立つことを願っています。

于 2013-06-24T08:49:27.560 に答える
0

同様の「フルビルドが長すぎる」問題を抱えたPerlコードベースで以前に行った作業に基づいた、このテーマに関するいくつかのランダムな考え:

  • 依存関係を知ることは、この作業を行うための鍵です。モジュールAがBとCに依存している場合は、どちらかが変更されたときにAをテストする必要があります。Snakefoodは、コード内の依存関係の概要を示す辞書を取得するための良い方法のようですそれを取得してmakefileに変換すると、チェックイン時に「make test」を実行するだけで、すべての依存関係(および必要な依存関係のみ)が再構築されてテストされます。

  • makefileを作成したら、それを並列化する作業を行います。半ダースのテストを並行して実行できれば、実行時間が大幅に短縮されます。

于 2013-03-19T19:06:24.660 に答える
0

を使用している場合はunittest.TestCase、パラメータで実行するファイルを指定できますpattern。その後、変更されたコードに基づいてテストを実行できます。を使用しない場合でもunittest、同様のアプローチを使用できるように、機能領域/モジュールごとにテストを編成する必要があります。

必要に応じて、問題に対する洗練された解決策ではありませんが、各開発者/グループまたは機能コード領域が別のブランチにコミットされている場合は、継続的テスト環境で実行できます。それが完了したら (そして合格したら)、それらをメインのトランク/マスター ブランチにマージできます。

すべてのテストの夜間ジョブと、15 ~ 30 分ごとのブランチごとのテスト (新しいコミットがある場合) の組み合わせで十分です。

于 2012-11-19T06:59:11.690 に答える
0

質問をひっくり返すことを検討してください: 残りのテストを実行できるようにするために、どのテストを除外する必要があるか。Lib/test の CPython テスト スイートは、特に要求されるまでリソースの重いテストを除外します (ビルドボット上にある可能性があるため)。オプションのリソースには、'cpu' (時間)、'largefile' (ディスク容量)、'network' (接続) などがあります。( python -m test -h(3.x では test.regrtest、2.x では test.regrtest) でリスト全体が表示されます。)

残念ながら、「リソースが利用できない場合はスキップ」は、テスト スイートが使用する古い test.regrtest ランナーの機能であるため、その方法を説明することはできませ。unittest にリソースを追加するトラッカーに問題があります。

それまでの間は、次のような方法でうまくいくかもしれません: 上記のような文字列のリストを含む、マシン固有のファイル、exclusives.py を追加します。次に、除外をインポートし、適切な文字列がリストにある場合は、テスト、ケース、またはモジュールをスキップします。

于 2013-07-27T00:33:26.330 に答える
0

過去に何度もこの問題に遭遇し、テストを改善してリファクタリングすることで解決できました。開発方法も、テストの実行にかかる時間も指定していません。TDD を実行している場合、テストは数秒以内に実行する必要があると言えます。それよりも長く実行されるものは、サーバーに移動する必要があります。テストの実行に 1 日以上かかる場合は、実際の問題があり、機能を迅速かつ効果的に提供する能力が制限されます。

于 2013-10-01T02:11:36.623 に答える