ホームページ >Java >&#&チュートリアル >テスト スイートの安定性を向上させるために、失敗した JUnit テストの再実行メカニズムを実装するにはどうすればよいでしょうか?
失敗した 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 サイトの他の関連記事を参照してください。