Logo Light
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

  1. 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!

  1. 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.