Równoległe uruchamianie testów w Mocha v8.0.0
Nowowydana wersja Mocha v8.0.0 zawiera wiele przełomowych zmian, m.in. testowanie równoległe. Mocha jest platformą testową Java Script. Działa na Node.js, a także w przeglądarce, co pozwala na łatwe i przyjemne testowanie asynchroniczne. Wcześniej testy przeprowadzano szeregowo – jeden test musiał się zakończyć przed przejściem do następnego. Niewątpliwie umożliwiało to większą elastyczność i precyzję w raportowaniu. Jednocześnie, mapował nieprzechwycone wyjątki do odpowiednich testowych przypadków. Jednak w przypadku dużych zestawów testowych występowały znaczące błędy.
Najważniejsze zmiany w Mocha v8.0.0
Wśród ważniejszych zmian jest koniec obsługi Node.js w wersji 8.x, z której zrezygnowało (albo planuje zrezygnować) już większość bibliotek. Nie obsługuje się już ostrzeżenia mocha.opt, a także usunięto enableTimeout()( this.enableTimeout()) z obiektu kontekstu. Zniknęły także przestarzałe interfejsy API – Mocha.prototype.ignoreLeaks(), Mocha.prototype.useColors(), Mocha.prototype.useInlineDiffs(), Mocha.prototype.hideDiff().
Tryb równoległy
Mocha v8.0.0 obsługuje teraz pod Node.js uruchamianie testów w trybie równoległym. W związku z tym, platforma może korzystać z procesorów wielordzeniowych, co dalej pozwala na znaczne przyspieszenie dużych pakietów testowych.
Uruchamianie
Najczęściej, aby włączyć tryb równoległy wystarczy dostarczyć flagę –parallel do pliku wykonywalnego mocha.
mocha --parallel test/*.spec.js
Po uruchomieniu, w związku z wieloma zmiennymi (Mocha, Node.js, system operacyjny, procesor), różne testy zgłaszają wyjątki dotyczące przekroczenia limitu czasu. Wskazuje to raczej na większe obciążenie systemu czy niedeterministycznej kolejności wykonywania niż na problem związany z trybem równoległym. Jedną z propozycji rozwiązania jest zwiększenie limitu czasu testu przykładowo z 300 ms do 1000 ms.
# .mocharc.yml # ... timeout: 1000
Optymalizacja testów równoległych
Przyjmując, że n jest liczbą rdzeni procesora w komputerze, to domyślna maksymalna liczba zadań Mocha’i wynosi n-1. Nie jest to optymalna wartość dla każdego projektu. Wszystko zależy od systemu operacyjnego, nawet ilość używanych rdzeni procesora.
Przykładowo: Dla ośmiordzeniowego procesora, Mocha domyślnie używa siedmiu procesów roboczych. Przeprowadzony test w trybie równoległym trwa prawie 76 sekund, co jest 53% przyspieszeniem. Jednak, jeśli zwiększymy liczbę procesów do 12 (więcej, niż liczba procesorów), trwa jeszcze krócej. Oznacza to, że prawdopodobnie równoległe testy Mocha nie są związane z procesorem i operacje wykonywane są asynchronicznie.
Kiedy nie stosować testów równoległych?
Istotne jest to, że Mocha nie uruchamia równolegle poszczególnych testów, tylko pliki testowe. Jeśli podamy pojedynczy plik testowy, utworzy się pojedynczy proces roboczy. Dopiero on uruchomi ten plik. Ponadto, odradzanie procesów roboczych nie jest bezpłatne. Jeśli mamy tylko jeden plik testowy, możemy zostać ukarani za używanie trybu równoległego.
Oprócz tego istnieje pewien punkt przegięcia, po przekroczeniu którego testy będą wolniejsze niż w szeregowym testowaniu. Nowy tryb równoległy nie jest idealny, ale stwarza miejsce na kolejne ulepszenia.
Root Hook
Aby hooki Root działały w trybie równoległym muszą być zdefiniowane za pomocą Root Hook Plugins. Są to moduły CJS lub ESM które mają nazwany eksport MochaHooks. Użytkownik może dowolnie w nich definiować hooki.
Źródła:
- https://github.com/mochajs/mocha/releases
- https://developer.ibm.com/technologies/node-js/articles/parallel-tests-mocha-v8