Testy aplikacji webowych 13 kwietnia 2016 Testy aplikacji webowych 13 kwietnia 2016 1 / 26
1 Ogólnie 2 Django Baza danych Widoki Zaawansowane 3 Selenium 4 Testy wydajno±ciowe 5 Test Driven Developement 6 Technikala pythonowe Testy aplikacji webowych 13 kwietnia 2016 2 / 26
Test jednostkowy Test jednostkowy Test jednostkowy metoda testowania tworzonego oprogramowania poprzez wykonywanie testów werykuj cych poprawno± dziaªania pojedynczych elementów (jednostek) programu np. metod lub obiektów w programowaniu obiektowym lub procedur w programowaniu proceduralnym. Testowany fragment programu poddawany jest testowi, który wykonuje go i porównuje wynik (np. zwrócone warto±ci, stan obiektu, zgªoszone wyj tki) z oczekiwanymi wynikami tak pozytywnymi, jak i negatywnymi (niepowodzenie dziaªania kodu w okre±lonych sytuacjach równie» mo»e podlega testowaniu). * - wikipedia Testy aplikacji webowych 13 kwietnia 2016 3 / 26
Zalety Szybkie wykrycie bª dów Uproszczenie procesu wprowadzania zmian Dokumentacja Lepszy projekt aplikacji Testy aplikacji webowych 13 kwietnia 2016 4 / 26
Zastosowania Metodologie zwinne (TDD, Extreme Programming) Automatyzacja Szkielety do testowania Wsparcie ze strony j zyków Testy aplikacji webowych 13 kwietnia 2016 5 / 26
Przykªad w Django from django. test import TestCase from myapp. models import Animal class AnimalTestCase ( TestCase ): def setup ( self ): Animal. objects. create ( name =" lion ", sound =" roar ") Animal. objects. create ( name =" cat ", sound =" meow ") def test_ animals_ can_ speak ( self ): " Animals that can speak are correctly identified " lion = Animal. objects. get ( name =" lion ") cat = Animal. objects. get ( name =" cat ") self. assertequal ( lion. speak (), ' lion says " roar " ') self. assertequal ( cat. speak (), 'cat says " meow " ') Testy aplikacji webowych 13 kwietnia 2016 6 / 26
Uruchomienie $./ manage. py test Creating test database... ================================================== FAIL : test_ was_ published_ recently_ with_ future_ poll ( polls. tests. PollMethodTests ) -------------------------------------------------- Traceback ( most recent call last ): File "/ dev / mysite / polls / tests. py ", line 16, in test_ was_ published_ recently_ with_ future_ poll self. assertequal ( future_ poll. was_ published_ recently (), False ) AssertionError : True!= False --------------------------------------------------- Ran 1 test in 0.003 s FAILED ( failures =1) Testy 13 kwietnia 2016 7 / 26
Zasady Testy przechowujemy w plikach test*.py (tests.py i test_xxx.py) Testy wykonywane s w oddzielnych transakcjach Testy 13 kwietnia 2016 8 / 26
Baza danych Testy wymagaj ce bazy danych nie u»ywaj produkcyjnej bazy danych Baza danych tworzona jest specjalnie na potrzeby testu i kasowana po jego zako«czeniu (opcja keeppdb temu zapobiega) Testy 13 kwietnia 2016 9 / 26
Widoki Sztuczny Client Nie uruchamia serwera Testowanie odbywa si na zasadzie ±tring-matchingu" Testy 13 kwietnia 2016 10 / 26
Przykªad testu widoku from django. core. urlresolvers import reverse class QuestionViewTests ( TestCase ): def test_ index_ view_ with_ no_ questions ( self ): """ If no questions exist, an appropriate message should be displayed. """ response = self. client. get ( reverse ( ' polls : index ')) self. assertequal ( response. status_code, 200) self. assertcontains ( response, " No polls are available.") self. assertquerysetequal ( response. context [ ' latest_question_list '], []) Testy 13 kwietnia 2016 11 / 26
Opcje klienta >>> c = Client ( HTTP_USER_AGENT = ' Mozilla /5.0 ') >>> c = Client () >>> c. get ( '/ customers / details / ', { ' name ': ' fred ', 'age ': 7}) >>> c = Client () >>> c. get ( '/ customers / details / ', { ' name ': ' fred ', 'age ': 7},... HTTP_ X_ REQUESTED_ WITH = ' XMLHttpRequest ') >>> response = c. get ( '/ redirect_me / ', follow = True ) >>> response. redirect_ chain [( ' http :// testserver / next / ', 302), ( ' http :// testserver / final / ', 302)] >>> c = Client () >>> c. post ( '/ login / ', { ' name ': ' fred ', ' passwd ': ' secret '}) Testy 13 kwietnia 2016 12 / 26
U»ytkownicy >>> create_user ( ' fred ', email = None, password = ' secret ') >>> c = Client () >>> c. login ( username = ' fred ', password = ' secret ') Testy 13 kwietnia 2016 13 / 26
Odpowiedzi Response content - tre± odpowiedzi context - kontekst szablonu json - sparsowany json tre±ci status_code - jaki byª status resolver_match - jak zostaªa rozwi zana odpowied¹ Static cookies - ciasteczka session - sesja Testy 13 kwietnia 2016 14 / 26
RequestFactory class SimpleTest ( TestCase ): def setup ( self ): self. factory = RequestFactory () self. user = User. objects. create_user ( username = ' jacob ', email = ' jacob@ ', password = ' top_secret ') def test_ details ( self ): request = self. factory. get ( '/ customer / details ') request. user = self. user response = my_view ( request ) self. assertequal ( response. status_code, 200) Testy 13 kwietnia 2016 15 / 26
Bazy danych mo»na testowa wiele baz danych mo»na u»y bazy danych jako repliki mo»na u»ywa xtures (danych w plikach) mo»na resetowa sekwencje Testy 13 kwietnia 2016 16 / 26
Selenium Selenium Selenium to szkielet do testowania aplikacji webowych. Pozwala nagrywa sesje, zawiera wªasny j zyk makr oraz IDE. Posiada sterowniki do kilku popularnych j zyków. Mo»na go u»ywa np. z Firefoxem i Chrome. Ma odpowiedniki komercyjne. Testy 13 kwietnia 2016 17 / 26
Selenium-IDE Testy 13 kwietnia 2016 18 / 26
Python driver from selenium import webdriver from selenium. webdriver. common. keys import Keys driver = webdriver. Firefox () driver. get (" http :// www. python. org ") assert " Python " in driver. title elem = driver. find_element_by_name ("q") elem. send_keys (" pycon ") elem. send_keys ( Keys. RETURN ) assert " No results found." not in driver. page_ source driver. close () Testy 13 kwietnia 2016 19 / 26
Testy wydajno±ciowe Testuj zarówno aplikacj jak i infrastruktur Wymagaj ±rodowiska testowego Czasem potra co± zniszczy Ich przeprowadzenie wymaga niekiedy dodatkowych zasobów Testy 13 kwietnia 2016 20 / 26
Locust from locust import HttpLocust, TaskSet def login (l ): l. client. post ("/ login ", {" username ":" ellen_key ", " password ":" education " }) def index (l ): l. client. get ("/") def profile (l ): l. client. get ("/ profile ") class UserBehavior ( TaskSet ): tasks = { index :2, profile :1} def on_start ( self ): login ( self ) class WebsiteUser ( HttpLocust ): task_ set = UserBehavior min_ wait =5000 max_ wait =9000 Testy 13 kwietnia 2016 21 / 26
Locust Testy 13 kwietnia 2016 22 / 26
TDD Testy 13 kwietnia 2016 23 / 26
Zasady TDD manifest 1 Wymy±l co chesz zrobi 2 Wymy±l jak to przettestowa 3 Napisz maªy test. My±l o API 4 Napisz tyle kodu,»eby test si wywalaª 5 Patrz jak le»y 6 Napisz tyle kodu,»eby test przechodziª 7 Patrz jak przechodzi 8 Refaktoryzuj 9 Powtarzaj tak dªugo, a» nie masz pomysªów Testy 13 kwietnia 2016 24 / 26
Testowanie jako±ci kodu pep8 - wygl d pep257 - komentarze pylint3 - linter coverage - pokrycie testami Testy 13 kwietnia 2016 25 / 26
Syntastic Testy 13 kwietnia 2016 26 / 26