Pengenalan JUnitParams

1. Gambaran keseluruhan

Dalam artikel ini, kita akan meneroka perpustakaan JUnitParams dan penggunaannya. Ringkasnya, perpustakaan ini memberikan parameterisasi kaedah ujian yang mudah dalam ujian JUnit .

Terdapat situasi di mana satu-satunya perkara yang berubah antara beberapa ujian adalah parameternya. JUnit sendiri mempunyai sokongan parameterisasi, dan JUnitParams meningkatkan fungsi tersebut dengan ketara.

2. Ketergantungan Maven

Untuk menggunakan JUnitParams dalam projek kami, kami perlu menambahkannya ke pom.xml kami :

 pl.pragmatists JUnitParams 1.1.0 

Versi perpustakaan terkini boleh didapati di sini.

3. Senario Ujian

Mari buat kelas yang melakukan penambahan selamat dua integer. Ini harus mengembalikan Integer.MAX_VALUE jika melimpah, dan Integer.MIN_VALUE jika mengalir keluar :

public class SafeAdditionUtil { public int safeAdd(int a, int b) { long result = ((long) a) + b; if (result > Integer.MAX_VALUE) { return Integer.MAX_VALUE; } else if (result < Integer.MIN_VALUE) { return Integer.MIN_VALUE; } return (int) result; } }

4. Membina Kaedah Ujian Ringkas

Kita perlu menguji pelaksanaan kaedah untuk kombinasi nilai input yang berlainan, untuk memastikan pelaksanaannya berlaku untuk semua kemungkinan senario. JUnitParams menyediakan lebih daripada satu cara untuk mencapai penciptaan ujian parameter.

Mari kita ambil pendekatan asas dengan sebilangan kecil pengekodan dan lihat bagaimana ia dilakukan. Selepas itu, kita dapat melihat cara lain yang mungkin untuk melaksanakan senario ujian menggunakan JUnitParams :

@RunWith(JUnitParamsRunner.class) public class SafeAdditionUtilTest { private SafeAdditionUtil serviceUnderTest = new SafeAdditionUtil(); @Test @Parameters({ "1, 2, 3", "-10, 30, 20", "15, -5, 10", "-5, -10, -15" }) public void whenWithAnnotationProvidedParams_thenSafeAdd( int a, int b, int expectedValue) { assertEquals(expectedValue, serviceUnderTest.safeAdd(a, b)); } }

Sekarang mari kita lihat bagaimana kelas ujian ini berbeza dengan kelas ujian JUnit biasa .

Perkara pertama yang kita perhatikan ialah terdapat pelari ujian yang berbeza dalam anotasi kelas - JUnitParamsRunner .

Melangkah ke kaedah ujian, kita melihat kaedah ujian diberi penjelasan dengan @Parameters anotation dengan pelbagai parameter input. Ini menunjukkan senario ujian yang berbeza yang akan digunakan untuk menguji kaedah perkhidmatan kami.

Sekiranya kita menjalankan ujian menggunakan Maven, kita akan melihat bahawa kita menjalankan empat kes ujian dan bukan satu kes . Keluarannya serupa dengan yang berikut:

------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.baeldung.junitparams.SafeAdditionUtilTest Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.068 sec - in com.baeldung.junitparams.SafeAdditionUtilTest Results : Tests run: 4, Failures: 0, Errors: 0, Skipped: 0

5. Jenis Parameterisasi Kaedah Ujian yang berbeza

Menyediakan parameter ujian secara langsung dalam anotasi tentu bukan kaedah yang paling mudah dibaca sekiranya kita mempunyai banyak kemungkinan senario yang perlu diuji. JUnitParams menawarkan sekumpulan pendekatan yang berbeza yang dapat kita gunakan untuk membuat ujian parameter:

  • Secara langsung dalam anotasi @Parameter (digunakan dalam contoh di atas)
  • Menggunakan kaedah ujian bernama yang ditentukan dalam anotasi
  • Menggunakan kaedah yang dipetakan dengan nama kaedah ujian
  • Kelas ujian bernama yang ditentukan dalam anotasi
  • Menggunakan fail CSV

Mari kita teliti pendekatan satu persatu.

5.1. Secara langsung dalam Anotasi @Parameter

Kami telah menggunakan pendekatan ini dalam contoh yang kami cuba. Yang perlu kita ingat adalah kita harus menyediakan pelbagai rentetan parameter. Dalam rentetan parameter, setiap parameter dipisahkan dengan koma.

Sebagai contoh, susunan akan dalam bentuk {“1, 2, 3”, “-10, 30, 20”} dan satu set parameter diwakili sebagai “1, 2, 3” .

Batasan pendekatan ini adalah bahawa kita hanya dapat menyediakan primitif dan String sebagai parameter ujian. Tidak mungkin menyerahkan objek sebagai parameter kaedah ujian juga.

5.2. Kaedah Parameter

Kami dapat memberikan parameter kaedah ujian menggunakan kaedah lain di dalam kelas. Mari lihat contohnya terlebih dahulu:

@Test @Parameters(method = "parametersToTestAdd") public void whenWithNamedMethod_thenSafeAdd( int a, int b, int expectedValue) { assertEquals(expectedValue, serviceUnderTest.safeAdd(a, b)); } private Object[] parametersToTestAdd() { return new Object[] { new Object[] { 1, 2, 3 }, new Object[] { -10, 30, 20 }, new Object[] { Integer.MAX_VALUE, 2, Integer.MAX_VALUE }, new Object[] { Integer.MIN_VALUE, -8, Integer.MIN_VALUE } }; }

Kaedah pengujian dijelaskan mengenai parameter parameterToAdd (), dan mengambil parameter dengan menjalankan metode yang dirujuk.

Hasilnya, spesifikasi kaedah penyedia harus mengembalikan pelbagai Objek . Sekiranya kaedah dengan nama yang diberikan tidak tersedia, kes ujian gagal dengan ralat:

java.lang.RuntimeException: Could not find method: bogusMethodName so no params were used.

5.3. Kaedah Dipetakan dengan Nama Kaedah Ujian

Sekiranya kami tidak menyatakan apa-apa dalam anotasi @Parameters , JUnitParams akan cuba memuatkan kaedah penyedia data ujian berdasarkan nama kaedah ujian. Nama kaedah dibina sebagai "parameterFor" +:

@Test @Parameters public void whenWithnoParam_thenLoadByNameSafeAdd( int a, int b, int expectedValue) { assertEquals(expectedValue, serviceUnderTest.safeAdd(a, b)); } private Object[] parametersForWhenWithnoParam_thenLoadByNameSafe() { return new Object[] { new Object[] { 1, 2, 3 }, new Object[] { -10, 30, 20 }, new Object[] { Integer.MAX_VALUE, 2, Integer.MAX_VALUE }, new Object[] { Integer.MIN_VALUE, -8, Integer.MIN_VALUE } }; }

Dalam contoh di atas nama kaedah ujian adalah ketikaWithnoParam_shouldLoadByNameAbdSafeAdd () .

Oleh itu, semasa kaedah ujian dijalankan, ia mencari kaedah penyedia data dengan nama parameterForWhenWithnoParam_shouldLoadByNameAbdSafeAdd () .

Oleh kerana kaedah itu ada, ia akan memuatkan data daripadanya dan menjalankan ujian. Sekiranya tidak ada kaedah yang sesuai dengan nama yang diperlukan, ujian gagal seperti pada contoh di atas.

5.4. Kelas Ujian Dinamakan Ditentukan Dalam Anotasi

Sama seperti cara kita merujuk kepada kaedah penyedia data pada contoh sebelumnya, kita boleh merujuk ke kelas yang terpisah untuk memberikan data untuk ujian kita:

@Test @Parameters(source = TestDataProvider.class) public void whenWithNamedClass_thenSafeAdd( int a, int b, int expectedValue) { assertEquals(expectedValue, serviceUnderTest.safeAdd(a, b)); } public class TestDataProvider { public static Object[] provideBasicData() { return new Object[] { new Object[] { 1, 2, 3 }, new Object[] { -10, 30, 20 }, new Object[] { 15, -5, 10 }, new Object[] { -5, -10, -15 } }; } public static Object[] provideEdgeCaseData() { return new Object[] { new Object[] { Integer.MAX_VALUE, 2, Integer.MAX_VALUE }, new Object[] { Integer.MIN_VALUE, -2, Integer.MIN_VALUE }, }; } }

Kita dapat memiliki sebilangan penyedia data ujian di kelas mengingat bahawa nama kaedah dimulai dengan "sediakan". Sekiranya demikian, pelaksana memilih kaedah tersebut dan mengembalikan data.

Sekiranya tidak ada kaedah kelas yang memenuhi syarat itu, walaupun kaedah tersebut mengembalikan pelbagai Objek , kaedah tersebut akan diabaikan.

5.5. Menggunakan Fail CSV

Kita boleh menggunakan fail CSV luaran untuk memuat data ujian. Ini membantu sekiranya bilangan kes ujian yang mungkin cukup besar, atau jika kes ujian sering diubah. Perubahan dapat dilakukan tanpa mempengaruhi kod ujian.

Katakan bahawa kita mempunyai fail CSV dengan parameter ujian sebagai JunitParamsTestParameters.csv :

1,2,3 -10, 30, 20 15, -5, 10 -5, -10, -15

Sekarang mari kita lihat bagaimana fail ini dapat digunakan untuk memuat parameter ujian dalam kaedah ujian:

@Test @FileParameters("src/test/resources/JunitParamsTestParameters.csv") public void whenWithCsvFile_thenSafeAdd( int a, int b, int expectedValue) { assertEquals(expectedValue, serviceUnderTest.safeAdd(a, b)); }

Satu batasan pendekatan ini adalah tidak mungkin melepasi objek yang kompleks. Hanya primitif dan String yang sah.

6. Kesimpulannya

Dalam tutorial ini, kita melihat bagaimana kita dapat memanfaatkan fungsi JUnitParams secara ringkas.

Kami juga merangkumi pendekatan yang berbeza yang disediakan oleh perpustakaan untuk menyediakan parameter ujian ke kaedah ujian kami - jauh melebihi apa yang dapat dilakukan oleh JUnit sendiri.

Seperti biasa, kod sumber boleh didapati di GitHub.