- Published on
Robot + Browser library (Playwright) (3. díl) - API
Úvod
Při testování UI je často užitečné nastavit před samotným testem aplikaci do požadovaného stavu přes API. Test se tak obvykle výrazně urychlí. V následujícím článku ukážu, jak se pomocí API zaregistruji a přihlásím a následně provedu standardní UI test. Na začátek uvedu stručný přehled, jak v Robot frameworku API requesty posílat.
Instalace
Instalaci provedeme ve virtuálním prostředí:
python -m venv venv
.\venv\Scripts\activate
Do aktivovaného prostředí nainstalujeme Robot Framework a knihovnu pro práci s API:
pip install robotframework
pip install robotframework-requests
Můžeme rovnou přidat i knihovnu pro UI testy a stáhnout prohlížeče:
pip install robotframework-browser
rfbrowser init
Základní API requesty
- GET request Odeslání GET requestu na health-check endpoint a kontrola statusu a zprávy v response:
*** Settings ***
Library RequestsLibrary
Library DateTime
*** Variables ***
${BASE_URL} https://users-api.projects.icanbreakit.eu
*** Test Cases ***
Test GET Request
Create Session my-session ${BASE_URL}
${response}= GET On Session my-session /hello
Should Be Equal As Integers ${response.status_code} 200
Should Contain ${response.json()}[message] Hello, API Testing!
- POST request Odeslání POST requestu pro založení uživatele a kontrola statusu a zprávy v response:
*** Settings ***
Library RequestsLibrary
Library DateTime
*** Variables ***
${BASE_URL} https://users-api.projects.icanbreakit.eu
*** Test Cases ***
Test POST Request
# create a random email
${timestamp}= Get Current Date result_format=%Y%m%d%H%M%S
${email}= Set Variable testuser_${timestamp}@example.com
Create Session my-session ${BASE_URL}
${data}= Create Dictionary email=${email} password=my-password
${response}= POST On Session my-session /register json=${data}
Should Be Equal As Integers ${response.status_code} 201
Should Be Equal ${response.json()}[message] User registered
Komplexní příklad s přípravou dat přes API
- definování vlastních keywords
- registrace a přihlášení přes API
- uložení záznamu do db přes UI
- použití Bearer tokenu v hlavičce DELETE requestu
Struktura projektu:
tests/
├── variables/
│ └── test-data.robot
├── keywords/
│ ├── api-keywords.robot
│ └── ui-keywords.robot
└── tests/
└── example-api-complex.robot
1. variables/test-data.robot
Obsahuje základní proměnné (API adresa, UI adresa, heslo, typ prohlížeče). Slouží jako konfigurace, kterou používají ostatní testy a keywords.
# test-data.robot
*** Variables ***
# test_data.robot
${API_BASE_URL} https://users-api.projects.icanbreakit.eu
${UI_BASE_URL} https://users.projects.icanbreakit.eu/
${TEST_PASSWORD} my-password
${BROWSER} chromium
2. keywords/api-keywords.robot
Definuje vlastní klíčová slova pro práci s API. Obsahuje registraci uživatele, login a získání JWT tokenu, získání seznamu uživatelů a jejich mazání.
# api-keywords.robot
*** Settings ***
Resource ../variables/test-data.robot
Library RequestsLibrary
Library Collections
Library String
Library DateTime
*** Variables ***
${API_SESSION} api_session
${AUTH_TOKEN} ${EMPTY}
*** Keywords ***
Register Test User
[Documentation] Zaregistruje nového uživatele
[Arguments] ${email} ${password}
Create Session ${API_SESSION} ${API_BASE_URL}
${registrationData}= Create Dictionary
... email=${email}
... password=${password}
${response}= POST On Session ${API_SESSION} /register
... json=${registrationData}
... expected_status=201
Log User registered successfully: ${email}
RETURN ${email}
Login And Get Token
[Documentation] Přihlásí uživatele a získá JWT token
[Arguments] ${email} ${password}
${login_data}= Create Dictionary
... email=${email}
... password=${password}
${response}= POST On Session ${API_SESSION} /login
... json=${login_data}
... expected_status=200
${token}= Get From Dictionary ${response.json()} token
Set Test Variable ${AUTH_TOKEN} ${token}
# Aktualizace session s auth headerem
${auth_headers}= Create Dictionary Authorization=Bearer ${token}
Update Session ${API_SESSION} headers=${auth_headers}
Log Successfully logged in and obtained token
RETURN ${token}
Get All Users
[Documentation] Získá seznam všech uživatelů
${response}= GET On Session ${API_SESSION} /users
... expected_status=200
${users}= Set Variable ${response.json()}
Log Retrieved ${len(${users})} users
RETURN ${users}
Delete Test Users
[Documentation] Vymaže všechny testovací uživatele
[Arguments] ${token}
${auth_headers}= Create Dictionary Authorization=Bearer ${token}
Update Session ${API_SESSION} headers=${auth_headers}
${response}= DELETE On Session ${API_SESSION} /users
... expected_status=200
3. keywords/ui-keywords.robot
Obsahuje klíčová slova pro práci s UI pomocí knihovny Browser. Otevírá aplikaci, provádí přihlášení přes UI, vytváří uživatele a kontroluje, zda se správně zobrazil. Nastavuje Bearer token přímo do LocalStorage - UI podle toho pozná, že je uživatel přihlášen.
# ui-keywords.robot
*** Settings ***
Resource ../variables/test-data.robot
Library Browser
*** Keywords ***
Open Browser On HomePage
[Documentation] Otevře prohlížeč a přihlašovací formulář
New Browser ${BROWSER} headless=false
New Page ${UI_BASE_URL}
Login To Application
[Documentation] Přihlásí se do aplikace přes UI
[Arguments] ${email} ${password}
Click css=[data-testid="show-login-button"]
Fill Text css=[data-testid="email-login-input"] ${email}
Fill Text css=[data-testid="password-login-input"] ${password}
Click css=[data-testid="submit-login-button"]
Create New User
[Documentation] Vytvoří nového uživatele
[Arguments] ${name} ${email} ${age} ${role}
Fill Text css=[data-testid="name-input"] ${name}
Fill Text css=[data-testid="email-input"] ${email}
Fill Text css=[data-testid="age-input"] ${age}
Select Options By css=[data-testid="role-select"] text ${role}
Click css=[data-testid="add-button"]
Check New User
[Arguments] ${name} ${email} ${age} ${role}
${actualName}= Get Text li[data-testid='user-item']:last-child [data-testid='name-item']
${actualEmail}= Get Text li[data-testid='user-item']:last-child [data-testid='email-item']
${actualAge}= Get Text li[data-testid='user-item']:last-child [data-testid='age-item']
${actualRole}= Get Text li[data-testid='user-item']:last-child [data-testid='role-item']
Should Be Equal As Strings ${actual_name} ${name}
Should Be Equal As Strings ${actual_email} ${email}
Should Contain ${actual_age} ${age}
Should Be Equal As Strings ${actual_role} ${role}
Set Bearer Token
[Arguments] ${email} ${token_value}
LocalStorage Set Item email ${email}
LocalStorage Set Item token ${token_value}
4. tests/example-api-complex.robot
Hlavní testovací scénář, který kombinuje API a UI.
- Přes API se vytvoří testovací účet a získá token.
- V UI se přihlásíme, přidáme nového uživatele a zkontrolujeme, že se zobrazil.
- Na závěr se pomocí API smažou všichni testovací uživatelé.
# example-api-complex.robot
*** Settings ***
# user_management_ui_test.robot
Documentation Testování správy uživatelů v UI s přípravou dat přes API
Resource ../keywords/api-keywords.robot
Resource ../keywords/ui-keywords.robot
*** Test Cases ***
Test User Management Workflow
[Documentation]
... Kompletní test:
... 1. Registrace a login přes API
... 2. Vytvoření uživatele v UI
... 3. Smazání uživatele přes API
# Příprava testovacích dat přes API
${timestamp}= Get Current Date result_format=%Y%m%d%H%M%S
${randomEmail}= Set Variable testuser_${timestamp}@example.com
${email}= Register Test User ${randomEmail} ${TEST_PASSWORD}
${token}= Login And Get Token ${email} ${TEST_PASSWORD}
# UI testování - uložení uživatele
Open Browser On HomePage
Set Bearer Token ${email} ${token}
Reload
Create New User John john@icanbreakit.eu 20 admin
# Sleep 1 minutes
Check New User John john@icanbreakit.eu 20 admin
Close Browser
# Smaže vytvořeného uživatele přes API
Delete Test Users ${token}
Závěr
Obecně je použití API pro přípravu dat před UI testy velmi oblíbený postup, jak testy psát efektivněji a zároveň je mít rychlejší. Testy jsou také spolehlivější a méně závislé na uživatelském rozhraní. API se postará o přípravu dat (nastavení aplikace do určitého stavu) i jejich úklid po testu. UI test ověří funkčnost aplikace z pohledu koncového uživatele.

