W dzisiejszym wpisie zajmiemy się rozbudową testu logowania do poczty Onet i rozszerzymy go o kilka elementów.
Wcześniejszy artykuł pod tytułem “Test automatyczny BDD w Selenium z wykorzystaniem Python i Behave – instrukcja krok po kroku” dostępny jest pod tym linkiem.
W tym artykule między innymi:
- Jak dodawać testy sterowane danymi
- Podstawy obsługi wyjątków
- Jak generować ciekawe raporty z testów
Zacznijmy od jednej zmiany, którą musimy wprowadzić ze względu na RODO, czyli kliknięcie okna pop-up, które pojawia się w momencie logowania do poczty.
Wybieramy sposób dostania się do elementu “przejdź do serwisu” po CSS:
Dla przypomnienia, aby zlokalizować element użyjemy Narzędzi deweloperskich przeglądarki. W przypadku Google Chrome można użyć skrót klawiszowy Ctrl + Shift + I
Nasz kod będzie teraz wyglądać tak:
@given ('user is on Poczta Onet website') def step_start_page (context): context.driver.get('http://poczta.onet.pl/') rodo = context.driver.find_element_by_css_selector("button.cmp-button_button.cmp-intro_acceptAll") if rodo.is_displayed(): rodo.click()
Selenium najpierw próbuje znaleźć element RODO, a gdy go znajdzie klika w zdefiniowany element. Dzięki temu zabiegowi mamy ponownie dostęp do panelu logowania i możliwość wpisania loginu i hasła.
Następnie powinniśmy wpisać dane logowania, ale w tym momencie dokonamy bardzo istotnej zmiany, która przyda się w testach BDD.
Wcześniej nasze dane do logowania czyli login i hasło były wpisane w pliku login_steps.py i ograniczone były do wpisania danych do logowania jednego użytkownika, a chcielibyśmy żeby nasz test sprawdzał kilka zestawu danych. Dlatego do naszego testu dodamy Data-Driven-Testing z różnymi parametrami wejściowymi.
Czas dokonać kilku modyfikacji w naszym kodzie
Zacznijmy od naszego pliku login.feature. Dodamy do naszego testu niezbędne modyfikacje. Na początku trzeba dodać do nazwy Scenario słowo Outline, który będzie sugerować behav,e że będzie to test sterowany danymi.
Jako, że username i password będą zmienne należy je umieścić w <>
Do naszego pliku dodajemy na końcu sekcję Examples: w której będziemy umieszczać nasze dane wejściowe. Najpierw podajemy nazwę zmiennej, a pod nazwami zamieszczamy przykładowe dane.
Scenario Outline: Log in with valid data Given user is on Poczta Onet website When user fills valid username and valid password and submits it Then User can see email list Examples: | username | password | | [email protected] | haslo1 | | [email protected] | haslo2 |
Następnie trzeba dokonać modyfikacji w kodzie Pythona w pliku login_steps.py
Nasz login i hasło nie musi być już przechowany jako zmiana w kodzie, więc te linijki możemy usunąć.
Usuwamy:
password = 'zmienna z hasłem'
context.driver.find_element_by_id('f_login').send_keys('[email protected]')
Kod powinien wyglądać tak:
@when('user fills valid username {username} and valid password {password} and submits it') def step_set_login_in(context, username, password): context.driver.find_element_by_id('f_login').send_keys(username) context.driver.find_element_by_id('f_password').send_keys(password) context.driver.find_element_by_css_selector('#loginForm > div.formContainer > ul:nth-child(1) > li.perm > input.loginButton').click()
Dane wyjściowe, które znajdują się w pliku login.feature umieszczamy w nawiasie klamrowym {}
Testy powinny być niezależne, dlatego dokonamy niezbędne zmiany w pliku enviroment.py
from selenium import webdriver import selenium def before_scenario(context, scenario): context.driver = webdriver.Chrome() context.driver.implicitly_wait(3) def after_scenario(context, scenario): context.driver.quit()
Zmiana powoduje, że po wykonaniu każdego scenariuszu przeglądarka zostanie zamknięta. Gdybyśmy zostawili kod taki, jaki był w pierwszym artykule, po wykonaniu przypadku testowego i zalogowaniu się do poczty Selenium wykonałoby próbę wykonania kolejnego przypadku testowego.
Teraz po wpisaniu polecenia behave zostanie wykonane zostanie sprawdzenie przypadku testowego z pierwszym zestawem (login i hasło), a następnie automatycznie zostaną sprawdzone kolejne dane logowania, więc w łatwy sposób możemy sprawdzić duży zestaw danych łatwy do zarządzania i modyfikacji.
Nasz przypadek testowy obejmował sprawdzenie logowania po wpisaniu poprawnych danych logowania. Teraz dodamy kolejny przypadek testowy sprawdzający zachowanie, gdy użytkownik wpisze błędny dane logowania - przypadek negatywny.
Czyli analogicznie tworzymy kolejny Scenario Outline w pliku login.feature:
Scenario Outline: Log in with invalid data Given user is on Poczta Onet website When user fills invalid username and invalid password and submits it Then User can see alert about invalid date Examples: | invalidusername | invalidpassword | | zly_login | zlehaslo | | [email protected] | blednehaslo |
Dodatkowo, w tym przypadku możemy korzystać z już zdefiniowanych kroków. W kodzie python-a w pliku login_steps.py nie ma już potrzeby kodowania kroków poprzez Selenium (na przykład otwarcia przeglądarki i wejścia na adres poczty oraz sprawdzenia asercji).
W tym momencie zastosujemy kolejną nowość (yeeeahh! ;), a mianowicie obsługę wyjątków. Będziemy chcieli sprawdzić, czy w przypadku wpisania niepoprawnych danych wyświetli się komunikat.
Więcej o obsłudze wyjątków w dokumentacji Pythona:
Zacznijmy od dodania biblioteki do obsługi wyjątków:
from selenium.common.exceptions import ElementClickInterceptedException
Schemat obsługi wyjątków składa się z elementu try, które Selenium najpierw próbuje wykonać oraz except czyli czynności jakie Selenium dokona w przypadku niepowodzenia kodu z try.
@then('User can see alert about invalid date') def step_valid_login(context): try: alert_content = context.driver.find_element_by_css_selector("div.messageContent") assert alert_content.text == "Wprowadź poprawny adres e-mail" or "Niepoprawny e-mail lub hasło" print(alert_content) context.driver.save_screenshot("screenshot-invalidlogin.png") except: print("Alert not found!")
Nasz test zaczyna od znalezienia elementu z alertem błędu, np. gdy użytkownik wpisze nieprawidłowy format e-mail lub błędne dane logowania. Test sprawdza, czy odpowiedni tekst znajduje się w treści alertu. W przypadku braku odpowiedniej wiadomości test zwróci wyjątek i komunikat “Alert not found” w naszym przypadku.
Jak już poznaliśmy podstawy obsługi wyjątków, można ją dodać do naszego sprawdzenia komunikatu o RODO.
try:
rodo.click() except ElementClickInterceptedException: print("Element RODO not found!")
Do naszego testu w sekcji logowania z nieprawidłowymi danymi dodamy jeden zestaw danych z prawidłowymi danymi logowania, aby spowodować brak wyświetlenia alertu i sprawdzić czy obsługa wyjątków działa.
Więc podmienimy:
| zly_login | zlehaslo |
na :
| [email protected] | poprawnehaslo |
Teraz używamy dobrze znane polecenie behave w cmd i naszym oczom ukaże się komunikat:
Na końcu pierwszego artykułu o testowaniu automatycznym BDD w Selenium można było zobaczyć raport z testu w przeglądarce internetowej. Obecnie wynik z naszego testu nie jest przyjemny dla oka i na pewno nie jest user-friendly. BDD ma na celu zobaczenie działania testu także osobom nietechnicznym, dlatego wynik powinien być prezentowany w sposób bardziej przyjazny użytkownikowi. W tym momencie zajmiemy się tym aspektem.
Pisząc na studiach podyplomowych - Tester Oprogramowania, razem ze wspaniałą grupą (pozdrowienia dla Karoliny, Kasi, Ani i Michała) pracę dyplomową pt.: Projekt i wykonanie automatycznych testów funkcjonalnych wg filozofii BDD za pomocą behave (Python) i Selenium jedną z moich ról było zajęcie się raportami z testu. W moich poszukiwaniach natknąłem się na framework allure służący do graficznej prezentacji wyników testów.
Strona projektu:
https://github.com/allure-framework
Instalacja Allure:
Krok 1: Uruchomienie powershell
Krok 2: Z poziomu powershell instalacja scoop
Polecenie: iex (new-object net.webclient).downloadstring('https://get.scoop.sh’)
Krok 3: Instalacja allure w Powershell: scoop install allure
Krok 4: Instalacja biblioteki Allure: pip install allure-behave
W naszym kodzie spostrzegawcze osoby mogły zauważyć taką oto linijkę:
allure.attach.file('screenshot-login.png', 'Opening url')
Ten fragment kodu jest odpowiedzialny za dołączenie screenshotu z testu bezpośrednio do naszego raportu wygenerowanego za pomocą allure. Bardzo fajna rzecz.
Jak już podstawy mamy omówione, można uruchomić polecenie i zobaczyć nasz nowy zdecydowanie bardziej user-friendly raport z testów.
Uruchamiamy powershell i wpisujemy polecenie:
behave -f allure_behave.formatter:AllureFormatter -o raport ./features
Behave to standardowe polecenie, które w cmd wykona test z wykorzystaniem frameworka behave. My w tym momencie chcemy skorzystać z dodatkowego formatowania dlatego dodajemy parametr -f oraz dalszą część odpowiedzialną za zapisania raportu w formacie allure.
Teraz gdy cały test się wykona - czas na ujrzenie naszego nowego raportu:
W powershell wpisujemy polecenie:
allure serve raport
Raport to zdefiniowany katalog do zapisania raportu z testów.
Jak wygląda allure w praktyce:
Podsumowanie wyniku testów:
Lista przypadków testowych wraz z wynikiem i danymi użytymi w danym przypadku:
W allure istnieje możliwość dodania screenshotu wprost do raportu
W allure łatwo można zobaczyć przypadki testowe, w których odnotowany został błąd oraz można przejrzeć wcześniejsze testy:
Allure oferuje także wykresy i statystyki:
Cały kod z testu dostępny na GitHub pod adresem:
https://github.com/anditpl/onet-bdd
W następnej części postaram się ;) na stworzonym przez nas projekcie zastosować Page Object Pattern.