• Nie Znaleziono Wyników

Aplikacje WWW - lab 7

N/A
N/A
Protected

Academic year: 2022

Share "Aplikacje WWW - lab 7"

Copied!
18
0
0

Pełen tekst

(1)

Aplikacje WWW - lab 7

Jan Wróblewski

20 kwietnia 2015

(2)

django-debug-toolbar

Django-debug-toolbar to bardzo przydatna aplikacja do Django, która wstrzykuje do wyświetlanej strony informacje nt. zmiennych dostarczonych do template’ów, czasu wykonania, wykonanych zapytań SQL i innych.

Aby ją wykorzystać wystarczy zainstalować pip install django-debug-toolbar oraz dodać ’debug_toolbar’ do listy INSTALLED_APPS w pliku settings.py naszego projektu Django.

(3)

Unit testy w Django

Są to unit testy Pythonowe wykonujące się w kontekście konkretnego projektu Django, gdzie domyślnie każdy test wykonuje się na czystej bazie danych. Framework unit testowy z Django jest nadbudówką nad

standardowym Pythonowym modułem unittest i z niego też wywodzi się większoć assertów etc.

Tutorial:

https://docs.djangoproject.com/en/1.9/intro/tutorial05/

https://docs.djangoproject.com/en/1.9/topics/testing/

https://docs.python.org/3/library/unittest.html Extra (nieco stare):

https://realpython.com/blog/python/

django-1-6-test-driven-development/

Łączenie selenium z testami automatycznymi Django:

(4)

Testowanie views

Jedną z ciekawszych rzeczy, z którymi warto się zapoznać jest client - wirtualna ”przeglądarka” wewnątrz unit testu, którą można otworzyć dany URL i sprawdzić czy zwracana odpowiedź zawiera odpowiednią wartość w zmiennej przesłanej do template (w kontekście):

response = self.client.get("/url/")

self.assertEqual(response.context["answerVariable"], 42)

(5)

Selenium

Selenium to framework do automatyzacji czynności wykonywanych w przeglądarce internetowej. Strona WWW: http://www.seleniumhq.org.

Jest w stanie automatyzować wyszukiwanie elementów, wpisywanie znaków w formularz, klikanie na guziki i inne. Wszystko to dzieje się w prawdziwej przeglądarce z jej natywną implementacją JavaScript i innych technologii.

Wspierane są najpopularniejsze przeglądarki, m. in. Firefox, Chrome, IE, Safari, Opera. Możemy sobie wybrać na czym testujemy.

(6)

Selenium

Jest kilka produktów Selenium:

Selenium WebDriver - służy do automatycznego wykonywania

czynności w przeglądarce za pomocą skryptu w języku programowania Python, Java, C#, Ruby, Perl lub PHP;

Selenium IDE - to add-on do Firefoxa, który nagrywa makra z czynności które ręcznie wykonujemy w przeglądarce, a potem odtwarza je;

Selenium Grid - gdybyśmy chcieli odpalić testy na wielu serwerach z różnymi konfiguracjami;

Selenium Remote Control - kontrolowanie przeglądarki uruchomionej na innym serwerze lub lokalnie jako aplikacja klient-serwer.

My będziemy używać Selenium WebDrivera do testów automatycznych.

(7)

Selenium przez Pythona

Na początek musimy zainstalować selenium. Poniżej instalacja w virtualenvie zawartym w katalogu ve.

$ source ve/bin/activate (ve)$ pip install selenium

Tu jest dobry tutorial/dokumentacja na początek:

http://selenium-python.readthedocs.org.

(8)

Aplikacja do testowania

Przetestujmy AJAXową aplikację z aukcjami z zeszłego roku: http:

//www.mimuw.edu.pl/~xi/download/www-2014L/auctions2.zip. Jest ona trochę antyczna (na Python 2.7, Django 1.7.7), ale modulo usunięcie starej bazy danych, ponowne utworzenie jej i kilka warningów powinna dać się uruchomić. Uruchamiamy ją np. na localhost:8000 i tworzymy w panelu administracyjnym jeden testowy rekord modelu Bid (liczy się to, by miał pk równe 1).

Zrobimy dwa testy:

Sprawdzimy czy poprawnie podbijana jest cena po wpisaniu większej ceny niż obecna i kliknięciu przycisku;

Sprawdzimy czy poprawnie nie jest podbijana cena po wpisaniu mniejszej ceny i czy wyświetla się przy tym jakiś alert.

(9)

Test case 1

from selenium import webdriver

from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By

from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions

driver = webdriver.Firefox() driver.get("http://localhost:8000") assert u"Aukcja U" in driver.title

elem = driver.find_element_by_css_selector("span#current-price") currentPrice = elem.text

newPrice = str(int(currentPrice) + 1)

elem = driver.find_element_by_css_selector("input#price") elem.send_keys(newPrice)

elem = driver.find_element_by_css_selector("button#bid") elem.click()

wait = WebDriverWait(driver, 10)

wait.until(expected_conditions.text_to_be_present_in_element((By.ID, ’current-price’), newPrice)) driver.close()

Prześledźmy wykonanie tego skryptu po kolei.

(10)

Test case 1

Otwieranie przeglądarki

driver = webdriver.Firefox()

Stworzenie obiektu drivera otwiera przeglądarkę podłączoną pod selenium.

W tym przypadku otwierany jest Firefox i otwierane jest jego okno.

Otwieranie strony w przeglądarce

driver.get("http://localhost:8000") To otwiera konkretną stronę w przeglądarce.

(11)

Test case 1

Asercja na tytule

assert u"Aukcja U" in driver.title

To pierwsza część testów. Sprawdzamy czy tytuł zawiera podstring

”Aukcja U”. Możemy dać też ”Używany kapeć”, by sprawdzić czy dobrze pobieramy dane z bazy danych. W Pythonie 2 string musimy poprzedzić literką u, aby był w Unicode i przyjmował polskie znaki. Musimy też ustawić kodowanie na utf-8.

Asercje rzucą wyjątkiem, jeżeli wartość logiczna w nich podana będzie False.

(12)

Test case 1

Wybór elementu i jego zawartości tekstowej elem = driver.find_element_by_css_selector(

"span#current-price") currentPrice = int(elem.text) newPrice = str(currentPrice + 1)

Znajdujemy element z obecną ceną za pomocą selektora CSS i pobieramy z niego obecną wartość tekstową. Jeżeli element nie zostanie znaleziony to będzie rzucony wyjątek. Konwertujemy cenę na inta i obliczamy podbitą cenę.

(13)

Test case 1

Wpisywanie znaków w input

elem = driver.find_element_by_css_selector("input#price") elem.send_keys(newPrice)

Znajdujemy pole do wpisania nowej ceny i symulujemy wpisywanie znaków.

Klikanie w guzik

elem = driver.find_element_by_css_selector("button#bid") elem.click()

Znajdujemy guzik do wysłania nowej ceny i symulujemy kliknięcie. W tym momencie przeglądarka zaczyna wykonywać asynchronicznie żądanie

(14)

Test case 1

Czekanie na zmianę tekstu

wait = WebDriverWait(driver, 10) wait.until(expected_conditions.

text_to_be_present_in_element(

(By.ID, ’current-price’), newPrice))

Potrzebujemy mechanizmu do poczekania na wykonanie się AJAXa lub innej akcji - waita. Czekamy do 10 sekund aż tekst w elemencie o id current-price zmieni swoją wartość na nową cenę. W przeciwnym razie rzucamy wyjątek. Jest wiele akcji, na które możemy czekać - patrz dokumentacja.

(15)

Test case 1

Zamykanie przeglądarki w przypadku sukcesu driver.close()

W ten sposób zamykamy przeglądarkę. Jeżeli po drodze wystąpi wyjątek to przeglądarka pozostanie otwarta.

Zamykanie przeglądarki zawsze try:

# skrypt testujacy finally:

driver.close()

W ten sposób zamykamy przeglądarkę po wykonaniu się testów, nawet

(16)

Test case 2

Teraz sprawdzamy czy po wpisaniu za niskiej ceny mamy błąd i brak zmiany ceny.

from selenium import webdriver

from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.alert import Alert from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions

driver = webdriver.Firefox() driver.get("http://localhost:8000")

elem = driver.find_element_by_css_selector("span#current-price") currentPrice = elem.text

newPrice = str(int(currentPrice) - 1)

elem = driver.find_element_by_css_selector("input#price") elem.send_keys(newPrice)

elem = driver.find_element_by_css_selector("button#bid") elem.click()

wait = WebDriverWait(driver, 10)

wait.until(expected_conditions.alert_is_present()) Alert(driver).dismiss()

elem = driver.find_element_by_css_selector("span#current-price") assert currentPrice == elem.text

driver.close()

(17)

Test case 2

Czekanie na alerta

wait.until(expected_conditions.alert_is_present()) W ten sposób czekamy na pojawienie się alerta.

Zamykanie alerta

Alert(driver).dismiss()

W ten sposób zamykamy alerta. Gdyby alert zawierał opcję tak/nie, moglibyśmy również użyć accept()/dismiss() odpowiednio.

(18)

Materiały z Selenium

Dobra nieoficjalna dokumentacja-tutorial:

http://selenium-python.readthedocs.org.

Pełna dokumentacja dla Pythona: http:

//selenium.googlecode.com/svn/trunk/docs/api/py/index.html.

Pełna dokumentacja narzędzia: http://www.seleniumhq.org/docs.

Cytaty

Powiązane dokumenty

do to operator czyli słuzy do tworzenia pytan i przeczen /don't w 3os lp to does i doesn't. Ten czas present simple uzuwamy dla okreslania czynnosci w terazniejszosci powtarzajacych i

Z innej perspektywy to Quentin Tarantino jest reżyserem filmu, jednakże nie on jest twórcą postaci Django, zaczerpniętej z filmu z 1966 roku, włoskiego spaghetti

Napisz pięć zdań o tym, jakie składniki znajdują się w Twojej

Część ViewModel jest tutaj odpowiedzialna za udostępnianie danych z modelu do widoku w.

 ImageField - pole takie jak FileField z tym że sprawdza czy plik jest grafiką. Posiada dwa opcjonalne argument - height_field i width_field, które jeżeli użyte będą

 XMLHttpRequest - klasa umożliwiająca asynchroniczne przesyłanie danych; dzięki asynchroniczności w trakcie pobierania danych użytkownik może wykonywać inne czynności,

The two sided unit root test of a first-order autoregressive model in the presence of an innovation outlier is considered.. In this paper, we present three tests; two are usual and

Żeby przypomnieć sobie słówka oznaczające różne dolegliwości otwieracie podręcznik na str. Natomiast na str. 58 musicie ustnie wykonać ćw. 1, by przekonać się ,że