Saya telah mewarisi banyak tes Junit, tetapi tes ini (selain sebagian besar tidak berfungsi) adalah campuran dari tes unit aktual dan tes integrasi (membutuhkan sistem eksternal, db dll).
Jadi saya mencoba memikirkan cara untuk benar-benar memisahkan mereka, sehingga saya dapat menjalankan tes unit dengan baik dan cepat dan tes integrasi setelah itu.
Opsinya adalah ..
Membagi mereka menjadi direktori yang terpisah.
Pindah ke Junit4 (dari v3) dan beri catatan pada kelas untuk memisahkannya.
Gunakan konvensi penamaan file untuk memberi tahu apa kelasnya, yaitu AdapterATest dan AdapterAIntergrationTest.
3 memiliki masalah bahwa Eclipse memiliki opsi untuk "Menjalankan semua tes dalam proyek / paket atau folder yang dipilih". Jadi akan sangat sulit untuk hanya menjalankan tes integrasi.
2: menjalankan risiko bahwa pengembang mungkin mulai menulis tes integrasi di kelas unit test dan itu hanya menjadi berantakan.
1: Sepertinya solusi yang paling rapi, tetapi nyali saya mengatakan harus ada solusi yang lebih baik di luar sana.
Jadi itu pertanyaan saya, bagaimana Anda banyak memecah tes integrasi dan tes unit yang tepat?
sumber
Jawaban:
Saat ini saya menggunakan direktori terpisah karena kebijakan organisasi (dan warisan Junit 3) tapi saya sendiri ingin beralih ke anotasi sekarang saya di Junit 4.
Saya tidak akan terlalu khawatir tentang pengembang yang menempatkan tes integrasi di kelas uji unit Anda - tambahkan aturan dalam standar pengkodean Anda jika perlu.
Saya tertarik untuk mengetahui solusi apa yang mungkin ada selain dari penjelasan atau memisahkan kelas secara fisik ..
sumber
Anda dapat membaginya dengan sangat mudah menggunakan kategori JUnit dan Maven.
Ini ditunjukkan sangat, sangat singkat di bawah ini dengan pemisahan unit dan tes integrasi.
Tentukan Antarmuka Penanda
Langkah pertama dalam mengelompokkan tes menggunakan kategori adalah membuat antarmuka penanda.Antarmuka ini akan digunakan untuk menandai semua tes yang ingin Anda jalankan sebagai tes integrasi.
Tandai kelas tes Anda
Tambahkan anotasi kategori ke bagian atas kelas tes Anda. Dibutuhkan nama antarmuka baru Anda.
Konfigurasikan Tes Unit Maven
Keindahan dari solusi ini adalah tidak ada yang benar-benar berubah untuk sisi pengujian unit.Kami cukup menambahkan beberapa konfigurasi ke plugin maven surefire untuk membuatnya mengabaikan semua tes integrasi.
Ketika Anda melakukan tes bersih mvn hanya tes unit tanpa tanda Anda akan berjalan.
Konfigurasikan Tes Integrasi Maven
Sekali lagi konfigurasi untuk ini sangat sederhana.Untuk menjalankan hanya tes integrasi, gunakan ini:
Jika Anda membungkus ini dalam profil dengan id
IT
, Anda hanya dapat menjalankan tes cepat menggunakanmvn clean install
. Untuk menjalankan hanya tes integrasi / lambat, gunakanmvn clean install -P IT
.Tetapi paling sering, Anda ingin menjalankan tes cepat secara default dan semua tes dengan
-P IT
. Jika itu masalahnya, maka Anda harus menggunakan trik:Seperti yang Anda lihat, saya mengecualikan tes yang dijelaskan dengan
java.io.Serializable
. Ini diperlukan karena profil akan mewarisi konfigurasi default plugin Surefire, jadi meskipun Anda mengatakan<excludedGroups/>
atau<excludedGroups></excludedGroups>
, nilainyacom.test.annotation.type.IntegrationTest
akan digunakan.Anda juga tidak dapat menggunakan
none
karena harus berupa antarmuka di classpath (Maven akan memeriksa ini).Catatan:
surefire-junit47
hanya diperlukan ketika Maven tidak beralih ke pelari JUnit 4 secara otomatis. Menggunakan elemengroups
atauexcludedGroups
harus memicu sakelar. Lihat di sini .@RunWith()
anotasi untuk menjalankan suite atau tes berbasis pegas.sumber
Kami menggunakan Maven Surefire Plugin untuk menjalankan tes unit dan Maven Failsafe Plugin untuk menjalankan tes integrasi. Tes unit mengikuti
**/Test*.java **/*Test.java **/*TestCase.java
konvensi penamaan, tes integrasi -**/IT*.java **/*IT.java **/*ITCase.java
. Jadi itu sebenarnya pilihan Anda nomor tiga.Dalam beberapa proyek kami menggunakan TestNG dan menentukan kelompok uji yang berbeda untuk tes integrasi / unit, tetapi ini mungkin tidak cocok untuk Anda.
sumber
Saya akan naik ke Junit4 hanya untuk memilikinya :)
Anda dapat memisahkannya menjadi beberapa ruang uji. Saya tidak tahu bagaimana mereka diorganisasikan dalam Junit3 tetapi seharusnya mudah di Junit4 hanya untuk membangun suite tes dan menempatkan semua unit test nyata di salah satunya dan kemudian menggunakan suite kedua untuk tes integrasi.
Sekarang tentukan konfigurasi run untuk kedua suite di eclipse dan Anda dapat dengan mudah menjalankan satu suite. Suite ini juga dapat diluncurkan dari proses otomatis yang memungkinkan Anda menjalankan tes unit setiap kali sumber berubah dan mungkin tes integrasi (jika benar-benar besar) hanya sekali sehari atau sekali dalam satu jam.
sumber
Menggunakan anotasi pegas IfProfileValue memungkinkan untuk mencapai hal ini tanpa memerlukan plugin atau konfigurasi.
Buat anotasi kelas atau metode pengujian integrasi menggunakan IfProfileValue
Untuk menjalankan menggunakan unit test saja:
Untuk menjalankan menggunakan tes integrasi dan tes unit:
Juga, "Jalankan semua tes" dalam IDE hanya akan menjalankan tes unit. Tambahkan
-Dtest-groups=integration
ke argumen VM untuk menjalankan tes integrasi dan unit.sumber
Tidak ada satu jawaban yang benar. Seperti yang sudah Anda jelaskan, ada beberapa cara untuk melakukannya yang akan berhasil. Saya telah melakukan skema penamaan file dan memecah hal-hal menjadi direktori yang berbeda.
Kedengarannya seperti memecah hal-hal menjadi direktori yang berbeda mungkin bekerja lebih baik untuk Anda, dan itu tampak sedikit lebih jelas bagi saya, jadi saya akan condong ke arah itu.
Saya tidak berpikir saya akan mencoba anotasi karena itu tampaknya lebih halus bagi saya. Apakah Anda benar-benar ingin kedua jenis tes ini digabungkan menjadi satu dalam file yang sama? Saya tidak akan.
sumber