Mengapa kerangka kerja xUnit tidak memungkinkan pengujian berjalan secara paralel?

15

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?

Xavier Nodet
sumber
Pengujian unit pasti lambat. Bahkan jika setiap tes dengan cepat, mereka akan terakumulasi karena orang benar-benar memiliki jutaan kasus uji.
Pacerier

Jawaban:

6

NUnit 2.5 bundel pNUnit yang memungkinkan jalannya tes secara paralel.

Rilis ini termasuk pNUnit, pelari NUnit yang diperluas untuk pengujian paralel yang didistribusikan. Program pNUnit dikembangkan di Codice Software untuk digunakan dalam pengujian SCM Plastik dan telah berkontribusi pada NUnit. Untuk info lebih lanjut tentang menggunakan pNUnit, lihat situs pNUnit.

Sisi JUnit memiliki paralel-junit dan juga amino .

Aaron McIver
sumber
Jadi satu-satunya alasan untuk kerangka kerja lainnya adalah 'belum diimplementasikan'?
Xavier Nodet
1
@ Lebih Besar Ya; itu pernyataan yang adil.
Aaron McIver
10

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
+1 Ini harus menjadi jawaban yang dikecualikan karena itu sebenarnya menjawab alasannya.
Oliver Weiler
4

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.

Clint Miller
sumber
Itu bukan untuk platform pengujian (xUnit) untuk peduli; itu detail implementasi.
Aaron McIver
Dan tidak semua tes yang ditulis dalam kerangka pengujian unit adalah tes unit, seperti halnya yang mengakses database sebenarnya bukan tes unit, lebih seperti tes integrasi.
c_maker
Hanya karena tes menyentuh basis data tidak berarti ini merupakan tes integrasi. Metode yang berjalan sebagian dalam C # dan sebagian dalam basis data spro misalnya masih secara konsep tes unit, selama tidak ada pra-konfigurasi yang diharapkan (yaitu skema data hadir, tetapi tidak ada data hadir). Tes semacam itu dapat membuat data untuk masing-masing proses, tetapi harus diatur ulang ke kondisi kosong saat selesai). Ini mungkin pendapat yang kontroversial, tetapi tes seperti itu tidak dapat dianggap sebagai tes integrasi, karena mereka secara eksplisit menguji nol, menggunakan nol yang menguji unit kode kecil.
Triynko
2

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).

Péter Török
sumber
0

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.

BillThor
sumber
0

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.

Ivo Grootjes
sumber