Menjalankan Ujian JUnit Secara Program, dari Aplikasi Java

1. Gambaran keseluruhan

Dalam tutorial ini, kami akan menunjukkan cara menjalankan ujian JUnit secara langsung dari kod Java - ada senario di mana pilihan ini sangat berguna.

Sekiranya anda baru menggunakan JUnit, atau jika anda ingin menaik taraf ke JUnit 5, anda boleh menyemak beberapa tutorial yang kami ada mengenai topik tersebut.

2. Pergantungan Maven

Kami memerlukan beberapa pergantungan asas untuk menjalankan ujian 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 boleh didapati di Maven Central.

3. Menjalankan Ujian JUnit 4

3.1. Senario Ujian

Untuk JUnit 4 dan JUnit 5, kami akan menyediakan beberapa kelas ujian "placeholder" yang cukup untuk menunjukkan 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); } }

Semasa menggunakan JUnit 4, kami membuat kelas ujian yang menambahkan penjelasan @Test pada setiap kaedah ujian.

Kami juga dapat menambahkan anotasi berguna lain, seperti @Sebelum atau @Setelah itu , tetapi itu tidak termasuk dalam skop tutorial ini.

3.2. Menjalankan Kelas Ujian Tunggal

Untuk menjalankan ujian JUnit dari kod Java, kita dapat menggunakan kelas JUnitCore (dengan penambahan kelas TextListener , digunakan untuk menampilkan output di System.out ):

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

Di konsol, kita akan melihat mesej yang sangat sederhana yang menunjukkan ujian berjaya:

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

3.3. Menjalankan Kelas Ujian Pelbagai

Sekiranya kita ingin menentukan beberapa kelas ujian dengan JUnit 4, kita boleh menggunakan kod yang sama seperti untuk satu kelas, dan hanya menambahkan kelas tambahan:

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

Perhatikan bahawa hasilnya disimpan dalam contoh kelas Hasil JUnit , yang kami cetak menggunakan kaedah utiliti mudah:

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 Test Suite

Sekiranya kita perlu mengumpulkan beberapa kelas ujian untuk menjalankannya, kita boleh membuat TestSuite . Ini hanyalah kelas kosong di mana kami menentukan semua kelas menggunakan anotasi JUnit:

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

Untuk menjalankan ujian ini, kami sekali lagi akan menggunakan kod 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 Ujian Berulang

Salah satu ciri yang menarik JUnit adalah bahawa kita boleh mengulangi ujian dengan mewujudkan contoh RepeatedTest . Ini sangat berguna ketika kita menguji nilai rawak, atau untuk pemeriksaan prestasi.

Dalam contoh seterusnya, kami akan menjalankan ujian dari MergeListsTest sebanyak 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 ujian kami.

Kami bahkan dapat membuat suite secara terprogram, dengan menggunakan ujian 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 Ujian JUnit 5

4.1. Senario Ujian

Dengan JUnit 5, kami akan menggunakan kelas ujian sampel yang sama seperti demo sebelumnya - FirstUnitTest dan SecondUnitTest , dengan beberapa perbezaan kecil kerana versi kerangka JUnit yang berbeza, seperti paket untuk kaedah @Test dan penegasan.

4.2. Menjalankan Kelas Ujian Tunggal

Untuk menjalankan ujian JUnit 5 dari kod Java, kami akan menyediakan contoh LauncherDiscoveryRequest . Ia menggunakan kelas pembangun di mana kita mesti menetapkan pemilih pakej dan penapis nama kelas pengujian, untuk mendapatkan semua kelas ujian yang ingin kita jalankan.

Permintaan ini kemudian dikaitkan dengan pelancar dan, sebelum menjalankan ujian, kami juga akan menyediakan rancangan ujian dan pendengar pelaksanaan.

Kedua-duanya akan memberikan maklumat mengenai ujian 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 Kelas Ujian Pelbagai

Kami dapat menetapkan pemilih dan penapis pada permintaan untuk menjalankan beberapa kelas ujian.

Mari lihat bagaimana kita dapat menetapkan pemilih pakej dan penapis nama kelas pengujian, untuk mendapatkan semua kelas ujian 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 Ujian

Dalam kaedah utama () , kami memanggil kelas kami, dan kami juga menggunakan pendengar untuk mendapatkan perincian hasil. Kali ini hasilnya disimpan sebagai TestExecutionSummary .

Cara paling mudah untuk mengekstrak maklumatnya hanyalah dengan mencetak ke aliran output 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 butiran perjalanan ujian 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 bagaimana menjalankan ujian JUnit secara terprogram dari kod Java, yang merangkumi JUnit 4 dan juga versi JUnit 5 baru-baru ini dari kerangka ujian ini.

Seperti biasa, pelaksanaan contoh yang ditunjukkan di sini tersedia di GitHub untuk kedua-dua contoh JUnit 5, dan juga JUnit 4.