Fitur ini telah membuatnya menjadi JUnit 4.11 .
Untuk menggunakan ubah nama pengujian parameter, Anda mengatakan:
@Parameters(name="namestring")
namestring
adalah string, yang dapat memiliki penampung khusus berikut:
{index}
- indeks kumpulan argumen ini. Standarnya namestring
adalah{index}
.
{0}
- nilai parameter pertama dari permohonan tes ini.
{1}
- nilai parameter kedua
- dan seterusnya
Nama akhir pengujian akan menjadi nama metode pengujian, diikuti oleh namestring
tanda kurung, seperti yang ditunjukkan di bawah ini.
Misalnya (diadaptasi dari tes unit untuk Parameterized
anotasi):
@RunWith(Parameterized.class)
static public class FibonacciTest {
@Parameters( name = "{index}: fib({0})={1}" )
public static Iterable<Object[]> data() {
return Arrays.asList(new Object[][] { { 0, 0 }, { 1, 1 }, { 2, 1 },
{ 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 } });
}
private final int fInput;
private final int fExpected;
public FibonacciTest(int input, int expected) {
fInput= input;
fExpected= expected;
}
@Test
public void testFib() {
assertEquals(fExpected, fib(fInput));
}
private int fib(int x) {
// TODO: actually calculate Fibonacci numbers
return 0;
}
}
akan memberi nama seperti testFib[1: fib(1)=1]
dan testFib[4: fib(4)=3]
. (Bagian testFib
dari nama adalah nama metode dari @Test
).
{0}
dan{1}
apakah array? JUnit idealnya meneleponArrays.toString({0})
, bukan{0}.toString()
. Sebagai contoh,data()
metode saya kembaliArrays.asList(new Object[][] {{ new int[] { 1, 3, 2 }, new int[] { 1, 2, 3 } }});
.Melihat JUnit 4.5, pelarinya jelas tidak mendukung itu, karena logika itu terkubur di dalam kelas privat di dalam kelas Parameterisasi. Anda tidak dapat menggunakan pelari Parameterized JUnit, dan sebaliknya membuat sendiri yang akan memahami konsep nama (yang mengarah ke pertanyaan tentang bagaimana Anda dapat menetapkan nama ...).
Dari perspektif JUnit, alangkah baiknya jika alih-alih (atau sebagai tambahan) hanya melewati kenaikan, mereka akan melewati argumen yang dibatasi koma. TestNG melakukan ini. Jika fitur ini penting bagi Anda, Anda dapat mengomentari milis yahoo yang dirujuk di www.junit.org.
sumber
Saya baru-baru ini menemukan masalah yang sama ketika menggunakan JUnit 4.3.1. Saya menerapkan kelas baru yang memperluas Parameterized disebut LabelledParameterized. Ini telah diuji menggunakan JUnit 4.3.1, 4.4 dan 4.5. Itu merekonstruksi instance Deskripsi menggunakan representasi String argumen pertama dari setiap parameter array dari metode @ Parameter. Anda dapat melihat kode ini di:
http://code.google.com/p/migen/source/browse/trunk/java/src/.../LabelledParameterized.java?r=3789
dan contoh penggunaannya di:
http://code.google.com/p/migen/source/browse/trunk/java/src/.../ServerBuilderTest.java?r=3789
Uraian tes format bagus di Eclipse yang saya inginkan karena ini membuat tes gagal jauh lebih mudah ditemukan! Saya mungkin akan lebih memperbaiki dan mendokumentasikan kelas selama beberapa hari / minggu ke depan. Jatuhkan '?' bagian dari URL jika Anda ingin tepi berdarah. :-)
Untuk menggunakannya, yang harus Anda lakukan adalah menyalin kelas itu (GPL v3), dan mengubah @RunWith (Parameterized.class) menjadi @RunWith (LabelledParameterized.class) dengan asumsi elemen pertama dari daftar parameter Anda adalah label yang masuk akal.
Saya tidak tahu apakah ada rilis JUnit nanti yang mengatasi masalah ini, tetapi bahkan jika mereka melakukannya, saya tidak dapat memperbarui JUnit karena semua co-developer saya juga harus memperbarui dan kami memiliki prioritas yang lebih tinggi daripada menginstal ulang. Oleh karena itu pekerjaan di kelas dapat dikompilasi oleh beberapa versi JUnit.
Catatan: ada beberapa jiggery-pokery refleksi sehingga berjalan melintasi versi JUnit yang berbeda seperti yang tercantum di atas. Versi khusus untuk JUnit 4.3.1 dapat ditemukan di sini dan, untuk JUnit 4.4 dan 4.5, di sini .
sumber
execute[0], execute[1] ... execute[n]
dalam laporan pengujian yang dihasilkan.Dengan
Parameterized
sebagai model, saya menulis runner / suite test saya sendiri - hanya membutuhkan waktu sekitar setengah jam. Ini sedikit berbeda dari darrenpLabelledParameterized
karena memungkinkan Anda menentukan nama secara eksplisit daripada mengandalkan parameter pertamatoString()
.Itu juga tidak menggunakan array karena saya benci array. :)
Dan sebuah contoh:
sumber
dari junit4.8.2, Anda dapat membuat kelas MyParameterized Anda sendiri hanya dengan menyalin kelas Parameterized. ubah metode getName () dan testName () di TestClassRunnerForParameters.
sumber
Anda mungkin juga ingin mencoba JUnitParams: http://code.google.com/p/junitparams/
sumber
Anda dapat membuat metode seperti
Meskipun saya tidak akan menggunakannya sepanjang waktu, akan berguna untuk mengetahui dengan tepat nomor tes 143.
sumber
Saya banyak menggunakan impor statis untuk Assert dan teman-teman, jadi mudah bagi saya untuk mendefinisikan kembali pernyataan:
Misalnya, Anda bisa menambahkan bidang "nama" ke kelas tes Anda, diinisialisasi dalam konstruktor, dan menampilkannya pada kegagalan tes. Cukup berikan sebagai elemen pertama array parameter Anda untuk setiap tes. Ini juga membantu memberi label pada data:
sumber
Tidak ada yang bekerja untuk saya, jadi saya mendapatkan sumber untuk Parameter dan memodifikasinya membuat test runner baru. Saya tidak perlu banyak berubah tetapi ITU BEKERJA !!!
sumber
Solusinya adalah menangkap dan menumpuk semua Throwables ke dalam Throwable baru dengan pesan khusus yang berisi semua informasi tentang parameter. Pesan akan muncul di jejak tumpukan. Ini bekerja setiap kali tes gagal untuk semua asersi, kesalahan, dan pengecualian karena semuanya adalah subclass dari Throwable.
Kode saya terlihat seperti ini:
Jejak tumpukan tes gagal adalah:
sumber
Lihat JUnitParams seperti yang disebutkan dsaff, bekerja menggunakan semut untuk membangun deskripsi metode pengujian parameter dalam laporan html.
Ini setelah mencoba LabelledParameterized dan menemukan bahwa itu meskipun bekerja dengan gerhana itu tidak bekerja dengan semut sejauh laporan html yang bersangkutan.
Bersulang,
sumber
Karena parameter diakses (misalnya dengan
"{0}"
selalu mengembalikantoString()
representasi, satu solusi adalah membuat implementasi anonim dan menimpatoString()
dalam setiap kasus. Misalnya:sumber