Robot Framework Основы
Введение
Robot Framework — фреймворк для разработки приемочных автотестов (ATDD).
Это keyword-driven testing фреймворк, который предоставляет табличное форматирование
Основные идеи для создания Robot Framework были отражены в магистерской диссертации Пекки Клярка (Pekka Klärck) в 2005 году.
Первая версия была разработана Nokia Siemens Networks в том же году. Версия 2.0 была издана под открытой лицензией Apache License 24 июня 2008 года.
Фреймворк написан на языке
Python.
О том, что фреймворк финский можно догадаться по некоторым пасхалкам, например в библиотеке
OperatingSystem
можно найти текст Hyv\xe4 esimerkki, что в переводе с
финского языка
означает хороший пример
Документация
RobotFramework состоит из нескольких библиотек, поэтому документация разбита на части:
Пример
Небольшой пример работы с настроенным фреймворком. Про установку RobotFramework читайте здесь
Зайдите в директорию с тестами
cd /soft/src/tests/robot
В этой директории могут лежать
Makefile
,
Dockerfile
различные файлы из которых берутся данные для создания тестовых
окружений и так далее.
Это обычно настраивает DevOps
или QA Team Lead
ls -la
total 70 drwxr-xr-x 8 andrei urn_su 4096 Mar 9 12:15 . drwxr-xr-x 9 andrei urn_su 4096 Mar 9 17:45 .. drwxr-xr-x 2 andrei urn_su 4096 Mar 9 12:15 bin -rw-r--r-- 1 andrei urn_su 1534 Mar 9 12:15 Dockerfile -rw-r--r-- 1 andrei urn_su 1293 Mar 9 12:15 Dockerfile.alpine -rw-r--r-- 1 andrei urn_su 38 Mar 9 12:15 .dockerignore drwxr-xr-x 2 andrei 111 4096 Mar 9 12:15 input -rw-r--r-- 1 andrei urn_su 13586 Mar 9 12:15 Makefile drwxr-xr-x 2 andrei 111 4096 Mar 9 12:15 output -rw-r--r-- 1 andrei urn_su 0 Mar 9 12:15 README.md drwxr-xr-x 2 andrei urn_su 4096 Mar 9 12:15 requirements drwxr-xr-x 2 andrei urn_su 4096 Mar 9 12:15 scripts drwxr-xr-x 8 andrei 111 4096 Mar 9 12:15 src
В данном примере чтобы создать тестовое окружение нужно выполнить
make dev
Подробнее про make читайте в статье «Работа с GNUmakefile»
Когда окружение активно можно начать пользоваться роботом.
Для вызова
справки выполните
robot --help
seleniumlibrary
python -m pip install robotframework-seleniumlibrary
Collecting robotframework-seleniumlibrary Downloading robotframework_seleniumlibrary-5.1.3-py2.py3-none-any.whl (94 kB) |████████████████████████████████| 94 kB 1.6 MB/s Collecting selenium>=3.141.0 Downloading selenium-3.141.0-py2.py3-none-any.whl (904 kB) |████████████████████████████████| 904 kB 51.5 MB/s Collecting robotframework-pythonlibcore>=2.1.0 Downloading robotframework_pythonlibcore-2.2.1-py2.py3-none-any.whl (10 kB) Requirement already satisfied: robotframework>=3.1.2 in /home/andrei/robotframework/myvenv/lib/python3.9/site-packages (from robotframework-seleniumlibrary) (4.0.1) Collecting urllib3 Using cached urllib3-1.26.4-py2.py3-none-any.whl (153 kB) Installing collected packages: urllib3, selenium, robotframework-pythonlibcore, robotframework-seleniumlibrary Successfully installed robotframework-pythonlibcore-2.2.1 robotframework-seleniumlibrary-5.1.3 selenium-3.141.0 urllib3-1.26.4
QuickStart
Официальное руководство для быстрого старта в RobotFramework можно
клонировать
с github
Документация
git clone https://github.com/robotframework/QuickStartGuide.git
cd QuickStartGuide
ll
drwxr-xr-x 5 andrei urnsu 4096 May 5 11:25 ./ drwxr-xr-x 5 andrei urnsu 4096 May 5 11:25 ../ -rw-r--r-- 1 andrei urnsu 796 May 5 11:25 BUILD.rst drwxr-xr-x 8 andrei urnsu 4096 May 5 11:25 .git/ drwxr-xr-x 2 andrei urnsu 4096 May 5 11:25 lib/ -rw-r--r-- 1 andrei urnsu 21237 May 5 11:25 QuickStart.rst -rw-r--r-- 1 andrei urnsu 359 May 5 11:25 README.rst drwxr-xr-x 2 andrei urnsu 4096 May 5 11:25 sut/
Проект для тестирования логина находится в директории
sut
Скрипт называется
login.py
python sut/login.py create andrei HeiHeiru1
SUCCESS
python sut/login.py login andrei HeiHeiru1
Logged In
robot QuickStart.rst
============================================================================== QuickStart ============================================================================== User can create an account and log in | PASS | ------------------------------------------------------------------------------ User cannot log in with bad password | PASS | ------------------------------------------------------------------------------ User can change password | PASS | ------------------------------------------------------------------------------ Invalid password | PASS | ------------------------------------------------------------------------------ User status is stored in database | PASS | ------------------------------------------------------------------------------ QuickStart | PASS | 5 tests, 5 passed, 0 failed ============================================================================== Output: /home/andrei/robotframework/QuickStartGuide/output.xml Log: /home/andrei/robotframework/QuickStartGuide/log.html Report: /home/andrei/robotframework/QuickStartGuide/report.html
Пример теста с Selenium WebDriver
*** Settings ***
# make at least two spaces beetween
Documentation Simple example using SeleniumLibrary.
Library SeleniumLibrary
*** Variables ***
*** Test Cases ***
This is sample test case
[documentation] Google test
[tags] regression
Open Browser http://www.google.com chrome
Close Browser
*** Keywords ***
robot -d results Tests/Google/FunctionalTestSuite/GoogleSearch.robot
============================================================================== GoogleSearch :: Simple example using SeleniumLibrary. ============================================================================== This is sample test case :: Google test | PASS | ------------------------------------------------------------------------------ GoogleSearch :: Simple example using SeleniumLibrary. | PASS | 1 test, 1 passed, 0 failed ============================================================================== Output: /home/andrei/robotframework/RobotFWTutorial/results/output.xml Log: /home/andrei/robotframework/RobotFWTutorial/results/log.html Report: /home/andrei/robotframework/RobotFWTutorial/results/report.html
firefox Results/report.html
Более детальный отчёт находится в log.html
Свои keywords
В разделе 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
Вынести keywords в отдельный файл
Хранить всё в одном файле быстро становится неудобно.
Оставим сами тесты в файле
BasicSearch.robot
а keywords разделим на две группы - общие и относящиеся к проекту
BasicSearch.robot
*** Settings ***
Documentation Basic Search Functionality
Resource ../../Resources/CommonFunctionality.robot
Resource ../../Resources/eBay_UserDefinedKeywords.robot
*** 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 ***
Обратите внимание на то, что в этом файле уже не нужно подключать SeleniumLibrary
В файл CommonFunctionality.robot вынесем такие общие действия как открыть браузер, закрыть браузер и так далее
*** Settings ***
Library SeleniumLibrary
*** Keywords ***
Start TestCase
Open Browser https://www.ebay.com chrome
Maximize Browser Window
Finish TestCase
Close Browser
Обратите внимание на строку 2. Пользовательские ключи содержат в себе ключи из библиотеки SeleniumLibrary, поэтому её нужно подключить в настройках.
В файл eBayUserDefinedKeywords.robot вынесем всё, что относится именно к этому проекту
*** 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.robot , eBayUserDefinedKeywords.robot
*** Settings ***
Documentation Basic Search Functionality
Resource ../../Resources/CommonFunctionality.robot
Resource ../../Resources/eBay_UserDefinedKeywords.robot
Test Setup и Test Teardown
Код из предыдущего примера отлично сработает в случае успеха.
Однако, если результатом будет FAIL браузер не закроется автоматически.
Чтобы избавить себя от необходимости подчищать окружение в случае провала - используйте
Test Setup и Test Teardown
*** Settings ***
Documentation Basic Search Functionality
Resource ../../Resources/CommonFunctionality.robot
Resource ../../Resources/eBay_UserDefinedKeywords.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
*** Keywords ***
Явно указать источник ключевого слова
Если в разных файлах повторяются пользовательские ключи - возможен конфликт.
Чтобы его избежать можно явно указать и какого файла используется keyword
eBay_UserDefinedKeywords.Verify Search Results
eBay_UserDefinedKeywords.Filter Results By Condition
eBay_UserDefinedKeywords.Verify Filter Results
Теперь в файле BasicSearch.robot не нужно импортировать Selenium Library и писать Keywords
Catenate: объединение строк
Соединить несколько переменных типа string можно с помощью Catenate
Пример: скрипт
caten.robot
*** Settings *** *** Test Cases *** Caten ${site}= Set Variable heihei ${proto}= Set Variable https ${url}= Catenate ${proto}://www.${site}.ru Log To Console \n${url}
robot caten.robot
============================================================================== Caten ============================================================================== Caten ... https://www.heihei.ru Caten | PASS | ------------------------------------------------------------------------------ Caten | PASS | 1 test, 1 passed, 0 failed ============================================================================== Output: /opt/robot/src/tests/pam/rbac/output.xml Log: /opt/robot/src/tests/pam/rbac/log.html Report: /opt/robot/src/tests/pam/rbac/report.html
Дата и время
Чтобы получить текущую дату нужно подключить библиотеку DateTime и воспользоваться ключевым словосочетанием Get Current Date
Library DateTime … ${date}= Get Current Date
Формат даты будет выглядеть как
2024-12-03 10:28:18.714
result_format=datetime
Для удобного обращения к атрибутам объекта date
можно воспользоваться аргументом result_format=datetime
Формат даты будет выглядеть как
2024-12-03 10:28:18.918613
Чтобы получить месяц или год, достаточно указать атрибут как ${date.month} или ${date.year}
Library DateTime … ${date}= Get Current Date result_format=datetime
Пример из моего бесплатного тренажёра : проверка корректности заголовка страницы, год в которой должен совпадать с текущим.
*** Settings *** Documentation Checking Title Library Browser ... enable_playwright_debug=${True} ... auto_closing_level=TEST ... retry_assertions_for=0:00:03 Library Collections Library DateTime 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 *** Italy [Tags] italy New Page https://www.urn.su/qa/ui/basic_test/ ${urls}= Get Elements //a[@class="march8"] # depends on Collections lib Log ${urls} ${url0}= Get From List ${urls} 0 Click ${url0} ${date}= Get Current Date result_format=datetime Log To Console "Check dates" Log To Console ${date} Log To Console ${date.year} Get Title == 8 марта в Италии в ${date.year} году Close Browser
robot --include italy src/tests/ui/
============================================================================== Ui ============================================================================== Ui.Ui Test Page :: Checking Title ============================================================================== Italy ......"Check dates" .2023-01-03 09:56:18.065095 .2023 Italy Italy | PASS | ------------------------------------------------------------------------------ Ui.Ui Test Page :: Checking Title | PASS | 1 test, 1 passed, 0 failed ============================================================================== Ui | PASS | 1 test, 1 passed, 0 failed ============================================================================== Output: /opt/tests/robot/output.xml Log: /opt/tests/robot/log.html Report: /opt/tests/robot/report.html