Junit 4, kerangka pengujian unit Java yang terkenal, telah keluar sejak lama. Pada saat itu, saya menemukan bahwa Junit 5 dalam versi beta, jadi saya akan menulis artikel untuk memperkenalkan Junit 5. Namun, karena itu masih versi beta, beberapa bagian tidak sempurna, dan saya sedikit malas dan tidak menulisnya dengan baik. Tiba -tiba saya ingat kejadian ini akhir -akhir ini. Ketika saya memeriksanya di situs web resmi, saya menemukan bahwa pada 10 September, versi resmi Junit 5 akhirnya keluar! Lalu saya kebetulan menulis artikel lagi dan memperkenalkan kerangka kerja junit terbaru kepada Anda.
Struktur kerangka kerja
Dibandingkan dengan JUNIT 4, struktur JUnit 5 sangat jelas dan memberikan dukungan yang baik untuk fungsi yang diperluas seperti plug-in kustom, eksekusi uji IDE, dll. Ini dapat dilihat dari struktur proyek.
Platform Junit
Nama paket grup ini adalah org.junit.platform. Seperti yang dapat Anda lihat dari namanya, fungsi utama grup ini adalah untuk berfungsi sebagai platform dasar untuk kerangka pengujian. Modul di bawah paket ini termasuk API dasar, mesin eksekusi dan pelaksana, fungsi eksekusi baris perintah dasar, antarmuka baris perintah, plug-in uji maven dan lulusan dan fungsi dasar lainnya.
Junit Jupiter
Jupiter adalah nama kode JUnit 5. Modul di bawah paket ini berisi fungsi utama JUnit 5. Jika kita ingin menggunakan JUnit 5, kita harus menyertakan set modul ini.
Junit vintage
Vintage adalah nama kode untuk versi lama JUnit. Modul -modul di bawah paket ini memungkinkan kami untuk menjalankan tes Junit 3 dan 4 lama di platform JUnit baru.
Impor Perpustakaan Kelas
Sementara Junit 5 masih dalam fase beta, ada contoh mengintegrasikan JUnit 5 di Maven dan Gradle dalam dokumentasi resmi. Tetapi dalam versi resmi, konten bagian ini menghilang, hanya menyisakan dua tautan ke proyek sampel, mari kita merujuknya (salin dan tempel).
Menggunakan Maven
Junit5-Maven-Consumer adalah contoh Maven resmi. Saya awalnya akan memposting konfigurasi POM yang relevan di sini, tetapi ketika saya melihat bahwa konfigurasi Maven terlalu panjang, saya sebaiknya melupakannya. Jika Anda memiliki persyaratan, silakan periksa konfigurasi POM proyek ini sendiri.
Menggunakan Gradle
Jika Anda menggunakan Gradle, maka masalah ini jauh lebih sederhana. Ada juga deskripsi terperinci dalam proyek sampel junit5-consumer.
Pertama-tama, Gradle tidak mendukung Junit 5 secara default, sehingga plug-in lulusan Platform JUnit perlu diaktifkan untuk mendukungnya.
BuildScript {repositories {mavencentral ()} dependensi {classpath 'org.junit.platform: junit-platform-gradle-plugin: 1.0.0'}} Terapkan plugin: 'org.junit.platform.gradle.plugin'Lalu ada konfigurasi plugin Gradle ini. Secara default, semua mesin dan tag akan dieksekusi. Jika Anda ingin memilih untuk melakukan tes hanya untuk mesin dan tag tertentu, Anda dapat membatalkan komentar berikut dan memodifikasinya sesuai dengan kebutuhan Anda sendiri. Tentu saja, jika Anda tidak memiliki persyaratan lanjutan ini, Anda dapat menghapus bagian ini.
Junitplatform {// PlatformVersion '1.0.0' filter {engines {// Sertakan 'junit-jupiter', 'junit-vintage' // mengecualikan 'custom-engine'} tag {// sertakan 'cepat' slow '} // includeClassnamepattern'.*test '} / fast' slow '} // includeClassnamepattern'.*test '} / fast' slow '} // includeClassnamepattern' file ('build/test-results/junit-platform') // Ini adalah default // logManager 'org.apache.logging.log4j.jul.logManager'}Jika Anda hanya perlu menjalankan tes JUnit 5, cukup impor dua dependensi berikut. Ketergantungan platform junit diimpor secara otomatis.
dependensi {testCompile ("org.junit.jupiter: junit-jupiter-api: 5.0.0") testruntime ("org.junit.jupiter: junit-jupiter-engine: 5.0.0")}Jika Anda ingin menjalankan tes Junit 3 dan 4 lama di bawah platform baru, Anda perlu mengimpor dependensi berikut.
dependensi {testCompile ("junit: junit: 4.12") testruntime ("org.junit.vintage: junit-vintage-engine: 4.12.0")}Tulis tes
Tes Junit 4
Jika semua konfigurasi sebelumnya selesai, Anda dapat mulai menulis tes sekarang. Pertama, mari kita tinjau tes Junit 4 lama.
kelas publik junit4test {@beforeclass public static void init () {System.out.println ("sebelum kelas");}@afterclass public static void clean () {System.out.println ("After Class");} sebelum public void Sebelum () {System.out.println ("sebelum")@sebelum public void sebelum () {System.out.println (" {System.out.println ("After");}@Test public void test1 () {System.out.println ("test 1");}@tes public void test2 () {System.out.println ("test 2");}}Gunakan tes Gradle dan perintah lain untuk menjalankan tes ini. Hasilnya mirip dengan ini.
Sebelum kelas ClassBeforeTest 1Test 2After
Tes Junit 5
Mari kita lihat cara menulis tes JUnit 5 yang setara. Perubahan yang paling jelas dapat dilihat: Pertama -tama, beberapa anotasi diubah namanya menjadi nama yang lebih terkenal; Poin lain adalah bahwa metode pengujian tidak harus menjadi metode publik, jadi kami dapat mengetik keyboard beberapa kali.
kelas publik junit5test {@beforeall static void beFeLeAll () {System.out.println ("sebelum semua");}@afterall static void afterall () {System.out.println ("Lagipula");} sebelum void sebelum () {System.out.println (" {System.out.println ("After");}@test void test1 () {System.out.println ("test 1");}@test void test2 () {System.out.println ("test 2");}}Tulis pernyataan
Untuk memverifikasi bahwa kasus tes benar, kita perlu menulis beberapa pernyataan. Junit 5 hadir dengan banyak pernyataan yang dapat membantu kami menulis kasus uji. Selain itu, pernyataan ini datang dengan versi kelebihan beban yang dapat menerima ekspresi lambda, yang sangat cocok untuk penggunaan Java 8. Tentu saja, saya pribadi berpikir lebih nyaman untuk menegaskan.
Impor static org.junit.assert.asserttrue; impor statis org.junit.jupiter.api.assertions.*; kelas publik assertionDemo {@test void testAssersion () {assertequals (10, 10); asserttrue (true); assertequals (100, 100, "dua angka yang sama"); assertall ("number", () -> assertequals ("name", "name"), () -> assertequals (500, 500)); assertThrows (InvalidParameterException.class, () -> {lempar InvalidParameterException baru ();}); int result = assertTimeout (durasi. assertequals (100, hasil); }}Injeksi ketergantungan
Sekarang metode konstruktor dan uji kelas uji dapat menerima parameter. Antarmuka ParameterRresolver mendefinisikan cara menyuntikkan parameter saat runtime. Beberapa built-in memungkinkan kami untuk mendapatkan informasi tentang runtime dari test case.
Pertama adalah testinfoparameterresolver. Jika ada instance tipe testInfo pada metode ini, kerangka kerja JUnit 5 akan secara otomatis menyuntikkan instance. Beberapa metode contoh ini dapat memungkinkan kami untuk mendapatkan nama, nama tampilan, label, dan informasi lain dari kelas uji dan metode pengujian.
Kelas Publik DependencyInjectionDemo {@test @DisplayName ("Injeksi Ketergantungan") @tag ("test") void testDisplayName (testInfo testInfo) {assertequals ("Injeksi Ketergantungan", testInfo.getDisplayName ()); assertequals (collections.singleton ("test"), testinfo.gettags ()); }}Ada juga parser parameter bawaan seperti RepetitionInfoparameterResolver, yang akan diperkenalkan nanti.
Anotasi Umum
nama tampilan
Kami dapat menambahkan nama khusus untuk menguji kelas dan metode uji, yang ditampilkan oleh test runner dan uji laporan. Nama tampilan tidak ditampilkan seperti nama variabel. Ini bisa berupa string panjang yang mengandung ruang, atau bahkan emoji emoji.
@DisplayName ("Kelas tes dapat menentukan nama tampilan") kelas publik displayNamedemo {@test @displayname ("Metode tes juga dapat menentukan nama tampilan") void testwithlongdisplayname () {} @test @displayname ("The Display Name juga dapat berisi emoticon {�") dengan {�Displayname ("The Display Name juga dapat berisi emoticon {�") {�Displayname ("Nonaktifkan pengujian
Anotasi @Disabled dapat digunakan pada kelas tes atau metode pengujian, dan tes yang sesuai dapat dinonaktifkan.
@DisabledPublic Class DisableDtestDemo {@test // @Disabled void testDisabled () {}}Ulangi tes
Jika Anda perlu menjalankan metode pengujian beberapa kali, gunakan anotasi @RePeatedTest.
Kelas Publik REURTEDTESTDEMO {@RePeatedTest (10) void testRePeated10Times () {}}Anda juga dapat menyuntikkan instance RepetitionInfo untuk memeriksa jumlah pengulangan saat ini dan jumlah total pengulangan.
Kelas Publik RETECEDTESTDEMO {@BeforeEach void sebelumnya (RepetitionInfo Info) {System.out.printf (" %d - %d/n", info.getCurrentRepetition (), info.getTotalRepetitions ());}@ulangi (10) void testrepeat ());}@ulange (10) void testrepeat ()); {@{10) void {{10) void {{10) void {{10) void {{10) void {{10) void {{10) void {Dilengkapi dengan tag
Ketika saya memperkenalkan konfigurasi Gradle, saya katakan bahwa Anda dapat memilih untuk memfilter label tertentu dalam konfigurasi. Ini juga sangat mudah untuk memberikan tag dalam kode, cukup gunakan anotasi @Tag.
@Tag ("taggedTest") kelas publik tagDemo {@test @tag ("taggedtest1") void testWithTag1 () {} @test @tag ("taggedTest2") void testWithTag2 () {}}Tes bersarang
Terkadang tes bersarang mungkin diperlukan untuk menunjukkan hubungan inklusi antara tes tertentu. Tes bersarang menggunakan anotasi @Nested.
@DisplayName ("tes luar") kelas publik NestedDemo {@test void testouter () {} @nested @displayname ("test dalam") kelas InnertestDemo {@test void testinner () {}}}Perlu dicatat bahwa hanya kelas dalam statis yang dapat menggunakan anotasi bersarang. Selain itu, karena Java tidak mengizinkan kelas internal memiliki metode statis, ia tidak dapat memiliki anotasi @BeforeAll dan @Afterall. Jika Anda ingin menembus batasan ini, Anda perlu menambahkan anotasi @testinstance (lifecycle.per_class) ke kelas dalam bersarang. Untuk detailnya, silakan merujuk ke siklus hidup instance tes.
Dukungan IDE
Meskipun Junit 5 telah keluar sekarang. Namun, dukungan dari berbagai toolchains belum terus meningkat. Saat ini hanya IntelliJ Idea dan Eclipse 4.7 (Oxygen) yang menambahkan dukungan untuk JUnit 5. Jadi, jika Anda berada dalam situasi formal, lebih aman untuk menggunakan Junit 4.
Pertanyaan yang sering diajukan
Bedakan antara berbagai versi anotasi @test
Sama seperti saya menulis artikel ini, saya mengalami masalah dengan contoh tes saya. Tes tidak dapat dilewati dan pesan kesalahan di bawah ini ditampilkan.
Kegagalan (1): junit vintage: yitian.study.test.assertionDemo: inisialisasi di atas kelas, className = 'yitian.study.test.assertionDemo', fileposisi = null] => java.lang.exception: Metode testassersion ()
Siswa dengan bahasa Inggris yang baik harus dapat mengenalinya. Pesan kesalahan ini mengatakan bahwa metode pengujian harus publik. Tetapi seperti yang disebutkan sebelumnya, Junit 5 telah membatalkan pembatasan ini, jadi mengapa kesalahan ini masih terjadi? Saya melihat dengan hati -hati dan menemukan kesalahannya. Mungkin itu karena Junit 4 banyak digunakan di masa lalu, sehingga IDE default untuk anotasi @test, yang secara otomatis diselesaikan.
impor org.junit.test;
Paket ini adalah anotasi @test di bawah JUnit 4. Jika kita ingin menggunakan JUnit 5, kita memerlukan anotasi @test berikut.
impor org.junit.jupiter.api.test;
Setelah memodifikasinya, jalankan tes lagi, dan memang tidak ada masalah. Tentu saja, demi pembelajaran dan penggunaan, saya juga merujuk paket Junit 4, jadi konflik ini terjadi. Jika Anda tidak memiliki kebutuhan khusus, disarankan untuk mengimpor hanya paket Jarit 5 Jar untuk mencegah kebingungan. Tentu saja, mengimpor semuanya baik -baik saja, tetapi Anda harus berhati -hati untuk membedakannya dan tidak menulis junit 4 anotasi untuk tes JUnit 5. Akhirnya, saya akan melampirkan contoh tes saya. Mereka yang tertarik dapat melihatnya.
Meringkaskan
Di atas adalah seluruh konten artikel ini tentang konten terkait JUnit5, dan saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!