Menjalankan Tes JUnit secara terprogram, dari Aplikasi Java

1. Ikhtisar

Dalam tutorial ini, kami akan menunjukkan cara menjalankan pengujian JUnit langsung dari kode Java - ada skenario di mana opsi ini berguna.

Jika Anda baru mengenal JUnit, atau jika Anda ingin meningkatkan ke JUnit 5, Anda dapat memeriksa beberapa dari banyak tutorial yang kami miliki tentang topik tersebut.

2. Ketergantungan Maven

Kami memerlukan beberapa dependensi dasar untuk menjalankan pengujian JUnit 4 dan JUnit 5:

  org.junit.jupiter junit-jupiter-engine 5.2.0 test   org.junit.platform junit-platform-launcher 1.2.0   // for JUnit 4  junit junit 4.12 test 

Versi terbaru JUnit 4, JUnit 5, dan JUnit Platform Launcher dapat ditemukan di Maven Central.

3. Menjalankan Tes JUnit 4

3.1. Skenario Uji

Untuk JUnit 4 dan JUnit 5, kami akan menyiapkan beberapa kelas pengujian "placeholder" yang akan cukup untuk mendemonstrasikan contoh kami:

public class FirstUnitTest { @Test public void whenThis_thenThat() { assertTrue(true); } @Test public void whenSomething_thenSomething() { assertTrue(true); } @Test public void whenSomethingElse_thenSomethingElse() { assertTrue(true); } }
public class SecondUnitTest { @Test public void whenSomething_thenSomething() { assertTrue(true); } @Test public void whensomethingElse_thenSomethingElse() { assertTrue(true); } }

Saat menggunakan JUnit 4, kami membuat kelas pengujian dengan menambahkan anotasi @Test ke setiap metode pengujian.

Kami juga dapat menambahkan anotasi berguna lainnya, seperti @Before atau @After , tetapi itu tidak termasuk dalam cakupan tutorial ini.

3.2. Menjalankan Kelas Tes Tunggal

Untuk menjalankan pengujian JUnit dari kode Java, kita dapat menggunakan kelas JUnitCore (dengan tambahan kelas TextListener , digunakan untuk menampilkan keluaran di System.out ):

JUnitCore junit = new JUnitCore(); junit.addListener(new TextListener(System.out)); junit.run(FirstUnitTest.class);

Di konsol, kita akan melihat pesan yang sangat sederhana yang menunjukkan pengujian yang berhasil:

Running one test class: .. Time: 0.019 OK (2 tests)

3.3. Menjalankan Beberapa Kelas Tes

Jika kita ingin menentukan beberapa kelas pengujian dengan JUnit 4, kita dapat menggunakan kode yang sama seperti untuk satu kelas, dan cukup menambahkan kelas tambahan:

JUnitCore junit = new JUnitCore(); junit.addListener(new TextListener(System.out)); Result result = junit.run( FirstUnitTest.class, SecondUnitTest.class); resultReport(result);

Perhatikan bahwa hasilnya disimpan dalam instance kelas Hasil JUnit , yang kami cetak menggunakan metode utilitas sederhana:

public static void resultReport(Result result) { System.out.println("Finished. Result: Failures: " + result.getFailureCount() + ". Ignored: " + result.getIgnoreCount() + ". Tests run: " + result.getRunCount() + ". Time: " + result.getRunTime() + "ms."); } 

3.4. Menjalankan Rangkaian Uji

Jika kita perlu mengelompokkan beberapa kelas pengujian untuk menjalankannya, kita dapat membuat TestSuite . Ini hanyalah kelas kosong tempat kami menetapkan semua kelas menggunakan anotasi JUnit:

@RunWith(Suite.class) @Suite.SuiteClasses({ FirstUnitTest.class, SecondUnitTest.class }) public class MyTestSuite { }

Untuk menjalankan tes ini, kami akan kembali menggunakan kode yang sama seperti sebelumnya:

JUnitCore junit = new JUnitCore(); junit.addListener(new TextListener(System.out)); Result result = junit.run(MyTestSuite.class); resultReport(result);

3.5. Menjalankan Tes Berulang

Salah satu fitur menarik dari JUnit adalah kita dapat mengulangi pengujian dengan membuat instance RepeatTest . Ini bisa sangat membantu saat kita menguji nilai acak, atau untuk pemeriksaan kinerja.

Dalam contoh berikutnya, kami akan menjalankan pengujian dari MergeListsTest lima kali:

Test test = new JUnit4TestAdapter(FirstUnitTest.class); RepeatedTest repeatedTest = new RepeatedTest(test, 5); JUnitCore junit = new JUnitCore(); junit.addListener(new TextListener(System.out)); junit.run(repeatedTest);

Di sini, kami menggunakan JUnit4TestAdapter sebagai pembungkus untuk kelas pengujian kami.

Kami bahkan dapat membuat suite secara terprogram, menerapkan pengujian berulang:

TestSuite mySuite = new ActiveTestSuite(); JUnitCore junit = new JUnitCore(); junit.addListener(new TextListener(System.out)); mySuite.addTest(new RepeatedTest(new JUnit4TestAdapter(FirstUnitTest.class), 5)); mySuite.addTest(new RepeatedTest(new JUnit4TestAdapter(SecondUnitTest.class), 3)); junit.run(mySuite);

4. Menjalankan Tes JUnit 5

4.1. Skenario Uji

Dengan JUnit 5, kita akan menggunakan contoh kelas pengujian yang sama seperti demo sebelumnya - FirstUnitTest dan SecondUnitTest , dengan beberapa perbedaan kecil karena versi framework JUnit yang berbeda, seperti paket untuk @Test dan metode pernyataan.

4.2. Menjalankan Kelas Tes Tunggal

Untuk menjalankan pengujian JUnit 5 dari kode Java, kami akan menyiapkan instance LauncherDiscoveryRequest . Ini menggunakan kelas pembangun di mana kita harus mengatur pemilih paket dan menguji filter nama kelas, untuk mendapatkan semua kelas uji yang ingin kita jalankan.

Permintaan ini kemudian dikaitkan dengan peluncur dan, sebelum menjalankan pengujian, kami juga akan menyiapkan rencana pengujian dan pemroses eksekusi.

Keduanya akan menawarkan informasi tentang tes yang akan dijalankan dan hasilnya:

public class RunJUnit5TestsFromJava { SummaryGeneratingListener listener = new SummaryGeneratingListener(); public void runOne() { LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request() .selectors(selectClass(FirstUnitTest.class)) .build(); Launcher launcher = LauncherFactory.create(); TestPlan testPlan = launcher.discover(request); launcher.registerTestExecutionListeners(listener); launcher.execute(request); } // main method... }

4.3. Menjalankan Beberapa Kelas Tes

Kita dapat mengatur pemilih dan filter ke permintaan untuk menjalankan beberapa kelas pengujian.

Mari kita lihat bagaimana kita dapat mengatur pemilih paket dan menguji filter nama kelas, untuk mendapatkan semua kelas pengujian yang ingin kita jalankan:

public void runAll() { LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request() .selectors(selectPackage("com.baeldung.junit5.runfromjava")) .filters(includeClassNamePatterns(".*Test")) .build(); Launcher launcher = LauncherFactory.create(); TestPlan testPlan = launcher.discover(request); launcher.registerTestExecutionListeners(listener); launcher.execute(request); } 

4.4. Hasil Tes

Dalam metode main () , kami memanggil kelas kami, dan kami juga menggunakan pendengar untuk mendapatkan detail hasil. Kali ini hasilnya disimpan sebagai TestExecutionSummary .

Cara termudah untuk mengekstrak infonya hanya dengan mencetak ke aliran keluaran konsol:

public static void main(String[] args) { RunJUnit5TestsFromJava runner = new RunJUnit5TestsFromJava(); runner.runAll(); TestExecutionSummary summary = runner.listener.getSummary(); summary.printTo(new PrintWriter(System.out)); }

Ini akan memberi kami detail uji coba kami:

Test run finished after 177 ms [ 7 containers found ] [ 0 containers skipped ] [ 7 containers started ] [ 0 containers aborted ] [ 7 containers successful ] [ 0 containers failed ] [ 10 tests found ] [ 0 tests skipped ] [ 10 tests started ] [ 0 tests aborted ] [ 10 tests successful ] [ 0 tests failed ]

5. Kesimpulan

Dalam artikel ini, kami telah menunjukkan cara menjalankan pengujian JUnit secara terprogram dari kode Java, mencakup JUnit 4 serta versi JUnit 5 terbaru dari framework pengujian ini.

Seperti biasa, implementasi contoh yang ditampilkan di sini tersedia di GitHub untuk contoh JUnit 5, serta JUnit 4.