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.

  • 🔘 Sumber data: Metode @Parameters statis mengembalikan Koleksi array, dan setiap array menjadi satu iterasi pengujian.
  • ☑️ Pelari: @RunWith(Parameterized.class) menggantikan Block default.JUnit4ClassRunner membangun ulang kelas sekali per baris data.
  • ✅ Pembangun: Satu konstruktor publik menyimpan satu baris data dalam field instance yang diperiksa oleh metode pengujian.
  • 🧪 Contoh yang dikerjakan: Lima baris input menggerakkan pengujian sum(), dan JUnit Lihat laporan. Berjalan 5/5 tanpa kegagalan.
  • ️ JUnit 5: @ParameterizedTest dengan @ValueSource, @CsvSource atau @MethodSource menghapus baik runner maupun konstruktor.
  • 📌 Jebakan: Metode @Parameters yang tidak statis, dua konstruktor publik, atau dependensi junit-jupiter-params yang hilang akan menghentikan eksekusi.

JUnit pengujian berparameter menggunakan anotasi @RunWith dan @Parameters

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:

JUnit Metode pengujian yang mengulang tiga panggilan assertEquals untuk metode sum.

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.

Kelas Airthematic mendeklarasikan metode penjumlahan publik yang menambahkan dua argumen integer.

Langkah 2) Buat kelas pengujian berparameter.

Header kelas pengujian diberi anotasi @RunWith(Parameterized.class) dan empat field privat.

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.

Konstruktor pengujian berparameter yang menetapkan tiga argumen integer ke field instance.

Langkah 4) Buat metode statis yang menghasilkan dan mengembalikan data pengujian.

Metode input statis yang diberi anotasi @Parameterized.Parameters yang mengembalikan array Objek dua dimensi.

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.

Daftar AirthematicTest lengkap dengan impor, konstruktor, metode @Parameters, dan metode @Test.

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:

Kelas TestRunner meneruskan AirthematicTest.class ke JUnitCore.runClasses dan kegagalan pencetakan

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:

Eclipse JUnit Lihat laporan. Berjalan 5/5 dengan 0 kesalahan dan 0 kegagalan untuk kelas berparameter.

Lihat hasilnya di konsol, yang menunjukkan penjumlahan kedua angka tersebut:

Eclipse pencetakan konsol satu Jumlah dari Numbers baris untuk masing-masing dari lima baris parameter

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.

Pertanyaan Umum Demo Slot

TestNG Menyediakan baris melalui metode @DataProvider yang dirujuk per metode pengujian, sehingga pengujian yang tidak terkait dalam kelas tersebut tidak terpengaruh. JUnit 4 memparameterisasi seluruh kelas melalui runner-nya. JUnit 5 menutup celah itu dengan @ParameterizedTest per-metode.

Ya. JUnit 4 menerima @Parameters(name = “{index}: sum({0},{1})={2}”) dan Jupiter menerima @ParameterizedTest(name = “…”). Placeholder diganti saat runtime, sehingga laporan kegagalan menyebutkan baris yang bermasalah alih-alih menampilkan indeks kosong.

Ya. JUnit 4 mendukung @Parameter(0) dan @Parameter(1) pada field publik non-statis, dan kelas tersebut kemudian bergantung pada konstruktor default. Menggabungkan injeksi field dengan konstruktor data memicu kesalahan "tepat satu konstruktor publik".

JUnit 4 hanya membutuhkan artefak junit, karena Parameterized runner sudah termasuk di dalamnya. JUnit 5 membutuhkan junit-jupiter-params bersama dengan junit-jupiter-api; tanpa artefak tersebut, @ParameterizedTest dan setiap anotasi sumber gagal untuk diselesaikan.

Jupiter menyediakan @CsvFileSource(resources = “/data.csv”, numLinesToSkip = 1), yang membaca baris dari classpath pengujian. JUnit 4 tidak memiliki padanan bawaan, jadi metode @Parameters harus membuka dan mengurai file itu sendiri sebelum mengembalikan Koleksi.

In JUnit 4. Bisa, tetapi runner memparameterisasi seluruh kelas, sehingga setiap metode berjalan sekali per baris data. Jupiter memparameterisasi metode individual, sehingga metode @Test biasa dalam kelas yang sama tetap dieksekusi tepat sekali.

Asisten AI membaca tanda tangan metode dan menyarankan baris batas seperti input nol, negatif, maksimum, dan luapan yang seringkali terlewatkan oleh tabel yang ditulis tangan. RevPerhatikan setiap hasil yang diharapkan yang dihasilkan, karena sebuah model dapat menghasilkan baris yang masuk akal dengan jawaban yang salah.

Kopilot GitHub menghasilkan perancah dengan cepat tetapi sering tercampur JUnit 4 dan impor Jupiter, dan terkadang meninggalkan anotasi sumber pada metode @Test biasa. Periksa impor sebelum menjalankan rangkaian pengujian.

Ringkaslah postingan ini dengan: