ホームページ >Java >&#&チュートリアル >テスト スイートの安定性を向上させるために、失敗した JUnit テストの再実行メカニズムを実装するにはどうすればよいでしょうか?

テスト スイートの安定性を向上させるために、失敗した JUnit テストの再実行メカニズムを実装するにはどうすればよいでしょうか?

DDD
DDDオリジナル
2024-10-29 13:29:02942ブラウズ

How can you implement a re-run mechanism for failed JUnit tests to improve test suite stability?

失敗した JUnit テストの実行: 再実行ソリューション

失敗した JUnit テストをすぐに再実行すると、自動テスト スイートの安定性が向上します。特に断続的な障害に対処する場合。この記事では、そのようなメカニズムを実装するための 2 つのアプローチについて説明します。

1. TestRule の利用

TestRule は、テスト実行フローを変更する柔軟な方法を提供します。 TestRule を使用して再実行を実装するには、次を定義します:

<code class="java">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;

                // Retry loop
                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;
            }
        };
    }
}

再試行ルールを使用して再試行が必要なテストに注釈を付けます:

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

@Test
public void test1() {
}

2.カスタム TestRunner の作成

または、特定のスイートのテストの再実行を処理するためにカスタム TestRunner を定義することもできます。 BlockJUnit4ClassRunner を拡張し、runChild() メソッドをオーバーライドします:

<code class="java">public class CustomTestRunner extends BlockJUnit4ClassRunner {

    private int retryCount;

    public CustomTestRunner(Class<?> testClass) {
        super(testClass);
    }

    @Override
    protected void runChild(final FrameworkMethod method, RunNotifier notifier) {
        for (int i = 0; i < retryCount; i++) {
            try {
                super.runChild(method, notifier);
                return;
            } catch (Throwable t) {
                System.err.println(method.getName() + ": run " + (i+1) + " failed");
            }
        }
        System.err.println(method.getName() + ": giving up after " + retryCount + " failures");
        throw new RuntimeException();
    }
}</code>

TestRunner アノテーションをスイート クラスに追加します:

<code class="java">@RunWith(CustomTestRunner.class)
public class TestSuite {

    @BeforeClass
    public static void setUp() { ... }

    @AfterClass
    public static void tearDown() { ... }

    @Test
    public void test1() { ... }

    @Test
    public void test2() { ... }
}</code>

どちらのアプローチでも、テストの再実行を柔軟に制御でき、 JUnit テストで断続的なエラーを処理するための貴重なメカニズム。

以上がテスト スイートの安定性を向上させるために、失敗した JUnit テストの再実行メカニズムを実装するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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