ホームページ  >  記事  >  Java  >  失敗した JUnit テストにもう一度合格するチャンスを与えるにはどうすればよいですか?

失敗した JUnit テストにもう一度合格するチャンスを与えるにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-29 06:35:02968ブラウズ

How Can I Give Failing JUnit Tests a Second Chance to Pass?

失敗した JUnit テストを 2 回目のチャンスのために実行する

JUnit では、最初に失敗したテストに 2 回目の合格チャンスを与えるように構成できます。これは、ネットワークの問題やサーバーの応答の遅さなどの外部要因により断続的に失敗する可能性があるテストに特に役立ちます。これを実現するには、次の 2 つの方法があります。

TestRule の使用

TestRule を使用すると、各テスト メソッドの前後に実行されるカスタム ロジックを定義できます。失敗したテストを再試行するための TestRule を作成するには:

<code class="java">public class RetryTestRule implements TestRule {

    private int retryCount;

    public RetryTestRule(int retryCount) {
        this.retryCount = retryCount;
    }

    @Override
    public Statement apply(Statement base, Description description) {
        return new Statement() {
            @Override
            public void evaluate() throws Throwable {
                Throwable caughtThrowable = null;
                for (int i = 0; i < retryCount; i++) {
                    try {
                        base.evaluate();
                        return;
                    } catch (Throwable t) {
                        caughtThrowable = t;
                    }
                }
                throw caughtThrowable;
            }
        };
    }
}

テスト クラスで、目的のテストにルールを適用します:

<code class="java">@Rule
public RetryTestRule retry = new RetryTestRule(3);

カスタム TestRunner の使用

あるいは、runChild() メソッドをオーバーライドするカスタム TestRunner を定義して、各テスト メソッドの実行方法を制御することもできます:

<code class="java">public class RetryTestRunner extends BlockJUnit4ClassRunner {
    private int retryCount;

    public RetryTestRunner(Class<?> testClass) {
        super(testClass);
        Annotation annotation = AnnotationUtils.getAnnotation(testClass, Retry.class);
        if (annotation != null) {
            retryCount = ((Retry) annotation).value();
        }
    }

    @Override
    protected void runChild(FrameworkMethod method, RunNotifier notifier) {
        for (int i = 0; i < retryCount; i++) {
            try {
                super.runChild(method, notifier);
                return;
            } catch (Throwable t) {
                if (i == retryCount - 1) {
                    throw t;
                }                
            }
        }
    }
}</code>

テスト クラスで、@RunWith を指定してカスタム TestRunner を使用します:

<code class="java">@RunWith(RetryTestRunner.class)
@Retry(3)
public class MyTestClass {}</code>

以上が失敗した JUnit テストにもう一度合格するチャンスを与えるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。