Архитектура тестов на Robot Framework
Введение
В этой статье вы можете изучить основы архитектуры тестов на Robot Framework.
Предполагается, что вы владеете материалом статьи
«Основы Robot Framework»
Официальные рекомендации по структуре проектов можно изучить
здесь
В этой статье будет использоваться сокращение КС - которое означает Ключевое Слово/ Ключевые Слова иначе говоря
Keyword / Keywords
КС - Keyword
Свои КС
Начнём с создания своих ключевых слов внутри одного и того же файла с тестами
robot/ `-- Tests `-- ebay `-- BasicSearch.robot
Объявлять самостоятельно созданные ключевые слова можно в разделе Keywords.
В этом случае Тest Case будет короче и читаться будет легче.
*** Settings ***
Documentation Basic Search Functionality
Library SeleniumLibrary
*** Variables ***
*** Test Cases ***
Verify basic search functionality for eBay
[Documentation] This test case verifies the basic search
[Tags] Functional
Start TestCase
Verify Search Results
Finish TestCase
*** Keywords ***
Start TestCase
Open Browser https://www.ebay.com chrome
Input Text //*[@id="gh-ac"] mobile
Verify Search Results
Click Element id:gh-btn
Page Should Contain results for mobile
Finish TestCase
Close Browser
robot -d results Tests/eBay/BasicSearch.robot
Опция -d задаёт директорию, в которую будут сохранены log.html , output.xml и report.html
============================================================================== BasicSearch :: Basic Search Functionality ============================================================================== Verify basic search functionality for eBay :: This test case verif... DevTools listening on ws://127.0.0.1:65225/devtools/browser/bf56f09f-36d7-45c1-80a8-88687db70932 Verify basic search functionality for eBay :: This test case verif... | PASS | ------------------------------------------------------------------------------ BasicSearch :: Basic Search Functionality | PASS | 1 test, 1 passed, 0 failed ============================================================================== Output: /home/andrei/robot/Tests/ebay/results/output.xml Log: /home/andrei/robot/Tests/ebay/results/log.html Report: /home/andrei/robot/Tests/ebay/results/report.html
.resource
В современных версиях Robot Framework файлы, которые содержат ключевые слова, но сами
по себе не предназначены для запуска тестов принято создавать с расширением .resource
В отличие от библиотек при импорте ресурс нельзя переименовать с помощью as.
Дискуссия по поводу добавления этой фичи ведётся в
issue 2104
Из
официальной документации
следует, что .resource теперь использовать предпочтительнее чем .robot
Resource files can use the .robot extension as well, but using the dedicated .resource extension is recommended and may be mandated in the future.
Files containing non-ASCII characters must be saved using the UTF-8 encoding.
Вынести КС в отдельный файл
Хранить всё в одном файле быстро становится неудобно.
Рекомендуется сами тесты оставить в файле с расширением
.robot
, можно оставить изначальное
BasicSearch.robot
а Keywords разделим на две группы - общие и относящиеся к проекту.
В Robot Framework для этих целей используется специальное расширение
.resource
о котором вы можете прочитать в
предыдущем параграфе
Структура проекта с отдельными ресурсами будет выглядеть следующим оригинальным образом:
robot/ |-- Resources | |-- CommonFunctionality.resource | `-- eBayUserDefinedKeywords.resource `-- Tests `-- ebay `-- BasicSearch.robot
BasicSearch.robot
*** Settings ***
Documentation Basic Search Functionality
Resource ../../Resources/CommonFunctionality.resource
Resource ../../Resources/eBayUserDefinedKeywords.resource
*** Variables ***
*** Test Cases ***
Verify basic search functionality for eBay
[Documentation] This test case verifies the basic search
[Tags] Functional
Start TestCase
Verify Search Results
Finish TestCase
Обратите внимание на то, что в файле BasicSearch.robot уже не нужно подключать SeleniumLibrary и писать Keywords
В файл CommonFunctionality.resource вынесем такие общие действия как открыть браузер, закрыть браузер и так далее
*** Settings ***
Library SeleniumLibrary
*** Keywords ***
Start TestCase
Open Browser https://www.ebay.com chrome
Maximize Browser Window
Finish TestCase
Close Browser
Обратите внимание на строку 3. Пользовательские ключи содержат в себе ключи из библиотеки SeleniumLibrary, поэтому её нужно подключить в настройках.
В файл eBayUserDefinedKeywords.resource вынесем всё, что относится именно к этому проекту
*** Settings ***
Library SeleniumLibrary
*** Keywords ***
Verify Search Results
Input Text //*[@id="gh-ac"] mobile
Click Element id:gh-btn
Page Should Contain results for mobile
Filter Results By Condition
Mouse Over //*[@id="w7"]
Sleep 3s
Mouse Down //*[@id="w7"]/div/ul/li[2]
Click Element //*[@id="w7"]/div/ul/li[2]
Verify Filter Results
Element Should Contain //*[@id="srp-river-results-query_answer1-w0-x-carous
robot -d results Tests/eBay/BasicSearch.robot
============================================================================== BasicSearch :: Basic Search Functionality ============================================================================== Verify basic search functionality for eBay :: This test case verif... | PASS | ------------------------------------------------------------------------------ BasicSearch :: Basic Search Functionality | PASS | 1 test, 1 passed, 0 failed ==============================================================================
Если вы получили ошибку No keyword with name 'Start TestCase' found
============================================================================== BasicSearch :: Basic Search Functionality ============================================================================== Verify basic search functionality for eBay :: This test case verif... |FAIL | No keyword with name 'Start TestCase' found. ------------------------------------------------------------------------------ BasicSearch :: Basic Search Functionality |FAIL | 1 test, 0 passed, 1 failed ==============================================================================
- убедитесь что в начале BasicSearch.robot вы с помощью Resourse указали правильный путь до файлов CommonFunctionality.resource , eBayUserDefinedKeywords.resource
*** Settings ***
Documentation Basic Search Functionality
Resource ../../Resources/CommonFunctionality.resource
Resource ../../Resources/eBayUserDefinedKeywords.resource
Test Setup и Test Teardown
Код из предыдущего примера отлично сработает в случае успеха.
Однако, если результатом будет FAIL браузер не закроется автоматически.
Чтобы избавить себя от необходимости подчищать окружение в случае провала - используйте
Test Setup и Test Teardown
*** Settings ***
Documentation Basic Search Functionality
Resource ../../Resources/CommonFunctionality.robot
Resource ../../Resources/eBayUserDefinedKeywords.robot
Test Setup Start TestCase
Test Teardown Finish TestCase
*** Variables ***
*** Test Cases ***
Verify basic search functionality for eBay
[Documentation] This test case verifies the basic search
[Tags] Functional
Verify Search Results
Filter Results By Condition
Verify Filter Results
Явно указать источник ключевого слова
Если в разных файлах повторяются пользовательские ключи - возможен конфликт.
Чтобы его избежать можно явно указать и какого файла используется КС
eBayUserDefinedKeywords.Verify Search Results
eBayUserDefinedKeywords.Filter Results By Condition
eBayUserDefinedKeywords.Verify Filter Results
Подключить свою Python библиотеку
Основы
В Robot Framework можно делать очень много сложных тестов не выходя за пределы .robot файлов.
Тем не менее я отношусь к той части пользователей RF, которая предпочитает основную нагрузку перекладывать
на Python библиотеки, а .robot файлы держать настолько простыми, насколько это возможно.
Библиотеки обычно хранят в директории lib, libraries, lib, Libraries и тому подобных. Импорт можно
осуществить указав относительный путь.
По моему опыту в
Linux
системах .py после библиотеки можно не указывать. Я сперва буду это делать для наглядности и
совместимости.
*** Settings *** Library ../libraries/app.py
Если в библиотеке есть функция some_name() то из робота её нужно вызывать без скобок, заменив нижнее подчёркивание пробелом а первые буквы слов сделав заглавными - то есть как Some Name
Простой пример
Рассмотрим простой пример: библиотека на Python выдаёт то одну, то другую url. Robot проверят заголовок.
В части
тест ранов
будет PASS, в части FAIL
ext_py_lib/ |-- browser |-- libraries | `-- unstable_url.py `-- tests `-- test_title.robot
from random import randrange def get_unstable_url() -> str: if randrange(2) == 1: return "https://www.urn.su" else: return "https://www.heihei.ru"
*** Settings *** Documentation Example that opens single page Library Browser ... enable_playwright_debug=${True} ... auto_closing_level=TEST ... retry_assertions_for=0:00:03 Library ../libraries/unstable_url.py Force Tags ui *** Variables *** *** Keywords *** Test Setup Tasks Start Chromium Browser Test Teardown Tasks Close Browser Start Chromium Browser New Browser browser=chromium headless=True New Context viewport={'width': 1920, 'height': 1080} ignoreHTTPSErrors=True *** Test Cases *** Starting a browser with a page [Tags] title ${url} = Get Unstable Url New Page ${url} Get Title == URN.SU Close Browser
robot tests
============================================================================== Tests ============================================================================== Tests.Test Title :: Example that opens single page ============================================================================== Starting a browser with a page | PASS | ------------------------------------------------------------------------------ Tests.Test Title :: Example that opens single page | PASS | 1 test, 1 passed, 0 failed ============================================================================== Tests | PASS | 1 test, 1 passed, 0 failed ============================================================================== Output: C:\Users\Andrei\robot\ext_py_lib\output.xml Log: C:\Users\Andrei\robot\ext_py_lib\log.html Report: C:\Users\Andrei\robot\ext_py_lib\report.html
robot tests
============================================================================== Tests ============================================================================== Tests.Test Title :: Example that opens single page ============================================================================== Starting a browser with a page | FAIL | Title 'HeiHei.ru' (str) should be 'URN.SU' (str) ------------------------------------------------------------------------------ Tests.Test Title :: Example that opens single page | FAIL | 1 test, 0 passed, 1 failed ============================================================================== Tests | FAIL | 1 test, 0 passed, 1 failed ============================================================================== Output: C:\Users\Andrei\robot\ext_py_lib\output.xml Log: C:\Users\Andrei\robot\ext_py_lib\log.html Report: C:\Users\Andrei\robot\ext_py_lib\report.html
Про то как добавить Python функциям возможность писать в робот лог и/или консоль, читайте здесь
Путь до библиотек
В предыдущем примере библиотеки лежали в директории libraries а тесты в tests поэтому импорт библиотеки выглядел следующим оригинальным образом
Library ../libraries/unstable_url.py
Если в директории tests появятся поддиректории - оттуда импорт будте выглядеть как
Library ../../libraries/unstable_url.py
или даже так
Library ../../../libraries/unstable_url.py
Чтобы не делать относительный импорт можно воспользоваться одним из описанных ниже способов
--pythonpath
С помощью опции --pythonpath можно временно добавить путь до библиотек в
PYTHONPATH
Начиная с этого примера будем указывать библиотеки без .py
Library unstable_url
robot --pythonpath /c/Users/Andrei/robot/ext_py_lib/libraries test_unstable_title.robot
--argumentfile
Чтобы не вводить путь вручную, можно сохранить его в так называемый argumentfile
Создадим файл
all_arguments.robot
и добавим туда следующий код
--pythonpath /c/Users/Andrei/robot/ext_py_lib/libraries test_unstable_title.robot
Чтобы использовать этот файл воспользуемся опцией --argumentfile
robot --argumentfile all_arguments.robot test_unstable_title.robot
Dockerfile
Если ваше окружение создается с использованием
Docker
,
то путь до библиотек можно прописать в
Dockerfile
Пример, который работает в одном из моих проектов:
… ENV TEST_DIR=/opt ENV PYTHON_DIR=/user/local/bin/python ENV ROBOT_RESOURCES=/opt/robot/src/resources ENV ROBOT_LIBRARIES=/opt/robot/src/libraries ENV PYTHONPATH=$TEST_DIR:$PYTHON_DIR:$ROBOT_RESOURCES:$ROBOT_LIBRARIES …
Более сложный пример
Пример тестирования Desktop приложения с использованием библиотеки PyWinAuto можете изучить здесь
Robot Framework | |
Архитектура | |
Логи | |
__init__.robot | |
Template | |
Пример с pywinauto |