Urutan Pengujian di JUnit

1. Ikhtisar

Secara default, JUnit menjalankan pengujian menggunakan urutan deterministik, tetapi tidak dapat diprediksi ( MethodSorters.DEFAULT ).

Dalam banyak kasus, perilaku itu baik-baik saja dan dapat diterima; namun ada kasus ketika kami perlu memberlakukan pemesanan tertentu.

2. Uji Urutan di JUnit 5

Di JUnit 5, kita bisa menggunakan @TestMethodOrder untuk mengontrol urutan eksekusi pengujian .

Kita bisa menggunakan MethodOrderer kita sendiri , seperti yang akan kita lihat nanti, atau kita bisa memilih salah satu dari tiga pemesan built-in:

  1. @Pesan Anotasi
  2. Urutan Alfanumerik
  3. Urutan Acak

2.1. Menggunakan Anotasi @Order

Kita dapat menggunakan anotasi @Order untuk menjalankan pengujian agar berjalan dalam urutan tertentu.

Dalam contoh berikut, metode akan berjalan dalam urutan ini - firstTest () , lalu secondTest () , dan terakhir, thirdTest () :

@TestMethodOrder(OrderAnnotation.class) public class OrderAnnotationUnitTest { private static StringBuilder output = new StringBuilder(""); @Test @Order(1) public void firstTest() { output.append("a"); } @Test @Order(2) public void secondTest() { output.append("b"); } @Test @Order(3) public void thirdTest() { output.append("c"); } @AfterAll public static void assertOutput() { assertEquals(output.toString(), "abc"); } }

2.2. Menggunakan Urutan Alfanumerik

Kami juga dapat menjalankan tes berdasarkan namanya dalam urutan alfanumerik:

@TestMethodOrder(Alphanumeric.class) public class AlphanumericOrderUnitTest { private static StringBuilder output = new StringBuilder(""); @Test public void myATest() { output.append("A"); } @Test public void myBTest() { output.append("B"); } @Test public void myaTest() { output.append("a"); } @AfterAll public static void assertOutput() { assertEquals(output.toString(), "ABa"); } }

Perhatikan bahwa urutan alfanumerik peka huruf besar / kecil, jadi karakter huruf besar muncul lebih dulu, lalu huruf kecil.

Tes akan berjalan dalam urutan ini: myATest () , myBTest () dan terakhir myaTest () .

2.3. Menggunakan Pesanan Kustom

Terakhir, kita dapat menggunakan pesanan khusus kita sendiri dengan mengimplementasikan antarmuka MethodOrderer .

Di CustomOrder kami , kami akan mengurutkan pengujian berdasarkan namanya dalam urutan alfanumerik yang tidak peka huruf besar / kecil:

public class CustomOrder implements MethodOrderer { @Override public void orderMethods(MethodOrdererContext context) { context.getMethodDescriptors().sort( (MethodDescriptor m1, MethodDescriptor m2)-> m1.getMethod().getName().compareToIgnoreCase(m2.getMethod().getName())); } }

Kemudian, kami akan menggunakan CustomOrder untuk menjalankan pengujian yang sama dari contoh sebelumnya dalam urutan ini - myATest () , myaTest () , dan terakhir, myBTest () :

@TestMethodOrder(CustomOrder.class) public class CustomOrderUnitTest { // ... @AfterAll public static void assertOutput() { assertEquals(output.toString(), "AaB"); } }

3. Uji Urutan di JUnit 4

Jika Anda masih menggunakan JUnit 4, API untuk pengujian pemesanan sedikit berbeda.

Mari kita lihat opsi untuk mencapai ini di versi sebelumnya juga.

3.1. Menggunakan MethodSorters.DEFAULT

Strategi default ini membandingkan metode pengujian menggunakan kode hash mereka. Dalam kasus tabrakan hash, urutan leksikografis digunakan:

@FixMethodOrder(MethodSorters.DEFAULT) public class DefaultOrderOfExecutionTest { private static StringBuilder output = new StringBuilder(""); @Test public void secondTest() { output.append("b"); } @Test public void thirdTest() { output.append("c"); } @Test public void firstTest() { output.append("a"); } @AfterClass public static void assertOutput() { assertEquals(output.toString(), "cab"); } }

Saat kita menjalankan pengujian di kelas di atas, kita akan melihat bahwa semuanya lulus, termasuk assertOutput () .

3.2. Menggunakan MethodSorters.JVM

Strategi pemesanan lainnya adalah MethodSorters.JVM - strategi ini menggunakan pengurutan JVM natural - yang dapat berbeda untuk setiap proses:

@FixMethodOrder(MethodSorters.JVM) public class JVMOrderOfExecutionTest { // same as above }

Setiap kali kami menjalankan pengujian di kelas ini, kami mendapatkan hasil yang berbeda.

3.3. Menggunakan MethodSorters.NAME_ASCENDING

Akhirnya, strategi ini dapat digunakan untuk menjalankan pengujian dalam urutan leksikografinya:

@FixMethodOrder(MethodSorters.NAME_ASCENDING) public class NameAscendingOrderOfExecutionTest { // same as above @AfterClass public static void assertOutput() { assertEquals(output.toString(), "abc"); } }

Demikian pula, ketika kita menjalankan pengujian di kelas ini, kita melihat bahwa semuanya lulus, termasuk assertOutput () , yang mengonfirmasi urutan eksekusi yang kita setel dengan anotasi.

4. Kesimpulan

Dalam tutorial singkat ini, kami membahas cara mengatur urutan eksekusi yang tersedia di JUnit.

Dan, seperti biasa, contoh yang digunakan dalam artikel ini dapat ditemukan di GitHub.