Programowanie w Ruby Wykład 13 Marcin Młotkowski 16 stycznia 2015
Plan wykładu 1 Marcin Młotkowski Programowanie w Ruby 2 / 31
Testowanie Rodzaje testów: Testy jednostkowe Testy funkcjonalne Testy wydajnościowe (profilowanie) Marcin Młotkowski Programowanie w Ruby 3 / 31
Dobra wiadomość Generatory modeli i kontrolerów generują też szkielety testów. Marcin Młotkowski Programowanie w Ruby 4 / 31
Dobra wiadomość Generatory modeli i kontrolerów generują też szkielety testów.../test/ Marcin Młotkowski Programowanie w Ruby 4 / 31
Testy jednostkowe Testy sprawdzające pojedyncze funkcjonalności (metodę, funkcję etc.). Marcin Młotkowski Programowanie w Ruby 5 / 31
Środowisko testowe Testy są metodami podklasy klasy ActiveSupport::TestCase, o nazwie test * (przypadki testowe) Klasa jest katalogu test/unit/ Uruchomienie testów: najprościej ruby test/unit/...rb. Marcin Młotkowski Programowanie w Ruby 6 / 31
Testy w Railsach Railsy oferują Automatycznie wygenerowane pliki z prototypami testów Bazę danych do testów Wsparcie tworzenia zmiennych tymczasowych Marcin Młotkowski Programowanie w Ruby 7 / 31
Przykład Należy zajrzeć do notatek z wykładu 6 Marcin Młotkowski Programowanie w Ruby 8 / 31
W modelach możemy definiować walidację, tj. warunki poprawności danych sprawdzane podczas wprowadzania danych Marcin Młotkowski Programowanie w Ruby 9 / 31
Czego potrzebujemy Testowej bazy danych Testowych danych Zestawu testów Asercji Marcin Młotkowski Programowanie w Ruby 10 / 31
Przygotowanie testowej bazy danych Zajrzenie do config/database.yml Marcin Młotkowski Programowanie w Ruby 11 / 31
Przygotowanie testowej bazy danych Zajrzenie do config/database.yml Wygenerowanie odpowiednich tabel w bazie: rake db:test:prepare Marcin Młotkowski Programowanie w Ruby 11 / 31
Przygotowanie danych testowych Dane są w katalogu test/fixtures Dane są w plikach typu CSV lub YAML Pliki z danymi powinne się nazywać tak jak modele Marcin Młotkowski Programowanie w Ruby 12 / 31
Przykład danych testowych dla modelu wyklads.yml ruby: id: 1 title: Kurs języka Ruby ldi: id: 1 title: Logika dla informatyków Marcin Młotkowski Programowanie w Ruby 13 / 31
Zestaw testów class WykladTest < ActiveSupport::TestCase fixtures :wyklads end Marcin Młotkowski Programowanie w Ruby 14 / 31
Zestaw testów class WykladTest < ActiveSupport::TestCase fixtures :wyklads def test prosty w = Wyklad.new(:title => AiSD ) w.ects = -1 assert!w.valid? end end Marcin Młotkowski Programowanie w Ruby 14 / 31
Korzystanie z infrastruktury testowej Deklaracja fixtures :wyklads łączy dane z pliku fixtures/wyklads.yml z tabelą w bazie danych Przed każdym wywołaniem metody testowej tabela jest wypełniana danymi z pliku Po wykonaniu metody testowej dane są usuwane z tej tabeli Marcin Młotkowski Programowanie w Ruby 15 / 31
Przykład class WykladTest < ActiveSupport::TestCase fixtures :wyklads end def test prosty w = Wyklad.new(:title => AiSD ) w.ects = -1 assert!w.valid? end def test zlozony w = Wyklad.new(:title => wyklads(:ruby).title) assert!w.save end Marcin Młotkowski Programowanie w Ruby 16 / 31
Inne asercje assert valid(obiekt activerecord) sprawdzenie, czy obiekt przechodzi walidację Marcin Młotkowski Programowanie w Ruby 17 / 31
Inne asercje assert valid(obiekt activerecord) sprawdzenie, czy obiekt przechodzi walidację flunk(komunikat) zawsze kończy się niepowodzeniem Marcin Młotkowski Programowanie w Ruby 17 / 31
Architektura testów kontrolerów Szkielety testów kontrolerów są w katalogu tests/functional Testy są zgromadzone w metodach klasy testowej Opcjonalna metoda setup wykonywana przed testami Marcin Młotkowski Programowanie w Ruby 18 / 31
Pola obiektu klasy testującej @controller = WykladsController.new @request = ActionController::TestRequest.new @response = ActionController::TestResponse.new Marcin Młotkowski Programowanie w Ruby 19 / 31
Metody i funkcje pomocnicze get :akcja, opcje wywołania, sesja post :akcja, :opcje wywołania Marcin Młotkowski Programowanie w Ruby 20 / 31
Asercje assert response :odpowiedź assert redirected to :action => akcja Marcin Młotkowski Programowanie w Ruby 21 / 31
Przykłady Przykład prosty def test index get :index assert response :success # assert response 200 end Marcin Młotkowski Programowanie w Ruby 22 / 31
Przykłady Przykład prosty def test index get :index assert response :success # assert response 200 end Przykład złożony def test logowania get :index assert redirected to :login assert equal Niezalogowany, flash[:notice] end Marcin Młotkowski Programowanie w Ruby 22 / 31
Testowanie edycji post :edit :wyklad => { :title => Ruby, :ects => 1} Marcin Młotkowski Programowanie w Ruby 23 / 31
Wynik działania akcji (@response) Komunikat o powodzeniu/niepowodzeniu/... Strona w html u Marcin Młotkowski Programowanie w Ruby 24 / 31
Weryfikacja html a assert select tag tekst Marcin Młotkowski Programowanie w Ruby 25 / 31
Weryfikacja html a assert select tag tekst Np: assert select title, Programowanie w Ruby Marcin Młotkowski Programowanie w Ruby 25 / 31
w RoR Kontrola przepływu informacji przez aplikację Testy polegają na testowaniu scenariuszy tests/integration Generowanie szkieletu $ ruby script/generate integration test pierwszak Marcin Młotkowski Programowanie w Ruby 26 / 31
Przykładowy scenariusz (przypadek użycia) Student wchodzi na stronę i jest przekierowany na stronę logowania Student loguje się Jeśli sukces to jest przekierowany na stronę główną Student wybiera dwa przedmioty Student jest zapisany dwa przedmioty Student się wylogowuje Marcin Młotkowski Programowanie w Ruby 27 / 31
Implementacja scenariusza Wstęp Zajęcia.delete all ruby = wyklad(:ruby) ldi = wyklads(:ldi) Marcin Młotkowski Programowanie w Ruby 28 / 31
Wejście na stronę get /wyklads/index assert redirect to /login/haslo post via redirect /login/validate :user => { :name => pierwszak, :passwd => ******* } assert template wyklads/index assert response :success assert equal session[:user id] = Student(:pierwszak).id Marcin Młotkowski Programowanie w Ruby 29 / 31
Wybranie danych get /wyklads/ + wyklad(:ruby).id + /dodaj/ assert template index get /wyklads/ + wyklad(:ldi).id + /dodaj/ assert equal 2, session[:zajecia].dane.size Marcin Młotkowski Programowanie w Ruby 30 / 31
Uruchamianie poleceniem rake wszystkie testy: rake test testy kontrolerów: rake test:controllers testy jednostkowe: rake test:units Marcin Młotkowski Programowanie w Ruby 31 / 31
Minitest Środowisko do testów, od wersji Ruby 1.9. Marcin Młotkowski Programowanie w Ruby 32 / 31