[解決済み] 失敗したJUnitのテストをすぐに再実行するには?
質問
JUnitルールやそれに類するもので、失敗したテストにもう一度実行する機会を与える方法はありますか。
背景 私は、JUnit で書かれた大規模な Selenium2-WebDriver テストのセットを持っています。非常に積極的なタイミング(クリック後の短い待ち時間だけ)のために、いくつかのテスト(100のうちの1つ、そして常に異なるもの)は、サーバーが時々少し遅く応答するために失敗することがあります。しかし、待ち時間をあまり長くすることはできませんし、そうするとテストがずっとかかってしまうからです)。-- ですから、この使用例では、たとえ再試行が必要であってもテストが緑色であることは許容されると思います。
もちろん、2 out of 3 majority(失敗したテストを3回繰り返し、そのうち2回が正しければ正しいとして扱う)があった方が良いのですが、これは将来の改善でしょう。
どのように解決するのですか?
を使って行うことができます。 テストルール . これによって、必要な柔軟性を得ることができます。TestRule はテストの周りにロジックを挿入することができるので、再試行ループを実装することになります。
public class RetryTest {
public class Retry implements TestRule {
private int retryCount;
public Retry(int retryCount) {
this.retryCount = retryCount;
}
public Statement apply(Statement base, Description description) {
return statement(base, description);
}
private Statement statement(final Statement base, final Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
Throwable caughtThrowable = null;
// implement retry logic here
for (int i = 0; i < retryCount; i++) {
try {
base.evaluate();
return;
} catch (Throwable t) {
caughtThrowable = t;
System.err.println(description.getDisplayName() + ": run " + (i+1) + " failed");
}
}
System.err.println(description.getDisplayName() + ": giving up after " + retryCount + " failures");
throw caughtThrowable;
}
};
}
}
@Rule
public Retry retry = new Retry(3);
@Test
public void test1() {
}
@Test
public void test2() {
Object o = null;
o.equals("foo");
}
}
の中心は
TestRule
は
base.evaluate()
で、これがテストメソッドを呼び出します。この呼び出しを中心に、再試行のループを配置します。テストメソッドで例外が発生した場合 (アサーションの失敗は、実際には
AssertionError
である) 場合は、テストは失敗しているので再試行します。
もうひとつ役に立つことがあります。その場合は、上記の Retry クラスにメソッドの特定のアノテーションに対するテストを追加すればよいでしょう。
Description
にはメソッドのアノテーションのリストが含まれます。これについての詳細な情報は、私の答えを参照してください。
どのように@RunWithもAOPも使用せずに、各JUnit @Testメソッドの前にいくつかのコードを個別に実行するのですか?
.
カスタムのTestRunnerを使用する
これはCKuckの提案ですが、独自のRunnerを定義することができます。そのためには BlockJUnit4ClassRunner を拡張し、runChild()をオーバーライドします。詳細については、私の回答 スイートのJUnitメソッドルールを定義するにはどうすればよいですか? . この回答は、スイート内のすべてのメソッドに対してコードを実行する方法を定義する方法について詳しく説明しています。
関連
-
Javaでよくある構文エラー
-
keytool error: java.io.FileNotFoundException: cacerts (アクセス拒否されました。)
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] プライベートメソッド、フィールド、インナークラスを持つクラスをテストするにはどうすればよいですか?
-
[解決済み] JUnit 4のテストで、ある例外が投げられたことをどのように断言しますか?
-
[解決済み] Mavenが実行するJUnitテストを見つけ出せない
-
[解決済み] JUnit 4で条件付きでテストを無視する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
メモ帳でJavaプログラムをコンパイルして実行すると、Could not find or load main class ...というエラーが表示される。解決方法
-
Junitのユニットテストはjava.lang.Testを報告します。
-
java.sql.SQLException: 結果セットの開始前
-
FindBugの使用概要
-
アノテーション「@Retention」の役割
-
Server Tomcat v9.0 Server at localhost の起動に失敗しました。
-
java 365*1000*60*60*24 計算問題
-
switch case文のcaseの後の列挙定数は列挙型なし
-
Zipファイルの圧縮・解凍にantを使用する
-
ApiModel と @ApiModelProperty の使用法