Python библиотеки для Robot Framework

Введение

Эта статья является продолжением статьи «Архитектура тестов на Robot Framework»

Из неё вы можете узнать о том как подключать свои Python библиотеки к тестам на Robot Framework.

Предполагается, что помимо статьи об архитектуре вы освоили установку и основы Robot Framework.

О нескольких способах указать путь до библиотек и ресурсов вы можете прочитать здесь .

Подключить свою Python библиотеку

В Robot Framework можно делать очень много сложных тестов не выходя за пределы .robot файлов.

Однако, я отношусь к той части пользователей робота, которая предпочитает основную нагрузку перекладывать на Python библиотеки, а .robot файлы держать настолько простыми, насколько это возможно.

Библиотеки обычно хранят в директории lib, libraries, Lib, Libraries и тому подобных. Импорт можно осуществить указав относительный путь.

По моему опыту в Linux системах .py после библиотеки можно не указывать. Я сперва буду это делать для наглядности и совместимости.

*** Settings *** Library ../libraries/app.py

Если в библиотеке есть функция some_name() то из робота её нужно вызывать без скобок, заменив нижнее подчёркивание пробелом а первые буквы слов сделав заглавными - то есть как Some Name

Простой пример

Рассмотрим тест demo.robot который получает из внешней библиотеки случайное число из диапазона.

random_demo/ |-- Libraries | `-- custom_random.py `-- Tests `-- demo.robot

# custom_random.py from random import randrange def get_random_number(limit) -> int: return randrange(int(limit))

*** Settings *** Documentation Example that uses external python library Library ../Libraries/custom_random.py *** Test Cases *** Check Smallest Limit ${number}= Get Random Number 1 Should Be Equal As Integers ${number} 0

Обратите внимание на то как функция get_random_number() вызывается как ключеове слово Get Random Number

Аргумент 1 передаётся без скобок через четыре пробела.

python -m robot .\demo.robot

============================================================================== Demo :: Example that uses external python library ============================================================================== Check limit | PASS | ------------------------------------------------------------------------------ Demo :: Example that uses external python library | PASS | 1 test, 1 passed, 0 failed ============================================================================== Output: C:\Users\Andrei\robot\random_demo\Tests\output.xml Log: C:\Users\Andrei\robot\random_demo\Tests\log.html Report: C:\Users\Andrei\robot\random_demo\Tests\report.html

Пример с UI

Рассмотрим пример UI тетса: библиотека на Python выдаёт то одну, то другую url. Robot переходит по этому адресу и проверят совпадает ли с ожидаемым значением заголовок.

В части тест ранов будет PASS, в части FAIL

Убедитесь, что вы установили и настроили библиотеку robotframework-browser

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 функциям возможность писать в робот лог и/или консоль, читайте здесь

Более сложный пример

Пример тестирования Desktop приложения с использованием библиотеки PyWinAuto можете изучить здесь

Пример с ООП

На основе первого примера из этой статьи рассмотрим подключения библиотеки с ООП.

Раньше ключевым словом была обычная функция get_unstable_url().

Теперь в библиотеке будет класс CustomRandom c методом get_unstalbe_url()

Переименуем custom_random.py в CustomRandom.py - чтобы название файла совпадало с названием класса.

Так робот сможет понять что мы импортируем в качестве библиотеки.

keyword_demo/ |-- Libraries | `-- CustomRandom.py `-- Tests `-- demo.robot

# CustomRandom.py from random import randrange class CustomRandom: def get_random_number(self, limit) -> int: return randrange(int(limit))

Файл demo.robot остаётся без изменений

*** Settings *** Documentation Example that uses external python library Library ../Libraries/CustomRandom.py *** Test Cases *** Check Smallest Limit ${number}= Get Random Number 1 Should Be Equal As Integers ${number} 0

python -m robot .\keyword_demo\Tests\demo.robot

============================================================================== Demo :: Example that uses external python library ============================================================================== Check Smallest Limit | PASS | ------------------------------------------------------------------------------ Demo :: Example that uses external python library | PASS | 1 test, 1 passed, 0 failed ==============================================================================

@keyword

По умолчанию имя ключевого слова получается из имени функции или метода заменой _ на пробел и капитализацией первых букв всех слов.

Так функции

my_keyword()

будет соответствовать ключевое слово

My Keyword

С помощью декоратора keyword из robot.api.deco можно сделать имя ключевого слова независимым от имени метода.

Оставим название метода get_random_number() но в @keyword укажем имя Super Random

# CustomRandom.py from random import randrange from robot.api.deco import keyword class CustomRandom: @keyword(name="Super Random") def get_random_number(self, limit) -> int: return randrange(int(limit))

В demo.robot теперь нужно использовать Super Random, старое имя Get Random Number он уже не сможет найти.

*** Settings *** Documentation Example that uses external python library Library ../Libraries/CustomRandom.py *** Test Cases *** Check Smallest Limit ${number}= Super Random 1 Should Be Equal As Integers ${number} 0

python -m robot .\keyword_demo\Tests\demo.robot

============================================================================== Demo :: Example that uses external python library ============================================================================== Check Smallest Limit | PASS | ------------------------------------------------------------------------------ Demo :: Example that uses external python library | PASS | 1 test, 1 passed, 0 failed ==============================================================================

Если добавить директорию keyword_demo в PYTHONPATH, то можно импортировать библиотеку CustomRandom следующим образом.

Library Libraries.CustomRandom

Для наглядности добавлять будем с помощью --pythonpath

Полный код вы можете изучить в статье Основы Robot Framework: Системный путь

python -m robot --pythonpath .\keyword_demo .\keyword_demo\Tests\demo.robot

Ключевые слова на русском

Из предыдущей главы понятно, что с помощью @keyword можно менять названия ключевых слов.

В качестве новых называнй можно использовать названия на русском языке.

# CustomRandom.py from random import randrange from robot.api.deco import keyword class CustomRandom: @keyword(name="Сгенерировать случайное число") def get_random_number(self, limit) -> int: return randrange(int(limit))

*** Settings *** Documentation Example that uses external python library Library ../Libraries/CustomRandom.py *** Test Cases *** Проверить Наименьший Лимит ${number}= Сгенерировать случайное число 1 Should Be Equal As Integers ${number} 0

python -m robot .\keyword_demo\Tests\demo.robot

============================================================================== Demo :: Example that uses external python library ============================================================================== Проверить Наименьший Лимит | PASS | ------------------------------------------------------------------------------ Demo :: Example that uses external python library | PASS | 1 test, 1 passed, 0 failed ==============================================================================

С @keyword был довольно забавный баг . Когда @keyword использовался в библиотеке, например так

from robot.api.deco import keyword @keyword def example(): pass

Создавалось не только ключевое слово Example но и ключевое слово Keyword

Автор статьи: Андрей Олегович

Похожие статьи
Robot Framework
Архитектура
Логи
__init__.robot
Подключение своих .py библиотек
Путь до библиотек и ресурсов
Keyword как декоратор
Template
Пример с pywinauto
Изображение баннера

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

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

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

@aofeed

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

@aofeedchat

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