Передать аргументы в кейворд 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
Сложить два числа
Напишем RobotFramework Keyword, который будет принимать два числа и складывать их.
Проверим результат
*** Settings *** Documentation Tests passing int and float as arguments *** Variables *** *** Keywords *** Add [Arguments] ${addend1} ${addend2} ${result}= Evaluate ${addend1} + ${addend2} [Return] ${result} *** Test Cases *** Test Add Integers ${sum1}= Add 1 2 Should Be Equal As Integers ${sum1} 3 Test Add Floats ${sum2}= Add 3.5 6.2 Should Be Equal As Numbers ${sum2} 9.7 Test Add Negative Integers ${sum3}= Add -2 -3 Should Be Equal As Integers ${sum3} -5
robot args_add.robot
============================================================================== Args Add :: Tests passing int and float as arguments ============================================================================== Test Add Integers | PASS | ------------------------------------------------------------------------------ Test Add Floats | PASS | ------------------------------------------------------------------------------ Test Add 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:// но можно передать свой аргумент.
***Settings *** Documentation Tests Url Creation ***Variables *** ***Keywords *** Write Url [Arguments] ${domain} ${protocol}=http:// ${result}= Catenate SEPARATOR= ${protocol} ${domain} [Return] ${result} ***Test Cases *** # Передаём https:// Test HeiHei ${heihei}= Write Url heihei.ru https:// Log To Console ${heihei} Should Be Equal ${heihei} https://heihei.ru # Не передаём протокол, рассчитываем # получить дефолтный http:// Test TopBicycle ${tb}= Write Url topbicycle.ru Log To Console ${tb} Should Be Equal ${tb} http://topbicycle.ru
robot args_def_values.robot
============================================================================== Args Def Values :: Tests Url Createion ============================================================================== Test HeiHei .https://heihei.ru Test HeiHei | PASS | ------------------------------------------------------------------------------ Test TopBicycle .http://topbicycle.ru Test TopBicycle | PASS | ------------------------------------------------------------------------------ Args Def Values :: Tests Url Createion | 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
Пример
***Settings *** Documentation Example that opens single page Library Browser ... enable_playwright_debug=${True} ... auto_closing_level=TEST ... retry_assertions_for=0:00:03 ***Variables *** ***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} ***Test Cases *** Verify Title Open Url url=https://aredel.com headless=False Get Title == AREDEL.COM Close Browser
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
Сперва нужно указывать аргументы без значений по умолчанию.
Если первым указать аргумент у которого есть значение по умолчанию а за ним тот, у которого нет - будет ошибка
Invalid argument specification: Non-default argument after default arguments.
***Settings *** Documentation Tests Url Creation ***Variables *** ***Keywords *** Write Url [Arguments] ${protocol}=http:// ${domain} ${result}= Catenate SEPARATOR= ${protocol} ${domain} [Return] ${result} ***Test Cases *** Test HeiHei ${heihei}= Write Url https:// heihei.ru Log To Console ${heihei} Should Be Equal ${heihei} https://heihei.ru Test TopBicycle ${tb}= Write Url topbicycle.ru Log To Console ${tb} Should Be Equal ${tb} http://topbicycle.ru
robot args_def_values_err.robot
[ ERROR ] Error in file '/home/andrei/tests/args_def_values_err.robot' on line 8: Creating keyword 'Write Url' failed: Invalid argument specification: Non-default argument after default arguments. ============================================================================== Args Def Values Err :: Tests Url Creation ============================================================================== Test HeiHei | FAIL | Invalid argument specification: Non-default argument after default arguments. ------------------------------------------------------------------------------ Test TopBicycle | FAIL | Invalid argument specification: Non-default argument after default arguments. ------------------------------------------------------------------------------ Args Def Values Err :: Tests Url Creation | FAIL | 2 tests, 0 passed, 2 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 без нормальных проверок на тип данных.
*** Settings *** Documentation Example that adds with varargs Resource ../resources/add.resource Test Tags math *** Variables *** *** Keywords *** *** 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
*** Settings *** Documentation Arithmetic Calculations Library ../libraries/add.py *** Keywords *** Add Unknow Number Of Digits [Arguments] @{varargs} ${result}= Add Something @{varargs} [Return] ${result}
def add_something(*args): itargs = iter(args) mysum = next(itargs) if int(mysum): mysum = int(mysum) for argt in itargs: mysum += int(argt) else: raise TypeError return mysum
Аргументы встроенные в имя ключевого слова
Аргументы можно передавать прямо внутри имени ключевого слова.
Официальная документация
В предыдущем разделе объяснялось, как передавать аргументы ключевым словам, чтобы они
указывались отдельно после названия ключевого слова.
В Robot Framework также есть другой подход к передаче аргументов, встраивающий их
непосредственно в название ключевого слова, используемый во втором тесте ниже:
*** Test Cases *** # Обычно аргументы передаются так Normal arguments Select from list cat # Хотим передать cat внутри Embedded arguments Select cat from list
Как показано в примере, встраивание аргументов в названия ключевых слов может упростить чтение и понимание данных даже для людей, не имеющих опыта работы с Robot Framework.
*** Keywords *** Select ${animal} from list Open Page Pet Selection Select Item From List animal_list ${animal} *** Test Cases *** Embedded arguments Select cat from list Select dog from list
Пример с применением встроенных аргументов в шаблонах вы можете изучить здесь