Apakah Anda tahu adanya kerangka kerja xUnit yang memungkinkan untuk menjalankan tes secara paralel, untuk menggunakan banyak core di mesin saat ini?
Jika tidak ada (atau sedikit) dari mereka yang melakukannya, mungkin ada alasannya ... Apakah tes itu biasanya begitu cepat sehingga orang tidak merasa perlu untuk melumpuhkan mereka?
Apakah ada sesuatu yang lebih dalam yang menghalangi pendistribusian (setidaknya beberapa) pengujian pada banyak utas?
multithreading
xunit
tests
Xavier Nodet
sumber
sumber
Jawaban:
NUnit 2.5 bundel pNUnit yang memungkinkan jalannya tes secara paralel.
Sisi JUnit memiliki paralel-junit dan juga amino .
sumber
Untuk menjawab bagian kedua dari pertanyaan Anda: Apakah ada sesuatu yang lebih dalam yang menghalangi pendistribusian (setidaknya beberapa) pengujian pada beberapa utas?
Banyak kode yang hanya berfungsi saat menjalankan satu utas. Ini sepele untuk secara tidak sengaja menghasilkan pertentangan sumber daya dan kebuntuan ketika menulis program dengan asumsi bahwa mereka akan dijalankan dengan satu utas. Dan ini berfungsi dengan baik karena sebagian besar program benar-benar menjalankan single threaded. Paralelisme diperoleh dengan menjalankan banyak salinan, atau program yang berbeda secara bersamaan (skrip web menjadi salah satu contoh umum - banyak pengguna yang mengakses satu halaman berarti banyak salinan skrip untuk halaman yang berjalan pada saat yang sama).
Bayangkan kelas "log to file" sederhana. Ketika Anda membuat contoh itu membuka file untuk menulis, ketika Anda membebaskan contoh itu menutup file. Jadi, tes pertama menciptakan sebuah instance dan mulai menjalankan tes. Tes kedua melakukan hal yang sama di utas kedua. Dan gagal, karena instance kedua tidak bisa mendapatkan akses tulis ke file. Tetapi jika dijalankan satu per satu semua tes akan berlalu.
Semua ini dapat dikodekan sekitar, dan contoh sederhana dapat diubah untuk bekerja. Tetapi melakukan itu mungkin tidak perlu untuk program aslinya . Harus menulis kode aman agar Anda dapat menjalankan tes unit tidak masuk akal bagi banyak orang. Jadi pengujian unit multi-ulir harus tetap menjadi ekstra opsional.
sumber
Jika tes perlu mensetup dan query database, tes yang berjalan secara paralel akan saling mengganggu kecuali kecuali jika ada database terpisah untuk setiap tes yang berjalan secara paralel.
sumber
Meskipun JUnit sendiri mungkin tidak mengizinkannya (saya tidak terlalu akrab dengan versi terbarunya), Maven dengan plugin Surefire-nya memang memiliki opsi untuk menjalankan tes secara paralel. Saya belum mencobanya.
Saya tidak terlalu terdesak untuk menyelidiki opsi ini, karena kami hanya memiliki sedikit lebih dari seribu tes dan mereka berjalan cukup cepat. Namun, saya tahu bahwa beberapa perlengkapan tes memiliki dependensi implisit antara (kami telah menemukan beberapa dependensi seperti itu ketika beberapa tes pecah secara tak terduga di masa lalu), jadi ada risiko dalam memparalelkan tes akan membuat beberapa dari mereka gagal tak terduga. Anda dapat mengatakan ini baik karena membuat masalah menjadi eksplisit. Namun, kami berhadapan dengan sistem warisan, dan kami memiliki banyak masalah penting untuk ditangani - waktu adalah sumber daya yang langka (seperti biasa).
sumber
Pengkodean multi-utas bukan hal sepele. Bahkan ketika dilakukan oleh orang-orang yang tahu apa yang mereka lakukan, bug tergantung waktu dapat terjadi. Mereka sulit untuk diperbaiki. Setelah berurusan dengan satu dari beberapa ribu jenis bug yang dapat diproduksi oleh multi-treading, saya lebih memilih untuk tidak memilikinya dalam kerangka pengujian saya. Perbaikan pertama yang saya lakukan ternyata berhasil, tetapi pada pengujian lebih lanjut ditemukan bahwa itu baru saja menjadi satu dari puluhan ribu bug.
Teknik untuk melakukan multi-threading pada multi-prosesor semakin baik dengan munculnya PC multi-prosesor. Namun, itu akan memakan waktu sebelum digunakan secara luas.
Beberapa suite tes memiliki ketergantungan antara tes yang tidak perlu dinyatakan secara eksplisit ketika tes dijalankan dalam aliran tunggal. Namun, pada mesin multi-uap, mereka perlu dinyatakan secara eksplisit. (Di mana ketergantungan seperti itu seharusnya ada adalah pertanyaan yang berbeda.)
Dari sudut pandang lain, beberapa hal tidak perlu dijalankan secara paralel. Jika prosesnya berjalan cukup cepat, mungkin lebih baik untuk memfokuskan upaya pada hal-hal selain menerapkan multi-threading.
sumber
MBUnit dapat menjalankan tes secara paralel hanya dengan menentukan beberapa atribut level perakitan.
[assembly: DegreeOfParallelism(6)]
[assembly: Parallelizable(TestScope.All)]
Saya telah menggunakan proyek itu untuk menjalankan tes selenium secara paralel cukup sukses untuk beberapa waktu. Sayangnya proyek ini tidak terlalu hidup lagi.
xUnit 2.0 juga harus mendukung pengujian unit paralel tetapi saya belum mencobanya.
sumber