2017-01-18 8 views
3

私の状況は簡単です:私は並列テストを行いたいです。私は4つの資格ペアと8つの並列スレッド(パラレルメソッドレベルで)で実行される32のテストを持っていると言うことができます。だから私は立派な生産者 - 消費者の状況だが、パラレルテストの間にいる。TestNGは外部オブジェクトの同期をテストします

私の考えは、(beforeMethodの段階でテストスレッドを同期させる)資格証明オブジェクトのリストを持つことです。最初の4つのスレッドは資格情報を取得し、リストから削除します。他のすべてのスレッドは空のリストを見て、それを待ちます。

実行を終了し、使用済みの資格情報を「afterMethod」フェーズに一覧表示して追加し、このリストでnotifyなどを呼び出すテスト。しかし、問題は、私がこの資格情報のリストを見つけることができる適切な場所がないこと+このプロセスを開始するための単純な "mvnテスト"を使用したいということです。任意のアイデアどのように私はそのような同期を追加できますか? TestNGに類似の機能がある場合は教えてください。

+0

興味深い。あなたの試練を見るのはクールです。 –

+1

なぜスレッドの数を制限しないのですか? 'static'クラスの初期化子でこの資格証明キュー(リスト)に値を設定できないのはなぜですか? –

+0

@ YaroslavStavnichiyあなたのアイデアは私を大いに助けます。ありがとう –

答えて

0

解決済み。主な問題は、TestNGライフサイクルをオーバーライドして、テスト管理を節約することでした。そこで、私はTestNGのソースコードを掘り出し、次の解決策に移りました:

  1. 拡張IExecutionListenerは、必要なデータ(キュー)をパブリックstatic finalメンバーとして格納します。
  2. 同じインターフェイスIExecutionListenerは、TestNGライフサイクルに参加しています.ExecutionStartおよびonExecutionFinishにライフサイクルコールバックがあります。最初はファイルからの資格情報をキューに取り込むために使用され、もう1つはGC作業を容易にするためです。このキューをクリーンアップします。
  3. @BeforeMethodで注釈が付けられたinitメソッドの内部に、読み込まれたキューが使用されました。注:同じクラスであるが異なるテストからのテストを実行する異なるスレッドからのこのメンバーの上書きに直面するので、キューからの値をプレーン・メンバーとして保管しないでください。この変数のスレッド分離を提供するには、ThreadLocalを使用します。
  4. 私の場合に役立つ特別なデータ構造は、getter/setterとしてtakeとputを使用してBlockingQueue(LinkedBlockingQueue実装内)です。
  5. カスタムリスナーをXMLに追加することも忘れないでください。
関連する問題