統合テストではTestNGを使用しています。私たちは最近jUnitから変換して、org.junit.rules.TestRule
を使用して、失敗したとカウントする前に自動的に各テストを3回再試行しました。これにより、テストケースが時折のみ失敗するたびに誤検出がなくなりました。すべてのテストを自動的に3回再試行してから失敗します。
TestNGへの変換では、この再試行ルールが見落とされました。実際に誤検出である「失敗」というテストケースが多数ありました。
私はどのように自動的に再実行TestNGのテストケースの上のいくつかの記事が見つかりました:
https://jepombar.wordpress.com/2015/02/16/testng-adding-a-retryanalyzer-to-all-you-tests/
http://mylearnings.net/11.html
それの要点は、あなたが、個々の@Test
についてretryAnalizer
を指定することができますです-annotatedテストケース。私は自分のアナライザをセットアップし、それをテストケースに適用しました。しかし、すべての単一のテストケースにリトライアナライザを手動で適用することは良い解決策ではありません。の場合、すべてのテストケースがこれを行う必要があります。 jepombar.wordpress.comの記事では、クラス内のすべてのテストに適用する方法を示していますが、何らかの理由で書かれているようには動作しません。
私は、次のIAnnotationTransformer
を作った:
public class RetryListener implements IAnnotationTransformer {
@Override
public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) {
IRetryAnalyzer retry = annotation.getRetryAnalyzer();
if (retry == null) {
annotation.setRetryAnalyzer(RetryRule.class); // my TestNG RetryAnalizer implementation
}
}
}
そして、私はこのようなクラスに適用します:
@Listeners(RetryListener.class)
public class FooTest extends SeleniumMockedTest {
...
}
これは動作しません。 RetryListener.transform()
のコードは決して実行されないので、クラスのテストケースのいずれにもRetryRule
が追加されることはありません。
これを動作させるにはどうすればよいですか?
私の本物の質問:実際に失敗したカウントが失敗する前に、統合テストスイートのすべてのテストケースを自動的に3回試してみるにはどうすればよいですか?
ああ、言わないでください!プログラミングツールにはバグはありません。 ;) –
TestNGはクラスを一度しか読んでいないので、すべてのリスナーが@Listenersで動作するわけではありません。 IAnnotationTransformerは、クラスの読み込み時にトリガされるはずなので、鶏卵問題があります。 – juherr