Ausführen fehlgeschlagener JUnit-Tests: Eine Lösung zur erneuten Ausführung
Die sofortige erneute Ausführung fehlgeschlagener JUnit-Tests kann die Stabilität automatisierter Testsuiten verbessern. insbesondere wenn es um zeitweilige Ausfälle geht. In diesem Artikel werden zwei Ansätze zur Implementierung eines solchen Mechanismus untersucht.
1. Verwendung einer TestRule
Eine TestRule bietet eine flexible Möglichkeit, den Testausführungsablauf zu ändern. Um Wiederholungen mithilfe einer Testregel zu implementieren, definieren Sie Folgendes:
<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; } }; } }
Kommentieren Sie Tests, die Wiederholungen erfordern, mit der Wiederholungsregel:
<code class="java">@Rule public Retry retry = new Retry(3); @Test public void test1() { }
2. Erstellen eines benutzerdefinierten TestRunner
Alternativ kann ein benutzerdefinierter TestRunner definiert werden, um Testwiederholungen für eine bestimmte Suite durchzuführen. Erweitern Sie BlockJUnit4ClassRunner und überschreiben Sie die runChild()-Methode:
<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>
Fügen Sie die TestRunner-Annotation zur Suite-Klasse hinzu:
<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>
Beide Ansätze ermöglichen eine flexible Kontrolle über Testwiederholungen und bieten eine wertvoller Mechanismus zur Behandlung zeitweiliger Fehler in JUnit-Tests.
Das obige ist der detaillierte Inhalt vonWie können Sie einen Wiederholungsmechanismus für fehlgeschlagene JUnit-Tests implementieren, um die Stabilität der Testsuite zu verbessern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!