Dlaczego frameworki xUnit nie pozwalają na równoległe uruchamianie testów?

15

Czy znasz jakąkolwiek platformę xUnit, która pozwala na równoległe uruchamianie testów w celu wykorzystania wielu rdzeni w dzisiejszej maszynie?

Jeśli żaden (lub tak mało) z nich tego nie robi, być może istnieje powód ... Czy testy są zwykle tak szybkie, że ludzie po prostu nie odczuwają potrzeby ich paraliżowania?

Czy istnieje coś głębszego, co wyklucza dystrybucję (przynajmniej niektórych) testów w wielu wątkach?

Xavier Nodet
źródło
Testy jednostkowe są zdecydowanie wolne. Nawet jeśli każdy test sam w sobie jest szybki, kumulują się, ponieważ ludzie dosłownie mają miliony przypadków testowych.
Pacerier

Odpowiedzi:

6

Pakiet NUnit 2.5 w pakiecie pNUnit, który umożliwia równoległe uruchamianie testów.

Ta wersja zawiera pNUnit, rozszerzony moduł uruchamiający NUnit do rozproszonych testów równoległych. Program pNUnit został opracowany w firmie Codice Software do użytku w testowaniu plastikowego SCM i został wniesiony do NUnit. Więcej informacji na temat korzystania z pNUnit znajduje się na stronie pNUnit.

Strona JUnit ma równolegle-junit, a także amino .

Aaron McIver
źródło
Więc jedynym powodem, dla którego inne ramy byłyby „jeszcze nie wdrożone”?
Xavier Nodet
1
@Xavier Tak; to jest uczciwe oświadczenie.
Aaron McIver,
10

Aby odpowiedzieć na drugą część pytania: czy istnieje coś głębszego, co wyklucza rozprowadzanie (przynajmniej niektórych) testów w wielu wątkach?

Duża część kodu działa tylko przy uruchamianiu jednowątkowym. Przypadkowe tworzenie rywalizacji o zasoby i zakleszczeń podczas pisania programów przy założeniu, że będą uruchamiane jednowątkowe, jest banalne. I to działa dobrze, ponieważ większość programów faktycznie działa w trybie jednowątkowym. Równoległość uzyskuje się, uruchamiając wiele kopii lub różnych programów jednocześnie (skrypty sieciowe są częstym przykładem - wielu użytkowników uzyskujących dostęp do jednej strony oznacza wiele kopii skryptów dla tej strony działających w tym samym czasie).

Wyobraź sobie prostą klasę „log do pliku”. Po utworzeniu instancji plik zostanie otwarty do zapisu, a po zwolnieniu instancji plik zostanie zamknięty. Tak więc pierwszy test tworzy instancję i rozpoczyna test. Drugi test robi to samo w drugim wątku. I kończy się niepowodzeniem, ponieważ druga instancja nie może uzyskać dostępu do zapisu do pliku. Ale jeśli zostaną uruchomione pojedynczo, wszystkie testy przejdą pomyślnie.

Wszystko to można zakodować, a prosty przykład można dostosować do pracy. Ale wykonanie tego prawdopodobnie nie jest konieczne w przypadku oryginalnego programu . Konieczność napisania kodu zabezpieczającego wątki tylko w celu przeprowadzenia testów jednostkowych jest nieuzasadniona dla wielu osób. Dlatego wielowątkowe testy jednostkowe powinny pozostać dodatkowym dodatkiem.


źródło
+1 To powinna być wyjątek, ponieważ faktycznie odpowiada na pytanie dlaczego.
Oliver Weiler
4

Jeśli testy wymagają skonfigurowania bazy danych i wysłania do niej zapytania, testy uruchomione równolegle zakłócałyby się nawzajem, chyba że istnieje osobna baza danych dla każdego testu uruchomionego równolegle.

Clint Miller
źródło
To nie dotyczy platformy testowej (xUnit); to szczegół implementacji.
Aaron McIver,
I nie wszystkie testy napisane w ramach testów jednostkowych są testami jednostkowymi, podobnie jak ten, który uzyskuje dostęp do bazy danych, tak naprawdę nie jest testem jednostkowym, a bardziej testem integracyjnym.
c_maker
To, że test dotyka bazy danych, nie oznacza, że ​​jest to test integracyjny. Metoda, która działa częściowo w C # i częściowo w sproc bazy danych, na przykład, jest nadal koncepcyjnie testem jednostkowym, o ile nie oczekuje się wstępnej konfiguracji (tj. Schemat danych jest obecny, ale nie ma danych). Takie testy mogą tworzyć dane dla pojedynczego uruchomienia, ale powinny zostać przywrócone do stanu pustego po zakończeniu). Jest to prawdopodobnie kontrowersyjna opinia, ale takich testów nie można uznać za testy integracyjne, ponieważ są to jawnie testy zerowej konfiguracji i zerowego wdrożenia testujące małe jednostki kodu.
Triynko
2

Chociaż JUnit jako taki może na to nie pozwolić (chociaż nie jestem do końca zaznajomiony z jego najnowszymi wersjami), Maven z wtyczką Surefire ma opcję równoległego uruchamiania testów. Jednak jeszcze tego nie próbowałem.

Nie jestem mocno naciskany, aby zbadać tę opcję, ponieważ mamy tylko nieco ponad tysiąc testów i działają one wystarczająco szybko. Wiem jednak, że niektóre urządzenia testowe mają ukryte zależności między (znaleźliśmy pewne takie zależności, gdy niektóre testy nieoczekiwanie zepsuły się w przeszłości), więc istnieje ryzyko, że równoległe testy spowodują, że niektóre z nich zawiodą nieprzewidywalnie. Możesz powiedzieć, że jest to w porządku, ponieważ wyraźnie ujawnia problem. Mamy jednak do czynienia ze starszym systemem i mamy do czynienia z o wiele ważniejszymi kwestiami - czas jest jak zwykle rzadkim zasobem.

Péter Török
źródło
0

Kodowanie wielowątkowe nie jest trywialne. Nawet jeśli zrobią to ludzie, którzy wiedzą, co robią, mogą wystąpić błędy zależne od czasu. Trudno je naprawić. Po rozwiązaniu problemu, jaki może dać kilka tysięcy błędów typu „case-multi”, wolałbym nie mieć ich w swoim środowisku testowym. Pierwsza poprawka, którą dostałem, sprawdziła się, ale przy dalszych testach okazało się, że stała się jedną z dziesiątek tysięcy błędów.

Techniki wykonywania wielowątkowości na wielu procesorach są coraz lepsze wraz z pojawieniem się komputerów wieloprocesorowych. Jednak zajmie to trochę czasu, zanim będą one szeroko stosowane.

Niektóre zestawy testów mają zależności między testami, które nie muszą być wyraźnie określone, gdy testy są uruchamiane w jednym strumieniu. Jednak w przypadku silnika wieloparowego należy je wyraźnie zaznaczyć. (Gdzie powinny istnieć takie zależności, to inna kwestia).

Z innego punktu widzenia niektóre rzeczy nie muszą być uruchamiane równolegle. Gdy proces przebiega odpowiednio szybko, lepiej skoncentrować wysiłki na czymś innym niż wdrożenie wielowątkowości.

BillThor
źródło
0

MBUnit jest w stanie uruchamiać testy równolegle, po prostu określając niektóre atrybuty na poziomie zespołu.

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

Od pewnego czasu korzystam z tego projektu do równoległego uruchamiania testów selenu. Niestety projekt nie jest już tak bardzo żywy.

xUnit 2.0 powinien również obsługiwać równoległe testowanie jednostek, ale jeszcze go nie wypróbowałem.

Ivo Grootjes
źródło