Przyśpieszanie testów

Znacie jakieś ciekawe techniki na profilowanie i przyśpieszanie testów? Mam tu na myśli rozwiązania, które zmniejszą czas wykonywania poszczególnych testów, a nie narzędzia do odpalania testów równolegle.

Jako przykład mogę podać taki snippet:

config.before(:suite) do
  BCrypt::Engine.cost = BCrypt::Engine::MIN_COST
end

Działa cuda. W jednym projekcie czas się zmniejszył z 12-13 minut do 7-8 na cały suite.

  1. upgrade ruby z 1.9.x do 2.1.x
  2. jesli ladujesz raily, fajnie jest projektowac zaleznosci miedzy klasami tak, zeby moc odpalic testy jednostkowe bez ladowania rails’ow
  3. Mozna zsynchronizowac projekt z szybkim serwerem zewnetrzym i odpalic testy tam.

Tu masz kilka fajnych trików:
forum.rubyonrails.pl/t/przyspieszenie-testow-na-duzej-aplikacji

Z podobnych:

Devise.stretches = 1
Rails.logger.level = 4

Pierwsze prawdopodobnie działa na tym samym co podane wyżej zmiany ustawień BCrypt, tyle, że dla Devise. Drugie niemal wyłącza logowanie w trakcie testów, co również je przyspiesza. Przeważnie te dwa ustawienia przyśpieszają testy o kilkanaście procent.

Nie robiłem benchmarków, ale trafiłem ostatnio na coś takiego:

tl;dr
Chodzi o opóźnienie garbage collectora podczas testów, pewnie się trzeba liczyć ze zwiększonym użyciem pamięci.

Odpalanie testów w ramie :stuck_out_tongue:

Dzięki za wszystkie podpowiedzi :slight_smile: Na razie tips z bcryptem najlepiej się sprawdził, będę musiał jeszcze pokombinować z patchsetami i tweakami do rubiego.

@soso Masz na myśli jakieś konkretne rozwiązanie?

Zeus - niewiele konfiguracji, a działa bardzo przyjemnie.

@ronin Odpalenie bazy do testów w ramie. Czyli coś takiego https://gist.github.com/brundage/4091314

To video nie jest sensowną sugestią dla kogoś kto nie wiedział, żeby wyłączyć haszowanie haseł w testach.

Czasem się zastanawiam czy to video jest w ogóle sensowną sugestią dla kogokolwiek.

Myślę, że jest. Otwiera oczy na to, ze można inaczej. W sensie w ogóle można trochę inaczej pisać kod. Podobnie robił Weirich i inni znani :slight_smile: Więc myślę, że to niezła sugestia.

To w sumie nie przyspiesza wykonywania testów, ale lepiej wykorzystuje zasoby komputera wielordzeniowego.

Jeżeli chodzi o optymalizację bez zmiany struktury kodu i testów, to zabawa z ustawieniami GC potrafi pomóc: http://labs.clio.com/tuning-ruby-garbage-collection-for-rspec/

Tak jak wspomniał @soso, można też też trzymać bazę danych w ramie, chociaż nie jest to gigantyczny skok w porównaniu do ssd. Jeżeli ktoś używa innej bazy danych niż sqlite, to jest możliwość zrobienia partycji ramfs

A znasz kogoś kto po obejrzeniu tego stwierdził: „Fajne! Przepisę sobie testy tak jak Corey Haines!” i to zrobił? Bo ja nie.

eeeee… Ja?
Tylko, że ja się bawię a nie pracuję :slight_smile: Ale staram się dążyć do takiego podejścia, również do funkcyjnego.

W C# robię podobnie ostatnio w produkcyjnym kodzie. Ale tu nie o C# - prawda? :slight_smile:

[quote=“pawelek, post:17, topic:8078, full:true”]
eeeee… Ja? Tylko, że ja się bawię a nie pracuję[/quote]
Czyli się nie liczy.

Pewnie nikt nie będzie przepisywał wszystkich testów na taki schemat, ale następny projekt można zacząć robić w taki sposób. Zresztą ta prezentacja jest bardziej o tym jak pisać kod.

A czy ktoś z Was korzysta z jakiegoś rozwiązania, które pozwala uruchomić testy na innej maszynie np. w sieci lokalnej. Tylko nie mam tu na myśli CI, że trzeba najpierw to popchnąć do repozytorium. Chodzi mi bardziej o podlinkowanie mojego katalogu z projektem na innym komputerze w sieci lokalnej i tam uruchamianie testów.

nie wiem czy to zadziała, ale pierwsza myśl to ln i guard