JanakiL、とても良い質問です。解決策を見つけようとしましたが、このタスクのクリーンな解決策を見つけることができませんでした。最終的に機能する回避策を提案することしかできません。したがって、スイートを再実行するには、次の手順を実行する必要があります。
スイート全体を実行するには、@ClassRule を作成する必要があります。次のコードを使用して再試行できるすべてのスイート:
public class Retrier は TestRule を実装します{
private int retryCount;
private int failedAttempt = 0;
@Override
public Statement apply(final Statement base,
final Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
base.evaluate();
while (retryNeeded()){
log.error( description.getDisplayName() + " failed");
failedAttempt++;
}
}
}
retryNeeded() – 再試行が必要かどうかを判断するメソッド
これにより、スイート内のすべてのテストが再試行されます。@AfterClass メソッドの後に再試行することが非常に重要です。
再試行が成功した後に「環境に優しいビルド」が必要な場合は、別の暗いコードをたくさん書く必要があります。
- 失敗した結果の「公開」を許可しない @Rule を作成する必要があります。例として:
public class FailedRule extends TestWatcher {
@Override
public Statement apply(final Statement base, final Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
List<Throwable> errors = new ArrayList<Throwable>();
try {
base.evaluate();
} catch (AssumptionViolatedException e) {
log.error("", e.getMessage());
if (isLastRun()) {
throw e;
}
} catch (Throwable t) {
log.error("", t.getMessage());
if (isLastRun()) {
throw t;
}
}
};
};
}
}
isLastRun() – 最後に実行されたかどうかを検証し、ir が最後に実行された場合にのみテストに失敗するメソッド。
テストが失敗したことをマークして「赤」をビルドするには、最後の再試行のみを公開する必要があります。3. 最後に、テスト クラスで 2 つのルールを登録する必要があります。
@Rule
public FailedRule ruleExample = new FailedRule ();
@ClassRule
public static Retrier retrier = new Retrier (3);
Retrier では、再試行の回数を渡すことができます。
誰かがより良い解決策を提案してくれることを願っています!