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 |