Fork me on GitHub


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.

ZenTest z dodatkami w akcji:

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.


Opublikowany: 05 sierpnia 2008
Tagi:
Kategorie: Ruby, programowanie |