ZenTest – automatyczne testowanie
ZenTest jest świetnym narzędziem automatyzującym testowanie. Obsługuje stare poczciwe Test::Unit jak i ostatnio coraz bardziej popularny framework do testów – RSpec.
Zasada działania jest prosta – program monitoruje wszystkie pliki z testami oraz te które są testowane. W przypadku zapisania pliku wykonywane są testy powiązane z modyfikacją.
Przy odpaleniu oraz po Ctrl + C wykonywane są wszystkie testy. Aby wyłączyć autotest należy dwukrotnie wcisnąć Ctrl +C.
No to instalujemy:
sudo gem install ZenTest
odpalamy w katalogu głównym naszej aplikacji zawierającej testy:
autotest
i testujemy…
DODANO: w najnowszej wersji zaszła zmiana, należy dodać do .bashrc/.zshrc (badź gdzie indziej w zależności jakiego shella używamy) export RSPEC=true aby ZenTest działał porwanie z RSpecami
Wygląda genialnie, jednak możemy to jeszcze ulepszyć.
automatyczne czyszczenie konsoli przy nowym teście
Niektórzy się przy tym naprodukowali a i tak nie bardzo im wyszło. Jest na to dużo prostszy sposób, który nie ingeruje nam w gemy. Wszystko opiera się na edycji ~/.autotest . Jest to o tyle dobre, że przy update wszelkie zmiany pozostaną. Wystarczy wkleić:
Autotest.add_hook :run_command do print "\e[H\e[2J" end
i od razu świat stał się lepszy.
notyfikacje
Przydałyby się jakieś notyfikacje. Jestem leniwy, więc nie chciałem się przełączać na okno konsoli po wprowadzeniu każdej zmiany. Tu z pomocą przychodzą nam gadżet autotest-notification. Obsługuje on Test::Unit oraz RSpec, działa pod Linuksem, Windowsem i MacOS X.
Ja jednak chciałem coś lżejszego, mieszczącego się w jednym pliku, obsługującego własne ikony (w przypadku autotest-notification przy zmianie z poziomu .autotest posypały by się ostrzeżenia o modyfikacji stałych, poza tym nie obsługuje w jakiś szczególny sposób testów oczekujących). Jako hybryda powstało:
FAIL_IMAGE = '/home/l1/Obrazy/notify/fail.png' SUCCESS_IMAGE = '/home/l1/Obrazy/notify/pass.png' PENDING_IMAGE = '/home/l1/Obrazy/notify/pending.png' def notify(title, msg, img, pri) #system "notify-send -t 3000 -i #{img} '#{title}' '#{msg}'" #lib-notify-bin #system "kdialog --title '#{title}' --passivepopup '#{msg}' 3" #kdialog z kde #system "zenity --info --text='#{msg}' --title='#{title}'" #zenity #system "growlnotify -n autotest --image #{img} -p #{pri} -m '#{msg}' #{title}" #glow dla MacOS X end Autotest.add_hook :ran_command do |at| if at.results.empty? #something went wrong, do not do anything else output = at.results.detect { |result| result.include? "example" } output = output.match(/m(.+)\e/)[1] examples, failures, pending = output.split(", ") if failures.to_i > 0 notify("Tests Failed", output, FAIL_IMAGE, 2) code = 31 elsif pending.to_i > 0 notify("Tests Pending", output, PENDING_IMAGE, 1) code = 33 else notify("Tests Passed", output, SUCCESS_IMAGE, 0) code = 32 end puts "\e[#{code}m#{'=' * 80}\e[0m\n\n" end end
oczywiście wklejamy to do ~/.autotest a w notify usuwamy hash przed linijką nas interesującą (na Linuksie polecam libnotify, wymaga libnotify-bin), wybieramy ikony.
Mój skrypt obsługuje tylko RSpec. Jak się rozrośnie (a są plany) to obulikuję go na GitHubie, będzie zapewne w postaci gema (z możliwoscią wklejenia do .autotest). W przeciwieństwie do innych rozwiązań tego typu będzie lekki, minimalistyczny, jedno-plikowy oraz konfigurowalny z poziomu .autotest.
Ikony których używam pochodzą z http://www.thelucid.com/articles/2007/07/30/autotest-growl-fail-pass-smilies
Dziękuję Teamonowi który pokazał mi ZenTest oraz wyszukał i udostępnił jeden ze skryptów do powiadamiania.

Subskrybuj komentarze tego wpisu