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.

test-automatyczny-bdd-selenium.png

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.

testa-utomatyczny-bdd-selenium-python.png

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:

test-automatyczny-bdd-selenium-2.png

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:

http://allure.qatools.ru/

https://github.com/allure-framework

Instalacja Allure:

Krok 1: Uruchomienie powershell

uruchomienie-powershell.png

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:

podsumowanie-wynikow-testow.png

Lista przypadków testowych wraz z wynikiem i danymi użytymi w danym przypadku:

W allure istnieje możliwość dodania screenshotu wprost do raportu

screenshot-do-raportu.png

W allure łatwo można zobaczyć przypadki testowe, w których odnotowany został błąd oraz można przejrzeć wcześniejsze testy:

allure-przypadki-testowe.png

allure-przypadku-testowe-2.png

Allure oferuje także wykresy i statystyki:

allure-wykresy.png

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.