Архитектура тестов на 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
Изображение баннера

Поиск по сайту

Подпишитесь на Telegram канал @aofeed чтобы следить за выходом новых статей и обновлением старых

Перейти на канал

@aofeed

Задать вопрос в Телеграм-группе

@aofeedchat

Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@urn.su если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящую по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: