Di JUnit 3, saya bisa mendapatkan nama tes yang sedang berjalan seperti ini:
public class MyTest extends TestCase
{
public void testSomething()
{
System.out.println("Current test is " + getName());
...
}
}
yang akan mencetak "Tes saat ini adalah testSomething".
Apakah ada cara sederhana atau sederhana untuk melakukan ini di JUnit 4?
Latar Belakang: Jelas, saya tidak ingin hanya mencetak nama ujian. Saya ingin memuat data khusus pengujian yang disimpan dalam sumber daya dengan nama yang sama dengan pengujian. Anda tahu, konvensi tentang konfigurasi dan semua itu.
java
unit-testing
junit
Dave Ray
sumber
sumber
Jawaban:
JUnit 4.7 menambahkan fitur ini sepertinya menggunakan TestName-Rule . Sepertinya ini akan memberi Anda nama metode:
sumber
@Rule
sebelumnya@Before
- saya baru di JUnit dan tergantung padaTestName
saya@Before
tanpa kesulitan.JUnit 4.9.x dan lebih tinggi
Sejak JUnit 4.9,
TestWatchman
kelas tidak lagi mendukungTestWatcher
kelas, yang memiliki doa:Catatan: Kelas yang mengandung harus dideklarasikan
public
.JUnit 4.7.x - 4.8.x
Pendekatan berikut akan mencetak nama metode untuk semua tes di kelas:
sumber
public
bidang?JUnit 5 dan lebih tinggi
Di JUnit 5 Anda dapat menyuntikkan
TestInfo
yang menyederhanakan meta data yang menyediakan metode pengujian. Sebagai contoh:Lihat lebih lanjut: Panduan Pengguna JUnit 5 , TestInfo javadoc .
sumber
Coba ini sebagai gantinya:
Outputnya terlihat seperti ini:
CATATAN: Ini TIDAK berfungsi jika tes Anda adalah subkelas dari TestCase ! Tes berjalan tetapi kode @Rule tidak pernah berjalan.
sumber
Pertimbangkan untuk menggunakan SLF4J (Fasad Penebangan Sederhana untuk Java) memberikan beberapa perbaikan yang rapi menggunakan pesan parameter. Menggabungkan SLF4J dengan implementasi aturan JUnit 4 dapat memberikan teknik logging kelas uji yang lebih efisien.
sumber
Cara berbelit-belit adalah dengan membuat Runner Anda sendiri dengan mensubklasifikasikan org.junit.runners.BlockJUnit4ClassRunner.
Anda kemudian dapat melakukan sesuatu seperti ini:
Kemudian untuk setiap kelas tes, Anda harus menambahkan penjelasan @RunWith (NameAwareRunner.class). Sebagai alternatif, Anda bisa meletakkan anotasi itu pada Superclass Test jika Anda tidak ingin mengingatnya setiap waktu. Ini, tentu saja, membatasi pilihan pelari Anda tetapi itu mungkin dapat diterima.
Juga, mungkin perlu sedikit kung fu untuk mendapatkan nama tes saat ini dari Runner dan ke dalam kerangka kerja Anda, tetapi ini setidaknya membuat Anda mendapatkan namanya.
sumber
JUnit 4 tidak memiliki mekanisme out-of-the-box untuk kasus uji untuk mendapatkan namanya sendiri (termasuk selama pengaturan dan teardown).
sumber
sumber
Berdasarkan komentar sebelumnya dan selanjutnya mempertimbangkan saya membuat ekstensi TestWather yang dapat Anda gunakan dalam metode uji JUnit Anda dengan ini:
Kelas pembantu tes adalah sebagai berikut:
Nikmati!
sumber
ImportUtilsTest
, saya mendapatkan kesalahan, sepertinya kelas logger, apakah saya memiliki informasi lebih lanjut? Terima kasihsumber
Saya sarankan Anda memisahkan nama metode pengujian dari kumpulan data pengujian Anda. Saya akan memodelkan kelas DataLoaderFactory yang memuat / cache set data uji dari sumber daya Anda, dan kemudian dalam uji kasus Anda memanggil beberapa metode antarmuka yang mengembalikan satu set data uji untuk kasus uji. Setelah data uji diikat ke nama metode uji, anggap data uji hanya dapat digunakan satu kali, di mana dalam kebanyakan kasus, saya menyarankan agar data uji yang sama digunakan dalam beberapa tes untuk memverifikasi berbagai aspek logika bisnis Anda.
sumber
Anda dapat mencapai ini menggunakan
Slf4j
danTestWatcher
sumber
Di JUnit 5
TestInfo
bertindak sebagai pengganti drop-in untuk aturan TestName dari JUnit 4.Dari dokumentasi:
Untuk mengambil nama metode dari tes yang dieksekusi saat ini, Anda memiliki dua opsi:
String TestInfo.getDisplayName()
danMethod TestInfo.getTestMethod()
.Untuk mengambil hanya nama metode pengujian saat ini
TestInfo.getDisplayName()
mungkin tidak cukup seperti nama tampilan standar metode pengujianmethodName(TypeArg1, TypeArg2, ... TypeArg3)
.Nama metode duplikat di
@DisplayName("..")
tidak perlu ide yang bagus.Sebagai alternatif, Anda bisa menggunakan
TestInfo.getTestMethod()
yang mengembalikanOptional<Method>
objek.Jika metode pengambilan digunakan di dalam metode pengujian, Anda bahkan tidak perlu menguji nilai yang
Optional
dibungkus.sumber
JUnit 5 melalui ExtensionContext
Keuntungan:
Anda bisa memiliki fungsi tambahan
ExtensionContext
dengan mengesampingkanafterEach(ExtensionContext context)
.sumber