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

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