Menjalankan Ujian JUnit yang Gagal: Penyelesaian Jalankan Semula
Menjalankan semula ujian JUnit yang gagal serta-merta boleh meningkatkan kestabilan suite ujian automatik, terutamanya apabila berhadapan dengan kegagalan yang terputus-putus. Artikel ini meneroka dua pendekatan untuk melaksanakan mekanisme sedemikian.
1. Menggunakan TestRule
A TestRule menyediakan cara yang fleksibel untuk mengubah suai aliran pelaksanaan ujian. Untuk melaksanakan larian semula menggunakan TestRule, takrifkan:
<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; } }; } }
Anotasi ujian yang memerlukan percubaan semula dengan peraturan Cuba Semula:
<code class="java">@Rule public Retry retry = new Retry(3); @Test public void test1() { }
2. Mencipta TestRunner Tersuai
Sebagai alternatif, TestRunner tersuai boleh ditakrifkan untuk mengendalikan larian semula ujian untuk suite tertentu. Panjangkan BlockJUnit4ClassRunner dan ganti kaedah 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>
Tambah anotasi TestRunner pada kelas suite:
<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>
Kedua-dua pendekatan membenarkan kawalan fleksibel ke atas ujian dijalankan semula, menyediakan mekanisme berharga untuk mengendalikan kegagalan terputus-putus dalam ujian JUnit.
Atas ialah kandungan terperinci Bagaimanakah anda boleh melaksanakan mekanisme jalankan semula untuk ujian JUnit yang gagal untuk meningkatkan kestabilan suite ujian?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!