JUnit Uji Parameter dengan Contoh menggunakan @Parameters
⚡ Ringkasan Cerdas
Tes berparameter dalam JUnit Jalankan metode pengujian yang sama berulang kali dengan nilai input yang berbeda, sehingga satu metode mencakup banyak skenario. Anotasi @RunWith dan @Parameters menyediakan kumpulan data untuk setiap iterasi.

Apa itu Tes Berparameter? JUnit?
A uji berparameter adalah sebuah pengujian yang menjalankan metode pengujian yang sama berulang kali menggunakan nilai yang berbeda. Ini membantu pengembang menghemat waktu saat menulis pengujian yang hanya berbeda pada input dan hasil yang diharapkan.
Dengan menggunakan pengujian berparameter, seseorang dapat menyiapkan metode pengujian yang mengambil data dari beberapa sumber data. Hal ini menjadikannya bentuk yang paling sederhana dari pengujian berdasarkan data tersedia di dalam JUnit dengan sendirinya, tanpa memerlukan pustaka eksternal.
Perhatikan sebuah tes sederhana yang menjumlahkan berbagai angka. Kode tersebut mungkin terlihat seperti ini:
Pendekatan di atas menyebabkan banyak redundansi. Setiap pasangan angka baru membutuhkan pernyataan assert lain di dalam metode yang sama, dan kegagalan pada assertion pertama akan menyembunyikan setiap assertion yang mengikutinya.
Diperlukan pendekatan yang lebih sederhana. Dengan menggunakan pengujian berparameter, Anda dapat menambahkan satu metode yang menyediakan sepuluh input data, dan pengujian Anda akan berjalan sepuluh kali secara otomatis.
Langkah-langkah Membuat Parameterisasi JUnit uji
Kode berikut menunjukkan contoh pengujian berparameter. Kode ini menguji metode sum() dari kelas Airthematic, yang merupakan ejaan yang digunakan di seluruh proyek contoh.
Langkah 1) Buat sebuah kelas. Dalam contoh ini, kita akan memasukkan dua angka dengan menggunakan metode sum(int, int), yang akan mengembalikan jumlah dari angka-angka yang diberikan.
Langkah 2) Buat kelas pengujian berparameter.
Code Penjelasan
- Code Baris 11: Beri anotasi pada kelas pengujian Anda menggunakan @RunWith(Parameterized.class).
- Code Baris 13: Mendeklarasikan variabel 'firstNumber' sebagai pribadi dan mengetik sebagai int.
- Code Baris 14: Mendeklarasikan variabel 'secondNumber' sebagai private dan bertipe int.
- Code Baris 15: Mendeklarasikan variabel 'expectedResult' sebagai private dan bertipe int.
- Code Baris 16: Mendeklarasikan variabel 'airthematic' sebagai privat dan tipenya sebagai Airthematic.
@JalankanDengan(class_name.class): itu @JalankanDengan Anotasi digunakan untuk menentukan nama kelas runner-nya. Jika kita tidak menentukan tipe apa pun sebagai parameter, runtime akan memilih MemblokirJUnit4ClassRunner secara default
Kelas ini bertanggung jawab untuk menjalankan pengujian dengan instance pengujian baru. Kelas ini bertanggung jawab untuk memanggil JUnit Metode siklus hidup seperti pengaturan (mengaitkan sumber daya) dan pembongkaran (melepaskan sumber daya), yang dijelaskan dalam JUnit perlengkapan tes tutorial.
Untuk melakukan parameterisasi, Anda perlu memberi anotasi pada kelas menggunakan @RunWith dan meneruskan .class yang dibutuhkan untuk diuji.
Langkah 3) Buat sebuah konstruktor yang menyimpan data uji. Konstruktor ini menyimpan 3 variabel.
Langkah 4) Buat metode statis yang menghasilkan dan mengembalikan data pengujian.
Code Baris 32,33: Membuat array dua dimensi (memberikan parameter input untuk penjumlahan). Dengan menggunakan metode asList, kita mengkonversi data ke tipe List, karena tipe kembalian dari metode input adalah Collection.
Code Baris 30: Menggunakan @Parameter anotasi untuk membuat sekumpulan data masukan untuk menjalankan pengujian kami.
Metode statis yang diidentifikasi oleh anotasi @Parameters mengembalikan sebuah Collection di mana setiap entri dalam Collection akan menjadi data masukan untuk satu iterasi pengujian. Perhatikan elemen {1,2,3}. Di sini:
- Nomor pertama = 1
- Nomor kedua = 2
- Hasil yang diharapkan = 3
Di sini, setiap elemen array akan diteruskan ke konstruktor, satu per satu, saat kelas diinstansiasi beberapa kali. Oleh karena itu, lima array yang dideklarasikan dalam contoh tersebut menghasilkan lima eksekusi berikut:
| Pengulangan | Nomor pertama | Nomor dua | Hasil yang diharapkan | Baris konsol |
|---|---|---|---|---|
| [0] | 1 | 2 | 3 | Jumlah dari Numbers = : 3 |
| [1] | 11 | 22 | 33 | Jumlah dari Numbers = : 33 |
| [2] | 111 | 222 | 333 | Jumlah dari Numbers = : 333 |
| [3] | 10 | 9 | 19 | Jumlah dari Numbers = : 19 |
| [4] | 100 | 9 | 109 | Jumlah dari Numbers = : 109 |
Langkah 5) Kode lengkapnya.
Code Penjelasan:
- Code Baris 25: Menggunakan anotasi @Before untuk menyiapkan sumber daya (Airthematic.class di sini). Anotasi @Before digunakan di sini untuk dijalankan sebelum setiap kasus uji. Anotasi ini berisi prasyarat pengujian.
- Code Baris 36: Menggunakan anotasi @Test untuk membuat pengujian kita.
- Code Baris 39: Membuat pernyataan tegas untuk memeriksa apakah jumlah kita sama dengan yang kita harapkan.
Langkah 6) Buat kelas test runner untuk menjalankan pengujian berparameter:
Code Penjelasan:
- Code Baris 8: Mendeklarasikan metode utama dari kelas Test yang akan menjalankan kode kita. JUnit tes.
- Code Baris 9: Menjalankan kasus uji menggunakan JUnitCore.runClasses, yang mengambil nama kelas pengujian sebagai parameter (dalam contoh kita, kita menggunakan AirthematicTest.class).
- Code Baris 11: Memproses hasilnya menggunakan perulangan for dan mencetak hasil yang gagal.
- Code Baris 13: Mencetak hasil yang sukses.
Keluaran:
Berikut adalah hasilnya, yang menunjukkan pengujian berhasil tanpa kegagalan. trace, seperti yang diberikan di bawah ini. Perhatikan bahwa JUnit Tampilan ini menampilkan satu entri per baris data, bukan satu pengujian tunggal:
Lihat hasilnya di konsol, yang menunjukkan penjumlahan kedua angka tersebut:
Tes Berparameter dalam JUnit 5 dengan @ParameterizedTest
Contoh di atas ditulis untuk JUnit 4. JUnit 5 (Jupiter) sepenuhnya menghilangkan model runner, sehingga @RunWith(Parameterized.class), konstruktor data, dan field instance semuanya hilang. JUnit Kode nomor 4 yang ditunjukkan di atas tidak usang: kode tersebut masih berjalan tanpa perubahan pada JUnit Platform melalui mesin vintage. Namun, pengujian baru biasanya ditulis dengan @ParameterizedTest.
Dua dependensi diperlukan: junit-jupiter-api untuk anotasi pengujian dan junit-jupiter-params untuk dukungan berparameter. Tanpa artefak kedua, anotasi sumber tidak akan terselesaikan sama sekali.
import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; class AirthematicTest { // one row per iteration, no constructor and no runner @ParameterizedTest(name = "{0} + {1} = {2}") @CsvSource({"1, 2, 3", "11, 22, 33", "111, 222, 333", "10, 9, 19", "100, 9, 109"}) void sumOfTwoNumbers(int firstNumber, int secondNumber, int expectedResult) { assertEquals(expectedResult, new Airthematic().sum(firstNumber, secondNumber)); } }
Jupiter menawarkan beberapa sumber argumen, dan sumber yang tepat bergantung pada bentuk data:
| Anotasi sumber | Perbekalan | Gunakan saat |
|---|---|---|
| @SumberNilai | Kolom tunggal literal | Tes ini hanya membutuhkan satu argumen. |
| @CsvSource | Baris sebaris yang dipisahkan koma | Tabel kecil berisi angka dan string terbaca dengan jelas di dalam file. |
| @CsvFileSource | Baris yang dibaca dari CSV pada classpath pengujian | Kumpulan data berukuran besar atau dikelola di luar kode. |
| @MethodSource | Sebuah pabrik statis yang mengembalikan aliran argumen. | Diperlukan objek nyata, nilai hasil perhitungan, atau data acak. |
| @EnumSource | Konstanta dari sebuah enum | Setiap nilai enum harus dieksekusi. |
Dua aturan yang paling sering membingungkan pemula. Anotasi sumber yang ditempatkan pada metode @Test biasa diabaikan begitu saja, sehingga metode tersebut harus menyertakan @ParameterizedTest. Dan nilai kosong tanpa tanda kutip dalam @CsvSource dibaca sebagai null, sedangkan nilai kosong dengan tanda kutip dibaca sebagai string kosong.
The JUnit 4 anotasi yang digunakan dalam artikel ini dipetakan ke Jupiter sebagai berikut: @RunWith(Parameterized.class) menjadi @ParameterizedTest ditambah anotasi sumber, @Parameters menjadi @MethodSource atau @CsvSource, dan @Before menjadi @BeforeEach. Daftar lengkapnya dibahas di JUnit penjelasan tutorial.
Keuntungan dan Keterbatasan Tes Parameterisasi
Parameterisasi bukanlah tanpa biaya. Ia menghilangkan duplikasi, tetapi juga membatasi cara penulisan sebuah pengujian, sehingga penting untuk memahami kedua sisi sebelum mengkonversi rangkaian pengujian yang sudah ada.
Kelebihan
- Less duplikasi: Salah satu metodenya adalah mengganti blok pernyataan assert yang hampir identik, seperti yang ditunjukkan pada tangkapan layar pertama dalam artikel ini.
- Asuransi yang lebih murah: Menambahkan kasus khusus akan membutuhkan satu baris data tambahan, bukan baris data baru secara keseluruhan. Kasus cobaan Metode.
- Pelaporan yang akurat: Setiap iterasi dilaporkan secara terpisah, sehingga JUnit Tampilan ini mengidentifikasi secara tepat baris mana yang gagal, bukan hanya satu kegagalan yang diagregasi.
- Data terpusat: Input berada dalam satu metode dan nantinya dapat dipindahkan ke file CSV atau factory tanpa perlu mengubah assertion.
keterbatasan
- Salah satu bentuk pernyataan: Setiap baris menjalankan pernyataan yang sama, jadi skenario yang membutuhkan pemeriksaan berbeda tetap memerlukan metode pengujian tersendiri.
- Cakupan tingkat kelas dalam JUnit 4: Runner memparameterisasi seluruh kelas, sehingga metode @Test yang tidak terkait dalam kelas tersebut juga dijalankan sekali per baris.
- Laporan tidak terbaca: Tanpa templat nama, kegagalan muncul sebagai testAirthematicTest[3], yang tidak menyebutkan apa pun tentang data yang rusak.
- Data inline yang besar: Array berukuran besar akan mengganggu logika pengujian; pindahkan array tersebut ke @CsvFileSource atau factory @MethodSource sebagai gantinya.
Kesalahan Umum dalam JUnit Tes Berparameter
Sebagian besar kegagalan berparameter adalah kesalahan inisialisasi yang muncul sebelum satu pun pernyataan dieksekusi. Tabel di bawah ini mencantumkan pesan yang paling sering muncul dan apa yang memicunya.
| Pesan | Menyebabkan | Memperbaiki |
|---|---|---|
| Kelas pengujian harus memiliki tepat satu konstruktor publik. | Kelas tersebut tidak mendeklarasikan konstruktor publik, atau memiliki dua konstruktor publik. | Pertahankan satu konstruktor publik yang parameternya sesuai dengan kolom data. |
| Tidak ada metode parameter statis publik pada kelas tersebut. | Metode @Parameters bukan public static, atau mengembalikan tipe yang salah. | Deklarasikan sebagai public static Collection dan kembalikan Arrays.asList(…) |
| IllegalArgumentException: jumlah argumen salah | Sebuah baris lebih lebar atau lebih sempit daripada daftar parameter konstruktor. | Buat setiap array dalam Collection memiliki lebar yang sama dengan konstruktor. |
| Kesalahan konfigurasi: tidak ada penyedia argumen | Sebuah pengujian Jupiter membawa @ParameterizedTest tanpa anotasi sumber. | Tambahkan @ValueSource, @CsvSource, @CsvFileSource, @MethodSource atau @EnumSource |
| Anotasi sumber tampaknya tidak melakukan apa pun. | Metode tersebut diberi anotasi @Test, bukan @ParameterizedTest. | Ganti @Test dengan @ParameterizedTest dan impor junit-jupiter-params |
Satu jebakan lainnya adalah status bersama. Karena JUnit Membangun instance baru per baris, apa pun yang disimpan dalam field statis tetap ada di setiap iterasi, dan nilai yang ditulis oleh baris [0] dapat secara diam-diam mengubah hasil baris [4]. Simpan status per baris dalam field instance dan atur ulang sumber daya bersama dalam metode @Before atau @BeforeEach. Panduan umum tentang mengisolasi pengujian dibahas dalam pengujian unit tutorial.









