Передать аргументы в кейворд Robot Framework
Введение
В роботе можно писать ключевые слова, которые принимают аргументы при вызове.
Если вы читали стать про
RFBrowser
то уже сталкивались с такими кейвордами.
В
предыдущих примерах
уже были продемонстрированы ключевые слова, принимающие разные аргументы, и в этом разделе эта важная функциональность обсуждается более подробно. Как на самом деле реализовать пользовательские ключевые слова и библиотечные ключевые слова с разными аргументами, обсуждается в отдельных разделах.
Ключевые слова могут принимать ноль или более аргументов, а некоторые аргументы могут
иметь значения по умолчанию.
Какие аргументы принимает ключевое слово, зависит от его реализации. Если говорить
о ключевых словах из официальных библиотек то как правило,
лучшим местом для поиска информации ключевому слову является
документация
. Документацию по библиотеке BuiltIn можно найти
здесь
Официальная документация
Позиционные аргументы
Большинство ключевых слов имеют определенное количество аргументов,
которые всегда должны быть указаны.
В документации по ключевым словам это обозначается указанием имен аргументов, разделенных запятой,
например first, second, third.
Имена аргументов на самом деле не имеют значения в этом случае, за исключением того, что они
должны объяснять, что делает аргумент, но важно иметь точно такое же количество аргументов,
как указано в документации.
Использование слишком малого или слишком большого количества аргументов приведет к ошибке.
В приведенном ниже тесте используются ключевые слова
Create Directory
и
Copy File
из библиотеки
Operating System
.
Их аргументы указаны как path и source, destination, что означает, что они принимают один и два
аргумента соответственно.
Последнее ключевое слово,
No Operation
из библиотеки
BuiltIn
, не принимает аргументов.
*** Test Cases *** Example Create Directory ${TEMPDIR}/stuff Copy File ${CURDIR}/file.txt ${TEMPDIR}/stuff No Operation
Сложить два числа
Напишем кейворд, который будет принимать два числа и складывать их.
Проверим результат
*** Settings *** Documentation Tests passing int and float as arguments *** Test Cases *** Adding Integers ${sum1}= Add 1 2 Should Be Equal As Integers ${sum1} 3 Adding Floats ${sum2}= Add 3.5 6.2 Should Be Equal As Numbers ${sum2} 9.7 Adding Negative Integers ${sum3}= Add -2 -3 Should Be Equal As Integers ${sum3} -5 *** Keywords *** Add [Arguments] ${addend1} ${addend2} ${result}= Evaluate ${addend1} + ${addend2} RETURN ${result}
python -m robot args_add.robot
====================================================================== Args Add :: Tests passing int and float as arguments ====================================================================== Adding Integers | PASS | ---------------------------------------------------------------------- Adding Floats | PASS | ---------------------------------------------------------------------- Adding Negative Integers | PASS | ---------------------------------------------------------------------- Args Add :: Tests passing int and float as arguments | PASS | 3 tests, 3 passed, 0 failed ====================================================================== Output: /home/andrei/tests/output.xml Log: /home/andrei/tests/log.html Report: /home/andrei/tests/report.html
Про использование
Evaluate
читайте
здесь
Обратите внимание на проверку равенства. Для целых чисел я применил
Should Be Equal As Integers
а для чисел с плавающей точкой Should Be Equal As Numbers
О том как использовать просто Should Be Equal читайте в следующей главе
Передача чисел как чисел
По умолчанию робот передаёт аргументы как строки.
В предыдущей главе мы передавали в кейворд число 3, но оно передавалось как строка, поэтому
для сравнения приходилось преобразовывать его в целое число с помощью
Shoul Be Equal As Integers.
Если бы использовался Should Be Equal результатом была бы ошибка. Продемонстрируем её, создав новый тест:
Test Add Integers ${sum1}= Add 1 2 Should Be Equal ${sum1} 3
Test Add Integers | FAIL | 3 (integer) != 3 (string)
Решить эту проблему можно передав число как число, заключив его в фигурные скобки
Test Add Integers ${sum1}= Add 1 2 Should Be Equal ${sum1} ${3}
Значения по умолчанию
Аргументы часто имеют значения по умолчанию, которые могут быть либо заданы, либо нет.
В документации значение по умолчанию обычно отделяется от имени аргумента знаком равенства,
например, name=значение по умолчанию.
Возможно, что все аргументы имеют значения по умолчанию, но после аргументов со значениями по умолчанию не может
быть никаких позиционных аргументов.
Использование значений по умолчанию проиллюстрировано приведенным ниже примером, в котором
используется ключевое слово
Create File
, имеющее аргументы path, content=, encoding=UTF-8.
Попытка использовать его без каких-либо аргументов или более чем с тремя аргументами не сработает.
*** Test Cases *** Example Create File ${TEMPDIR}/empty.txt Create File ${TEMPDIR}/utf-8.txt Hyvä esimerkki Create File ${TEMPDIR}/iso-8859-1.txt Hyvä esimerkki ISO-8859-1
Напишем кейворд, который будет добавлять к доменному имени протокол.
По умолчанию будет http:// но можно передать свой аргумент.
Build Url [Arguments] ${domain} ${protocol}=http ${result}= Catenate SEPARATOR= ${protocol} :// ${domain} RETURN ${result}
Созадим два теста, один будет использовать протокол по умолчанию, а другой передаст https
*** Settings *** Documentation Tests Url Creation *** Test Cases *** Test HeiHei [Documentation] Передаём https ${heihei}= Build Url heihei.ru https Log To Console ${heihei} Should Be Equal ${heihei} https://heihei.ru Test TopBicycle [Documentation] Не передаём протокол, рассчитываем ... получить дефолтный http:// ${tb}= Build Url topbicycle.ru ${reference}= Set Variable http://topbicycle.ru Log To Console ${tb} Should Be Equal ${tb} ${reference} Expected ${reference} got ${tb} *** Keywords *** Build Url [Arguments] ${domain} ${protocol}=http ${result}= Catenate SEPARATOR= ${protocol} :// ${domain} RETURN ${result}
python -m robot args_def_values.robot
====================================================================== Args Def Values :: Tests Url Creation ====================================================================== Test HeiHei :: Передаём https:// .https://heihei.ru Test HeiHei :: Передаём https:// | PASS | ---------------------------------------------------------------------- Test TopBicycle :: Не передаём протокол, рассчитываем полу... .http://topbicycle.ru Test TopBicycle :: Не передаём протокол, рассчитываем полу... | PASS | ---------------------------------------------------------------------- Args Def Values :: Tests Url Creation | PASS | 2 tests, 2 passed, 0 failed ====================================================================== Output: /home/andrei/tests/output.xml Log: /home/andrei/tests/log.html Report: /home/andrei/tests/report.html
Сперва нужно указывать аргументы без значений по умолчанию.
Если первым указать аргумент у которого есть значение по умолчанию а за ним тот, у которого нет - будет ошибка
Invalid argument specification: Non-default argument after default arguments.
*** Settings *** Documentation Tests Url Creation *** Test Cases *** Test HeiHei ${heihei}= Build Url https heihei.ru Log To Console ${heihei} Should Be Equal ${heihei} https://heihei.ru Test TopBicycle ${tb}= Build Url topbicycle.ru ${reference}= Set Variable http://topbicycle.ru Log To Console ${tb} Should Be Equal ${tb} ${reference} Expected ${reference} got ${tb} *** Keywords *** Build Url [Arguments] ${protocol}=http ${domain} ${result}= Catenate SEPARATOR= ${protocol} :// ${domain} RETURN ${result}
python -m robot args_def_values_err.robot
[ ERROR ] Error in file 'C:\robot\args\Tests\args_def_values_err.robot' on line 21: Creating keyword 'Build Url' failed: Invalid argument specification: Non-default argument after default arguments. ====================================================================== Args Def Values Err :: Tests Url Creation ====================================================================== Test HeiHei | FAIL | Keyword 'Build Url' expected 0 arguments, got 2. ---------------------------------------------------------------------- Test TopBicycle | FAIL | Keyword 'Build Url' expected 0 arguments, got 1. ---------------------------------------------------------------------- Args Def Values Err :: Tests Url Creation | FAIL | 2 tests, 0 passed, 2 failed ====================================================================== Output: C:\robot\args\output.xml Log: C:\robot\args\log.html Report: C:\robot\args\report.html
Рассмотрим следующий проект
args/ ├── Resources │ └── templates │ └── img.png └── Tests ├── demo.robot └── local_variables.py
Будем пользоваться библиотекой pathlib и ключевым словом Get Variable Value
# local_variables.py from pathlib import Path from robot.libraries.BuiltIn import BuiltIn _built_in = BuiltIn() RESOURCES: Path = Path(_built_in.get_variable_value("${EXECDIR}")).joinpath("Resources")
В роботе подключим библиотеку Operating System
# demo.robot *** Settings *** Library OperatingSystem Variables ./local_variables.py *** Test Cases *** Check Path KW Check Path ... path=${RESOURCES}${/}templates${/}img.png *** Keywords *** Check Path [Arguments] ${path} File Should Exist ${path}
Возможны следующие варианты
Check Path KW Check Path ... ${RESOURCES}${/}templates${/}img.png
и
Check Path KW Check Path ${RESOURCES}${/}templates${/}img.png
Запустим тест из директории args
python -m robot .\Tests\demo.robot
============================================================================== Demo ============================================================================== Check Path KW | PASS | ------------------------------------------------------------------------------ Demo | PASS | 1 test, 1 passed, 0 failed ==============================================================================
Если файла не существует результат будет выглядеть следующим оригинальным образом
python -m robot .\Tests\demo.robot ============================================================================== Demo ============================================================================== Check Path KW | FAIL | File 'C:\args\Resources\templates\missing.png' does not exist. ------------------------------------------------------------------------------ Demo | FAIL | 1 test, 0 passed, 1 failed ==============================================================================
Пример
Перед запуском следующего примера убедитесь, что у вас установлен RFBrowser
*** Settings *** Documentation Example that opens single page Library Browser ... enable_playwright_debug=${True} ... auto_closing_level=TEST ... retry_assertions_for=0:00:03 *** Test Cases *** Verify Title Open Url url=https://aredel.com headless=False Get Title == AREDEL.COM Close Browser *** Keywords *** Open Url [Arguments] ${url} ${headless}=False New Browser browser=chromium headless=${headless} New Context viewport={'width': 1920, 'height': 1080} ignoreHTTPSErrors=True New Page ${url}
python -m robot args.robot
robot args.robot ============================================================================== Args :: Example that opens single page ============================================================================== Verify Title | PASS | ------------------------------------------------------------------------------ Args :: Example that opens single page | PASS | 1 test, 1 passed, 0 failed ============================================================================== Output: /home/andrei/tests/output.xml Log: /home/andrei/tests/log.html Report: /home/andrei/tests/report.html
Переменное количество аргументов
Также возможно, что ключевое слово принимает любое количество аргументов.
Эти так называемые varargs могут быть объединены с обязательными аргументами и
аргументами со значениями по умолчанию, но они всегда указываются после них.
В документации у них есть звездочка перед именем аргумента, например *varargs.
Например, ключевые слова
Join Paths
и
Remove Files
из библиотеки
Operating System
имеют аргументы *paths и base, *parts соответственно.
Первый может использоваться с любым количеством аргументов, но для второго требуется по крайней мере один аргумент.
*** Test Cases *** Example Remove Files ${TEMPDIR}/f1.txt ${TEMPDIR}/f2.txt ${TEMPDIR}/f3.txt @{paths} = Join Paths ${TEMPDIR} f1.txt f2.txt f3.txt f4.txt
Упрощенный пример применения varargs без нормальных проверок на тип данных.
args/ ├── Libraries │ └── add.py ├── Resources │ └── add.resource └── Tests └── varargs.robot
# Tests/varargs.robot *** Settings *** Documentation Example that adds with varargs Resource ../resources/add.resource Test Tags math *** Test Cases *** Two Digits [Tags] add ${result}= Add Unknow Number Of Digits 2 3 Should Be Equal As Integers ${result} 5 Three Digits [Tags] add ${result}= Add Unknow Number Of Digits 2 3 4 Should Be Equal As Integers ${result} 9
# Resources/add.resource *** Settings *** Documentation Arithmetic Calculations Library ../Libraries/add.py *** Keywords *** Add Unknow Number Of Digits [Arguments] @{varargs} ${result}= Add Something @{varargs} RETURN ${result}
# Libraries/add.py def add_something(*args): mysum = 0 for arg in args: try: mysum += int(arg) except (TypeError, ValueError) as e: raise TypeError(f"Argument {arg!r} is not convertible to int") from e return mysum
python -m robot --consolewidth 70 .\Tests\varargs.robot
====================================================================== Varargs :: Example that adds with varargs ====================================================================== Two Digits | PASS | ---------------------------------------------------------------------- Three Digits | PASS | ---------------------------------------------------------------------- Varargs :: Example that adds with varargs | PASS | 2 tests, 2 passed, 0 failed ======================================================================
Аргументы встроенные в имя ключевого слова
Аргументы можно передавать прямо внутри имени ключевого слова.
Официальная документация
В предыдущем разделе объяснялось, как передавать аргументы ключевым словам, чтобы они
указывались отдельно после названия ключевого слова.
В Robot Framework также есть другой подход к передаче аргументов, встраивающий их
непосредственно в название ключевого слова, используемый во втором тесте ниже:
*** Test Cases *** # Обычно аргументы передаются так Normal arguments Select from list cat # Хотим передать cat внутри Embedded arguments Select cat from list
Как показано в примере, встраивание аргументов в названия ключевых слов может упростить чтение и понимание данных даже для людей, не имеющих опыта работы с Robot Framework.
*** Test Cases *** Embedded arguments Select cat from list Select dog from list *** Keywords *** Select ${animal} from list Open Page Pet Selection Select Item From List animal_list ${animal}
Пример с применением встроенных аргументов в шаблонах вы можете изучить здесь
Встраивать в ключевое слово можно не только агрументы, но и части его имени.
Рассмотрим пример когда с помощью
цикла FOR
и подстановки части названия из списка в имя ключевого слова вызываются разные ключевые слова.
*** Settings *** Documentation Substitution of keyword name part *** Variables *** @{array} ${1} ${2} ${3} ${4} ${5} *** Test Cases *** Method Name As A Parameter Demo ${types}= Create list Odd Even FOR ${type} IN @{types} ${numbers}= Run keyword Fetch ${type} Numbers From List ${array} Log To Console ${numbers} END *** Keywords *** Fetch Even Numbers From List [Arguments] ${list} ${even_numbers}= Evaluate [i for i in ${list} if i % 2 == 0] RETURN ${even_numbers} Fetch Odd Numbers From List [Arguments] ${list} ${odd_numbers}= Evaluate [i for i in ${list} if i % 2 != 0] RETURN ${odd_numbers}
============================================================================== Demo :: Substitution of keyword name part ============================================================================== Method Name As A Parameter Demo .[1, 3, 5] [2, 4] Method Name As A Parameter Demo | PASS | ------------------------------------------------------------------------------ Demo :: Substitution of keyword name part | PASS | 1 test, 1 passed, 0 failed ==============================================================================
Автор статьи: Андрей Олегович