用户关键字的参数
大部分的用户关键字需要接受一定的参数. 用来设置参数的语法可能是Robot Framework最复杂的特性, 但即使如此, 在大部分情况下也还是比较容易的.
参数通过 [Arguments] 设置, 参数名称的语法格式和 变量 一样, 如 ${arg}
.
位置参数
指定参数最简单的方式(除了完全不使用参数的情况)是只使用位置参数. 大部分情况下, 位置参数就足够了.
首先是 [Arguments], 后面的单元格中是声明的参数名称. 每个参数占一个单元格, 参数名称的语法格式和变量一样. 当关键字被调用时, 需要传递和此处定义相同数量的参数. 对于框架来说, 参数的名称并不重要, 不过从用户的角度看, 还是需要尽可能的描述清楚. 推荐使用小写字母作为名称, 如: ${my_arg}
, ${my arg}
或 ${myArg}
.
- *** Keywords ***
- One Argument
- [Arguments] ${arg_name}
- Log Got argument ${arg_name}
- Three Arguments
- [Arguments] ${arg1} ${arg2} ${arg3}
- Log 1st argument: ${arg1}
- Log 2nd argument: ${arg2}
- Log 3rd argument: ${arg3}
默认值参数
大部分情况下仅用位置参数创建用户关键字就足够了. 不过, 有时候为关键字的某些参数指定 缺省值 也是很有用的. 要支持默认值, 在基础语法上添加少量改动即可.
为参数添加默认值只需要在参数名后面跟上等号(=
), 然后跟上默认值即可, 例如 ${arg}=default
. 可以为多个参数指定默认值, 指定默认值的参数必须跟在普通的位置参数后面.
除了本地局部作用域的变量不可作为默认值外, 参数的默认值可以包含来自 其它作用域 的 变量.
从Robot Framework 3.0版本开始, 默认值可以基于关键字先前接受的参数来定义.
注解
默认值的语法是对空格敏感的. 等号 =
前面不允许有空格,而等号后面的空格则被视作默认值的一部分.
- *** Keywords ***
- One Argument With Default Value
- [Arguments] ${arg}=default value
- [Documentation] This keyword takes 0-1 arguments
- Log Got argument ${arg}
- Two Arguments With Defaults
- [Arguments] ${arg1}=default 1 ${arg2}=${VARIABLE}
- [Documentation] This keyword takes 0-2 arguments
- Log 1st argument ${arg1}
- Log 2nd argument ${arg2}
- One Required And One With Default
- [Arguments] ${required} ${optional}=default
- [Documentation] This keyword takes 1-2 arguments
- Log Required: ${required}
- Log Optional: ${optional}
- Default Based On Earlier Argument
- [Arguments] ${a} ${b}=${a} ${c}=${a} and ${b}
- Should Be Equal ${a} ${b}
- Should Be Equal ${c} ${a} and ${b}
当一个关键字可接受多个带默认值的参数, 如果调用时仅需要覆盖其中一些, 则此时使用 命名参数 将会非常方便. 使用这种语法时, 指定值的参数名称要脱去 ${}
. 例如, 上面第二个关键字可以按照下面的方法调用, 其中 ${arg1}
仍然是其默认值.
- *** Test Cases ***
- Example
- Two Arguments With Defaults arg2=new value
Pythonistas肯定都已经注意到了, 这种指定默认值的语法几乎就是参照Python中函数的默认值语法实现的.
不定参数
有时仅有默认值也不够, 关键字可能会需要接受 可变数量的参数. 用户关键字同样也支持这个特性, 只需在关键字的参数签名中使用 列表变量 如 @{varargs} 作为参数声明. 同时不定数量的参数可以和默认值参数混用, 前面的参数先进行匹配, 列表参数最终接受所有剩余的参数, 数量可以是0个到任意个.
- *** Keywords ***
- Any Number Of Arguments
- [Arguments] @{varargs}
- Log Many @{varargs}
- One Or More Arguments
- [Arguments] ${required} @{rest}
- Log Many ${required} @{rest}
- Required, Default, Varargs
- [Arguments] ${req} ${opt}=42 @{others}
- Log Required: ${req}
- Log Optional: ${opt}
- Log Others:
- : FOR ${item} IN @{others}
- \ Log ${item}
注意到上例中最后一个关键字如果使用多个参数调用, 则第2个参数总是会传给 ${opt}
覆盖掉默认值. 最后的例子同时展示了如何在 FOR循环 中逐个获取任意数量的参数.
同样, Pythonistas会注意到这个语法和Python中的很相似.
用户关键字的Kwargs
用户关键字同样可以接受 任意关键字参数, 只需在参数列表的最后, 在位置参数和任意数量参数的后面, 使用 字典变量 如 &{kwargs}
. 当该关键字被调用时, 前面没有被匹配的 命名参数 都会传递给该参数.
- *** Keywords ***
- Kwargs Only
- [Arguments] &{kwargs}
- Log ${kwargs}
- Log Many @{kwargs}
- Positional And Kwargs
- [Arguments] ${required} &{extra}
- Log Many ${required} @{extra}
- Run Program
- [Arguments] @{varargs} &{kwargs}
- Run Process program.py @{varargs} &{kwargs}
上面最后一个例子展示了如何封装一个关键字, 可以接受任意的位置或命名参数, 并传递给被封装的关键字. 更详细的例子参见 Kwargs示例.
这个语法同样和Python中的kwargs很相似. &{kwargs}
的用法和 **kwargs
基本雷同.