Testing

Robot Framework – wprowadzenie do automatyzacji testów aplikacji webowej

Styczeń 30, 2019 9
Podziel się:

Robot Framework to ciekawe narzędzie, które może nam pomóc zautomatyzować testy w różnych projektach. W tym artykule chciałbym opisać to narzędzie i pokazać jego zastosowanie w automatyzacji aplikacji webowej.

bitmoji 20181212115512 2 - Robot Framework - wprowadzenie do automatyzacji testów aplikacji webowejDzień dobry 🙂 Czasem w życiu początkującego testera słowa takie jak: automatyzacja, Selenium, programowanie mogą wywołać strach i lekką panikę. Dlatego wydaje mi się, że narzędzie to może być dobrym początkiem na rozpoczęcie przygody z automatyzacją. Niedawno natknąłem się na ciekawy projekt Robot Framework (w dalszej cześci będę je nazywać Robot). Postaram się Robota zaprezentować na przykładzie testu logowania do poczty Onet.pl

Czego dowiesz się z artykułu?

  • Robot framework logo 1 - Robot Framework - wprowadzenie do automatyzacji testów aplikacji webowejJak zainstalować Pythona i biblioteki za pomocą polecenia pip
  • Jak zainstalować Robot Framework wraz z potrzebnymi bibliotekami
  • Jak skonfigurować pierwszy test automatyczny
  • Jak napisać łatwy przypadek testowy z wykorzystaniem Robot Framework
  • Jak za pomocą konsoli cmd oraz Excela usprawnić swoją pracę
  • Jak uruchomić przygotowany test

Automatyzacja testów jest jedną ze ścieżek rozwoju testera i jest obecnie bardzo popularna. Nawet moja kotka o imieniu Kimci stara się opanować tę wiedzę i czyta branżowe książki na temat automatyzacji testów, i ostatnio zaczęła sięgać po książkę o Java.

20181212 160606 0001 1024x840 - Robot Framework - wprowadzenie do automatyzacji testów aplikacji webowej

Czemu ten framework zrobił na mnie takie wrażenie?

Narzędzie to jest bardzo zaawansowane i można je użyć w różnych projektach. Framework ten posiada wiele wbudowanych bibliotek, a także można korzystać z zewnętrznych. Dzięki duetowi Robot + Appium możesz przeprowadzić testy na urządzeniach mobilnych. Robot pomoże Ci także wykonać testy REST API, baz danych. Nic nie stoi na przeszkodzie wykorzystać w projekcie Continuous Integration na przykład Jenkins.

Robot pozwolił mi w łatwy sposób stworzyć test automatyczny i przy okazji umożliwił mi bez posługiwania się zewnętrznymi frameworkami lub bibliotekami uzyskać raport z wynikami testów w przystępnej formie.

Moim zdaniem framework ten jest też przydatny ze względów biznesowych i można napisać w łatwy sposób test z wykorzystaniem języka naturalnego (Keyword-driven) – oraz oczywiście w Robot Framework można skorzystać z konstrukcji BDD  when, given, then.

Cała magia tego narzędzia polega na tym, że my do niego “mówimy” po angielsku (można także po niemiecku i hiszpańsku), a gdy wykonujemy test to framework nasze polecenia zamienia na odpowiedni kod.

Strona projektu: Robot Framework

Projekt jest ciągle rozwijany i posiada wielu użytkowników zaangażowanych w jego rozwój. Jeżeli natrafisz na jakieś problemy lub będziesz chciał się spytać o rzeczy związane z tym narzędziem możesz to zrobić za pomocą listy mailingowej, lub skorzystać z kanału IRC czy na Slacku.

Instalacja

Najpierw należy zainstalować Python-a i pamiętać o opcji Add to Path

Instalacja Python-a

Następnie instalujemy framework korzystając z konsoli cmd:

pip install robotframework

W naszym projekcie będziemy korzystać z biblioteki SeleniumLibrary, dlatego tą bibliotekę też musimy zainstalować.

pip install robotframework-seleniumlibrary

Do pisania naszego testu polecam PyCharm.

Wykorzystanie

Teraz możemy zaczynać 🙂 Na początek dla porównania chciałbym pokazać – kod testu do logowania do poczty z wykorzystaniem Pythona i behave (prawa strona) oraz w Robot Framework (lewa strona).

Porównanie kody

Zaczniemy od utworzenia i skonfigurowania naszego skryptu. W tym celu tworzymy nowy plik z rozszerzeniem *.robot PyCharm powinien automatycznie zaproponować instalację wtyczek związanych z tym frameworkiem.  W moim przypadku PyCharm zaproponował instalcję pluginów pokazanych poniżej:

Wtyczki
Jako że test będzie sprawdzał logowanie do Poczty Onet.pl. Utworzyłem plik Onet.robot.

Następnie tworzymy nasz test wykorzystując dostępne sekcje:

*** Settings *** wykorzystywana do konfiguracji i ustawień
*** Varibles *** wykorzystywana do przechowywania zmiennych
*** Test cases *** wykorzystywana do tworzenia przypadków testowych
*** Keywords *** wykorzystana do definiowania czynności dla danego kroku

Dlatego zaczniemy w sekcji ustawień od zaimportowania biblioteki, z której będziemy w naszym teście korzystać.

 *** Settings ***
Library SeleniumLibrary

W sekcji Settings mamy możliwość ustawienia bibliotek, z których korzystamy. Listę dostępnych bibliotek znajdziesz tutaj.

Sekcja Variables służy do ustawienia naszych zmiennych. Jak zobaczysz w zmiennej Browser wystarczy wpisać tylko Chrome. Oczywiście w takim przypadku odpowiednie drivery muszą znajdować się w katalogu projektu. Jeżeli chcielibyśmy uruchomić test w innej przeglądarce, wystarczy wpisać jej nazwę.

*** Settings ***
Library  SeleniumLibrary

*** Variables ***
${LOGIN URL}          http://www.poczta.onet.pl/
${BROWSER}      Chrome
@{list} =  Niepoprawny e-mail lub hasło.   Wprowadź poprawne dane.

Dla porównania odpowiedni kod w Javie wyglądałby tak:

import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

public class Onet {

   public static void main(String[] args) {

       System.setProperty("webdriver.chrome.driver", "G:\\Selenium\\chromedriver.exe");

       ChromeDriver driver = new ChromeDriver();

W językach programowania na przykład Java czy Python aby uruchomić test w innej przeglądarce za każdym razem musiałbyś zaimportować właściwe biblioteki i wskazać odpowiedni driver. Różnicę widać bardzo mocno.

W Robot Framework nie ma takiej potrzeby. Dodatkowo w łatwy sposób można tak napisać skrypt, że przed testem Robot spyta się w jakiej przeglądarce uruchomić ma test. Rozwiązanie to znajdziesz w moim projekcie na GitHub-ie.

Następnie możemy przejść do sekcji Test cases. W tej sekcji ustawiamy kolejne kroki, które będą wykonywane. Kroki te musimy zdefiniować w sekcji Keywords.

*** Test Cases ***
Valid Login
   Open main page
   Rodo
   Input Username
   Input Password
   Login button
   Assert Onet Mail
   [Teardown]    Close Browser

Invalid Login
   Open main page
   Rodo
   Input invalid login
   Input invalid password
   Login button
   Assert invalid
   [Teardown]  close browser

Sekcja Keywords ogranicza się do wskazania, w jakim przypadku z sekcji Test case co framework ma zrobić. W tej sekcji wskazujemy na przykład, jaka strona ma zostać otworzona i następnie lokalizujemy elementy i wchodzimy w interakcję z nimi. Oczywiście korzystamy z dobrze nam znanych lokalizatorów między innymi poprzez id, css, XPath.

Tutaj zamieszczam poradnik jak lokalizować elementy z wykorzystaniem Selenium.

Wiadomo, że test powinien coś za pomocą asercji sprawdzać i weryfikować czy aplikacja zachowuje się w oczekiwany sposób. 

Asercja (ang. assertion) – predykat (forma zdaniowa w danym języku, która zwraca prawdę lub fałsz), umieszczony w pewnym miejscu w kodzie. Asercja wskazuje, że programista zakłada, że predykat ów jest w danym miejscu prawdziwy. W przypadku gdy predykat jest fałszywy (czyli niespełnione są warunki postawione przez programistę) asercja powoduje przerwanie wykonania programu. Asercja ma szczególne zastosowanie w trakcie testowania tworzonego oprogramowania, np. dla sprawdzenia luk lub jego odporności na błędy. Zaletą stosowania asercji jest możliwość sprawdzenia, w którym fragmencie kodu źródłowego programu nastąpił błąd. [Źródło: wikipedia.pl]

Jak widać poniżej użyłam do tego konstrukcję  Title Should Be, Page should contain element oraz Should Contain Any.

*** Keywords ***

Open main page
   Open browser    ${LOGIN URL}   ${BROWSER}
   Title Should Be    Onet Poczta - najlepsza skrzynka pocztowa
Rodo
   wait until element is visible  css=button.cmp-button_button.cmp-intro_acceptAll
   Click Element  css=button.cmp-button_button.cmp-intro_acceptAll
Input Username
   Input Text id=f_login validlogin@onet.pl
Input password
   Input Text  id=f_password   validpassword
Login button
   click element  css=input.loginButton
Assert Onet Mail
   page should contain element  id=NewMail-button
Input invalid login
   Input Text id=f_login  blednylogin@onet.pl
Input invalid password
   Input Text  id=f_password   blednehaslo1
Assert invalid
   wait until element is visible   class=messageContent
   get text  class=messageContent
   Should Contain Any ${list}    Niepoprawny e-mail lub hasło.   Wprowadź poprawne dane.

Dla przykładu, gdy użytkownik poprawnie się zaloguje powinien zobaczyć listę wiadomości i móc wysłać wiadomość klikając przycisk “Napisz wiadomość”. Dlatego poprawne zalogowanie sprawdzamy poprzez weryfikowanie czy na stronie znajduję się element:  id=NewMail-button poprzez słowa  page should contain element

Z dokumentacji tego frameworku możesz dowiedzieć się, z jakich keywordów możesz skorzystać. Tak wygląda lista keywordów w bibliotece Selenium:

keywords 1024x138 - Robot Framework - wprowadzenie do automatyzacji testów aplikacji webowej

Uruchamianie testu

Kod całego pliku powinien wyglądać tak:

*** Settings ***
Library  SeleniumLibrary

*** Variables ***
${LOGIN URL}          http://www.poczta.onet.pl/
${BROWSER}      Chrome
@{list} =   Niepoprawny e-mail lub hasło.   Wprowadź poprawne dane.

*** Test Cases ***
Valid Login
    Open main page
    Rodo
    Input Username
    Input Password
    Login button
    Assert Onet Mail
    [Teardown]    Close Browser

Invalid Login
    Open main page
    Rodo
    Input invalid login
    Input invalid password
    Login button
    Assert invalid
    [Teardown]  close browser

*** Keywords ***

Open main page
    Open browser    ${LOGIN URL}   ${BROWSER}
    Title Should Be    Onet Poczta - najlepsza skrzynka pocztowa
Rodo
    wait until element is visible  css=button.cmp-button_button.cmp-intro_acceptAll
    Click Element  css=button.cmp-button_button.cmp-intro_acceptAll
Input Username
    Input Text	id=f_login	validmail@onet.pl
Input password
    Input Text  id=f_password   validpassword
Login button
    click element  css=input.loginButton
Assert Onet Mail
    page should contain element  id=NewMail-button
Input invalid login
    Input Text	id=f_login  blednylogin@onet.pl
Input invalid password
    Input Text  id=f_password   blednehaslo1
Assert invalid
    wait until element is visible   class=messageContent
    get text  class=messageContent
    Should Contain Any	${list}	Niepoprawny e-mail lub hasło.   Wprowadź poprawne dane.

Teraz nie pozostaje nam nic innego jak uruchomić nasz test. Jeżeli wszystko dobrze zainstalowaliśmy powinniśmy móc to zrobić z poziomu okna konsoli cmd lub za pomocą wbudowanego Terminala w PyCharm:

cmd

Jeżeli jesteśmy przy linii poleceń. Używając parametrów można modyfikować polecenie. Jako że przeglądarka w naszym teście jest zmienną, możemy użyć polecenia:

robot -v BROWSER:Firefox Onet.robot

W takim przypadku nasz test zostanie uruchomiony w przeglądarce Firefox.

Możemy także zmodyfikować folder, w którym będą przechowywane raporty i zrobimy to za pomocą plików z rozszerzeniem *.bat
Tworzymy w tym celu w folderze projektu plik Test Firefox.bat i korzystając np. z notatnika umieszczamy w nim tekst:

robot -d firefox_results -v BROWSER:Firefox Onet.robot 

Gdy go uruchomimy test zostanie wykonany w przeglądarce, a dodatkowo wynik testu zostanie zapisany w katalogu firefox_results (odpowiada za to parametr -d).

Teraz chciałbym pokazać, moim zdaniem, ciekawe rozwiązanie, które może być pomocne testerowi. Wyobraźmy sobie, że w naszym projekcie dostaliśmy dane użytkowników do logowania dla 100 osób i korzystając z naszego skryptu mielibyśmy dla wszystkich tych użytkowników sprawdzić logowanie do poczty z poprawnymi danymi.

2018 12 13 10 12 07 Zeszyt1 Excel - Robot Framework - wprowadzenie do automatyzacji testów aplikacji webowej

Hmmmm… jak to zrobić? 🤔 W naszym skrypcie musimy dokonać zmiany, która spowoduje że nazwa użytkownika i hasło będą zmiennymi, czyli w sekcji Variables dodajemy:

${username} = example@onet.pl
${password} = password

Teraz żeby to zadziało musimy dokonać zmiany w keywords:

Input Username
Input Text id=f_login ${username}
Input password
Input Text id=f_password ${password}

Teraz pozostaje nam dodać tag do naszego testu, który pozwoli dzięki odpowiedniemu poleceniu w cmd uruchomi ten konkretny przypadek testowy.

Pod przypadkiem testowym dodajemy linikę:

Valid Login
    [Tags]  Valid

Dalej chcieli byśmy, żeby te dane zostały zamienione w przydatne dla nas polecenie które moglibyśmy użyć w konsoli a następnie w pliku *.bat

Z pomocą przyjdzie nam Excel – potężne narzędzie, które moim zdaniem w codziennej pracy testera jest bardzo często wykorzystywane i pomocne. Skorzystamy z formuły ZŁĄCZ.TEKST

2018 12 13 10 15 44 Zeszyt1 Excel 1024x176 - Robot Framework - wprowadzenie do automatyzacji testów aplikacji webowej

Tworząc odpowiednią formułę dla jednej komórki korzystając z opcji przeciągania jesteśmy w stanie dla wszystkich nazw użytkowników i haseł stworzyć odpowiednie polecenie:

Przykładowe polecenie to:

robot -i Valid -d results\example1@onet.eu -v username:example1@onet.eu -v password:pass1234 Onet.robot

-i wskazujemy nazwę przypadku testowego do uruchomienia zdefiniowana za pomocą tagu
-d definiujemy gdzie mają być przechowywane logi, raporty i zrzuty ekranu
-v definiujemy zmienne

Wystarczy utworzyć plik *.bat i do niego wkleić wartości utworzone dzięki formule Excela i go uruchomić.

Jeżeli uruchomimy plik bat zostanie wykonany tylko przypadek logowania z tagiem”Valid” dodatkowo dla każdego użytkownika zostanie stworzony osobny folder o nazwie użytkownika:

2018 12 13 10 29 24 results 1024x285 - Robot Framework - wprowadzenie do automatyzacji testów aplikacji webowej

W przypadku uruchomienia ponownie testu pliki raportów i logów zostaną nadpisane i będą przechowywać wyniki ostatniego testów. Warto więc dodać do naszego polecenia -T (timestamp) który będzie odpowiadał, że kolejne testy bedą zapisywane do odzielnych plików z datą i godziną utworzenia raportu.

Całe polecenie będzie wyglądać tak:

robot -i Valid -d results\example1@onet.eu -v username:example1@onet.eu -v password:pass1234 -T Onet.robot

Raport z testów

Obraz2 - Robot Framework - wprowadzenie do automatyzacji testów aplikacji webowejNa końcu testu jesteśmy poinformowani, że Robot utworzył dla nas raport i log z testu w plikach output.xml, log.html i report.html

Pamiętam, że w przypadku Pythona i Behave, aby uzyskać raport, który dobrze by wyglądał musiałem posiłkować się zewnętrzną biblioteką Allure. Tutaj od razu otrzymujemy dobrze wyglądający raport z informacją o powodach, dlaczego test nie przeszedł. Robot dodatkowo w przypadku uzyskania FAIL automatycznie zrobi zrzut ekranu i dołączy go do raportu.

raport 1024x1005 - Robot Framework - wprowadzenie do automatyzacji testów aplikacji webowej

Wydaje mi się, że po napisanym szybko i w łatwy sposób automatycznym teście tester może być zadowolony i wieczorem zasnąć z uśmiechem na twarzy.

Na zakończenie chciałbym pokazać jak w praktyce wygląda test z użyciem Robot-a 😉

Test w Robot Framework

Oczywiście artykuł ten to  wprowadzenie do zastosowania frameworku w testerskim życiu codziennym. Narzędzie te bardzo przypadło mi do gustu i będę starał się poszerzyć wiedzę na jego temat oraz rozwinąć ten projekt o zastosowanie w nim BDD i o zaczerpnięcie danych do logowania z zewnętrznego pliku Excela oraz zmodyfikować test, aby był uruchamiany jednocześnie na kilku przeglądarkach.

Projekt ten znajdziesz na moim GitHub-ie : https://github.com/anditpl/Onet-robotframeworktest

smilies bank sit rest 160739 300x200 - Robot Framework - wprowadzenie do automatyzacji testów aplikacji webowej

Dziękuję za uwagę i życzę miłego dnia 🙂

 

4.7 / 5
Kategorie: Testing
Łukasz Krause
Autor: Łukasz Krause
Pracuje w Sii jako Inżynier ds. testów i analiz. Od dziecka interesuję się komputerami i nowinkami technologicznymi dlatego prowadzę amatorskiego bloga www.and-it.pl gdzie umieszczam wpisy związane z komputerami i nauką języków obcych z wykorzystaniem komputera i smartphone-ów. Lubię testować nowe urządzenia i aplikacje dlatego zdecydowałem się na studia podyplomowe z zakresu testowania i stąd chęć zostania Testerem. Staram się opanować tajniki automatyzacji a także schudnąć więc szybciej uda mi się zrealizować chyba pierwszy punkt ;) Prywatnie ojciec psa i kota lubiący niskobudżetowe podróże ;)

Imię i nazwisko (wymagane)

Adres email (wymagane)

Temat

Treść wiadomości

komentarze(9)

avatar'
Waldemar Mozoła
1 lutego 2019 Odpowiedz

Jak poprawić taki błąd
Onet
==============================================================================
Valid Login :: This test case check app when user use valid creden... | FAIL |
Parent suite setup failed:
No keyword with name 'Get Selection From User' found.
------------------------------------------------------------------------------
Invalid Login :: This test case check app when user use invalid cr... | FAIL |
Parent suite setup failed:
No keyword with name 'Get Selection From User' found.
------------------------------------------------------------------------------
Onet | FAIL |
Suite setup failed:
No keyword with name 'Get Selection From User' found.

2 critical tests, 0 passed, 2 failed
2 tests total, 0 passed, 2 failed
==============================================================================
Output: /home/waldemar/Onet-robotframeworktest/output.xml
Log: /home/waldemar/Onet-robotframeworktest/log.html
Report: /home/waldemar/Onet-robotframeworktest/report.html

    Łukasz Krause
    1 lutego 2019 Odpowiedz

    Hej :) Kluczowe wydaje mi się to -> No keyword with name 'Get Selection From User' found.
    "Get selection from User" traktuje Ci jako Keyword a nim nie jest.
    Musisz dokładnie sprawdzić czy nazwa kroku w ***Test cases*** jest identyczna z tą w ***Keywords***

    Porównaj dwa pliki:
    https://github.com/anditpl/Onet-robotframeworktest/blob/master/Onet.robot
    https://github.com/anditpl/Onet-robotframeworktest/blob/master/Resources/Onet.robot

    Z tego co widzę błąd Ci się wkradł tutaj https://github.com/anditpl/Onet-robotframeworktest/blob/master/Resources/Onet.robot:

    Open the browser
    ${new_browser} = Get Selection From User In which browser you want to run the test? chrome firefox edge
    Set Global Variable ${BROWSER} ${new_browser}

    lub tutaj w pliku https://github.com/anditpl/Onet-robotframeworktest/blob/master/Onet.robot:

    Suite Setup Open the browser

    Poprawić mógłbym gdybym zobaczył kod. ;)

avatar'
Piotr
1 lutego 2019 Odpowiedz

No no, zainteresowałeś nie tym frameworkiem. Świetny artykuł wprowadzający, dzięki.

avatar'
Raf Pol
19 lutego 2019 Odpowiedz

Dla początkującego radziłbym używać RIDE a nie pyCharm do pisania testów.

    Łukasz Krause
    4 marca 2019 Odpowiedz

    Jasne RIDE może być dobrym rozwiązaniem dla początkujących :) W pyCharm bardzo przyjemnie mi się pisało kod ;)

avatar'
igna
25 lutego 2019 Odpowiedz

Hej, świetny artykuł. Mam jednak pytanie, czemu w sekcji Variables, tylko przy list jest znak '@', a przy reszcie '$'?

    Łukasz Krause
    4 marca 2019 Odpowiedz

    Dzięki :)
    Ogólnie z dokumentacji wynika konwencja użycia @ przy tworzeniu listy:
    http://robotframework.org/robotframework/latest/libraries/BuiltIn.html

    Create List *items
    Returns a list containing given items.

    The returned list can be assigned both to ${scalar} and @{list} variables.

    Examples:

    @{list} = Create List a b c
    ${scalar} = Create List a b c
    ${ints} = Create List ${1} ${2} ${3}

    Można jednak też użyć $.

avatar'
Grzegorz
15 sierpnia 2020 Odpowiedz

Super tekst.

"Jak widać poniżej użyłam do tego konstrukcję Title Should Be, Page should contain element oraz Should Contain Any."

Popraw tylko forme osobowa bo czytajac mialem wrazenie ze pisaly go dwie osoby ;)

Zostaw komentarz