XUnit çerçeveleri neden testlerin paralel çalışmasına izin vermiyor?


15

Bugünün makinesinde birden çok çekirdeği kullanmak için testleri paralel olarak çalıştırmaya izin veren herhangi bir xUnit çerçevesi biliyor musunuz?

Bunlardan hiçbiri (ya da çok azı) bunu yapmazsa, belki de bir nedeni vardır ... Testler genellikle o kadar hızlı mıdır ki, insanlar onları paralele etme ihtiyacını hissetmezler mi?

Testlerin birden fazla iş parçacığına dağıtılmasını (en azından bir kısmını) engelleyen daha derin bir şey var mı?


Birim testi kesinlikle yavaştır. Her test kendi başına hızlı olsa bile, insanların tam anlamıyla milyonlarca test vakası olduğu için birikirler.
Pacerier

Yanıtlar:


6

NUnit 2.5 paketli pNUnit, testlerin paralel olarak yapılmasını sağlar.

Bu sürüm, dağıtılmış paralel testler için genişletilmiş bir NUnit koşucusu olan pNUnit'i içerir. PNUnit programı Codice Software'de Plastik SCM'nin test edilmesinde kullanılmak üzere geliştirilmiştir ve NUnit'e katkıda bulunmuştur. PNUnit kullanımı hakkında daha fazla bilgi için pNUnit sitesine bakın.

JUnit tarafı amino asitin yanı sıra paralel junit içerir .


Yani diğer çerçevelerin tek nedeni 'henüz uygulanmadı' mı?
Xavier Nodet

1
@Xavier Evet; bu adil bir ifadedir.
Aaron McIver

10

Sorunuzun ikinci bölümünü yanıtlamak için: Testlerin birden fazla iş parçacığına dağıtılmasını (en azından bir kısmını) engelleyen daha derin bir şey var mı?

Büyük miktarda kod yalnızca tek iş parçacıklı çalıştırıldığında çalışır. Programları tek iş parçacıklı çalışacakları varsayımı üzerine yazarken yanlışlıkla kaynak çekişmesi ve kilitlenmeleri üretmek önemsizdir. Ve bu iyi çalışır çünkü çoğu program aslında tek iş parçacıklı çalışır. Paralellik, birden fazla kopya veya aynı anda farklı programlar çalıştırılarak elde edilir (web komut dosyaları yaygın bir örnektir - tek bir sayfaya erişen birçok kullanıcı, aynı anda çalışan o sayfa için komut dosyalarının çok sayıda kopyası anlamına gelir).

Basit bir "dosyaya günlük" sınıfı düşünün. Bir örnek oluşturduğunuzda dosyayı yazmak için açar, örneği serbest bıraktığınızda dosyayı kapatır. Böylece, ilk test bir örnek oluşturur ve bir testi çalıştırmaya başlar. İkinci test aynı şeyi ikinci bir iş parçacığında yapar. Ve başarısız olur, çünkü ikinci örnek dosyaya yazma erişimi alamaz. Ama her seferinde bir tane çalıştırılırsa tüm testler geçecekti.

Tüm bunlar kodlanabilir ve basit örnek işe yarayabilir. Ancak bunu yapmak orijinal program için muhtemelen gereksizdir . Sadece birim testleri yapabilmeniz için iş parçacığı güvenli kod yazmak zorunda kalmanız pek çok kişi için mantıksızdır. Bu nedenle, çok iş parçacıklı birim testleri isteğe bağlı bir ekstra olarak kalmalıdır.


+1 Bu istisna cevap olmalı, çünkü sebebini gerçekten cevaplıyor.
Oliver Weiler

4

Testlerin bir veritabanını kurması ve sorgulaması gerekiyorsa, paralel çalışan her test için ayrı bir veritabanı olmadıkça, paralel olarak çalışan testler birbirini etkileyebilir.


Bu, test platformunun (xUnit) ilgilenmesi için değil; bu bir uygulama detayı.
Aaron McIver

Ve bir birim test çerçevesinde yazılan tüm testler, tıpkı veritabanına erişenlerin bir birim testi değil, bir entegrasyon testi gibi, birim testleri değildir.
c_maker

Bir testin bir veritabanına dokunması, onun bir entegrasyon testi olduğu anlamına gelmez. Kısmen C # ve kısmen bir veritabanı sproc içinde çalışan bir yöntem, ön-konfigürasyon beklenmedikçe (yani veri şeması mevcut, ancak veri mevcut değil), hala kavramsal olarak bir birim testtir. Bu tür testler tek bir çalıştırma için veri oluşturabilir, ancak bittiğinde boş duruma sıfırlanmalıdır). Bu muhtemelen tartışmalı bir görüştür, ancak bu tür testler entegrasyon testleri olarak kabul edilemez, çünkü bunlar küçük kod birimlerini test eden sıfır yapılandırma, sıfır dağıtım testleridir.
Triynko

2

JUnit per se buna izin vermese de (en son sürümlerine çok yakından aşina değilim), Surefire eklentisine sahip Maven, testleri paralel olarak çalıştırma seçeneğine sahip. Henüz denemedim.

Binden fazla testimiz olduğundan ve yeterince hızlı çalıştıklarından, bu seçeneği araştırmak için güçlü bir şekilde baskı yapmıyorum. Bununla birlikte, bazı test fikstürlerinin arasında örtülü bağımlılıklar olduğunu biliyorum (bazı testler geçmişte beklenmedik bir şekilde kırıldığında bazı bağımlılıklar bulduk), bu yüzden testlerin paralelleştirilmesinin bazılarının öngörülemez şekilde başarısız olmasına neden olma riski vardır. Sorunu açık hale getirdiği için bunun iyi olduğunu söyleyebilirsiniz. Bununla birlikte, eski bir sistemle uğraşıyoruz ve başa çıkmak için çok daha önemli sorunlarımız var - zaman kıt bir kaynaktır (her zamanki gibi).


0

Çok iş parçacıklı kodlama önemsiz değildir. Ne yaptıklarını bilen insanlar tarafından yapıldığında bile, zamanlamaya bağlı hatalar oluşabilir. Düzeltmeleri zordur. Çoklu işlemin üretebileceği birkaç bin vaka tipi hatayla uğraştıktan sonra, bunları test çerçevemde olmamayı tercih ederim. İlk düzeltmenin işe yaradığı ortaya çıktı, ancak daha fazla testte, on binlerce hatadan biri haline geldiği bulundu.

Çoklu işlemcilerde çoklu iş parçacığı oluşturma teknikleri, çok işlemcili bilgisayarların ortaya çıkmasıyla daha iyi hale geliyor. Bununla birlikte, geniş kullanımda olmaları zaman alacaktır.

Bazı test paketleri, testler tek bir akışta yürütüldüğünde açıkça belirtilmesi gerekmeyen testler arasında bağımlılıklara sahiptir. Ancak, çok buharlı bir motorda, bunların açıkça belirtilmesi gerekir. (Bu tür bağımlılıkların olması gereken yer farklı bir sorudur.)

Başka bir açıdan, bazı şeylerin paralel olarak çalıştırılmasına gerek yoktur. Süreç yeterince hızlı çalışıyorsa, çabaları çoklu iş parçacığı uygulamaktan başka şeylere odaklamak daha iyi olabilir.


0

MBUnit, bazı montaj düzeyi niteliklerini belirterek testleri paralel olarak çalıştırabilir.

[assembly: DegreeOfParallelism(6)]
[assembly: Parallelizable(TestScope.All)]

Bir süredir selenyum testlerini paralel olarak başarıyla yürütmek için bu projeyi kullanıyorum. Ne yazık ki proje artık çok canlı değil.

xUnit 2.0 da paralel birim test desteklemeli ama henüz denemedim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.