Testing

Robot Framework – wprowadzenie do automatyzacji testów aplikacji webowej

Styczeń 30, 2019 8
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 🙂

 

5 / 5
Kategorie: Testing
Łukasz Krause
Autor: Łukasz Krause
Pracuje w Sii jako Młodszy 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(8)

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ć $.

Zostaw komentarz