创建用户关键字
关键字表是用于创建新的更高层次的关键词 结合现有的关键词。 这些关键字被称为 用户 关键字 区分他们的最低水平 库关键字 实现在测试库。 的语法创建用户 关键词非常接近的语法创建测试用例 很容易学习。
用户关键字语法
基本语法
在许多方面,总体用户关键字语法是相同的 测试用例的语法 。 用户创建关键字关键字表 这不同于测试用例表,用于只有名字 识别它们。 用户在第一列类似关键字名称 测试用例的名称。 也从关键字,创建用户的关键词 从关键词在测试库或其他用户的关键词。 关键字的名字 通常在第二列,但当设置变量的 关键字返回值,它们在随后的列。
*** Keywords ***
Open Login Page
Open Browser http://host/login.html
Title Should Be Login Page Title Should Start With
[Arguments] ${expected}
${title} = Get Title
Should Start With ${title} ${expected}
大多数用户关键词需要一些参数。 这个重要的特性 已经在上面的第二个例子,详细解释 后来在这一节中 类似地, 用户关键字返回 值 。
可以创建用户关键字 测试用例文件 , 资源文件 , 和 测试套件的初始化文件 。 关键字中创建资源 文件可用于文件使用它们,而其他关键字 只能在他们创建的文件。
设置关键字表中
用户关键字可以有类似的设置 测试用例 ,他们 有相同的方括号语法分离关键字 的名字。 下面列出了所有可用的设置和稍后解释 这一节。
- (文档)
- 用于设置一个 用户的关键字的文档 。
- (标签)
- 集 标签 关键字。
- (参数)
- 指定 用户关键字参数 。
- (返回)
- 指定 用户关键字返回值 。
- (拆卸)
- 指定 用户关键字拆卸 。
- (超时)
- 集可能 用户关键字超时 。 超时 讨论了 在自己的部分。
用户关键字名称和文档
中定义的用户关键字的名字是第一列的用户 关键字表。 当然,这个名字应该是描述性的,它是 接受有很长的关键字的名字。 实际上,当创建 通常use-case-like测试用例,*别的关键词 制定句子甚至段落。
用户关键字可以有一个文档的设置 (文档) 设置,完全一样 测试用例文档 。 这个设置文档用户关键字的测试数据。 它也显示 在更正式的关键字的文档, Libdoc 工具可以创建 从 资源文件 。 最后,文档的第一行 显示为一个关键字的文档 测试日志 。
有时关键词需要被删除,取而代之的是新的,或 弃用其他原因。 用户关键字可以弃用 从文档 *不*
,这将 导致使用关键字的一个警告。 有关更多信息,请参见 不以为然的关键词 部分。
用户关键词标签
从机器人Framework 2.9,关键词也可以有标签。 用户的关键字 可以设置标签 (标签) 设置同样 测试用例的标签 , 但可能 力的标签 和 默认的标签 设置不 影响它们。 另外可以指定关键词标签的最后一行 的文档 标签:
前缀和由逗号分隔。 例如, 后两个关键词都得到相同的三个标签。
*** Keywords ***
Settings tags using separate setting
[Tags] my fine tags
No Operation Settings tags using documentation
[Documentation] I have documentation. And my documentation has tags.
... Tags: my, fine, tags
No Operation
关键词标签生成的日志和文档所示 Libdoc , 的关键字也可以根据标签搜索。 ——removekeywords 和 ——flattenkeywords 命令行选项也支持选择关键词 标签,和新用法的关键词标签可能被添加在后面的版本。
类似与 测试用例的标签 ,用户关键词标签 机器人-
前缀 是 保留 特色的机器人框架本身。 用户应该 因此不使用任何标签 机器人-
除非真正激活前缀 特殊的功能。
用户关键字参数
大多数用户关键词需要一些参数。 的语法 指定他们可能是最复杂的功能正常 需要与机器人框架,但即使是相对容易的, 特别是在最常见的情况。 参数通常是指定的 的 (参数) 使用相同的设置,参数名称 语法 变量 例如, $ { arg }
。
位置参数
最简单的方法来指定参数(除了没有) 仅使用位置参数。 在大多数情况下,这就是一切了 这是必要的。
语法是这样的首先 (参数) 设置是 鉴于,然后在随后的定义参数名称 细胞。 每个参数都是在自己的细胞,使用相同的语法 变量。 关键字必须使用尽可能多的参数 参数名称在其签名。 实际的参数名称不 框架问题,但从用户的角度来看他们应该 尽可能的描述。 建议 在变量名用小写字母,要么 $ { my_arg }
, $ {我的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 } =违约
。 可以有许多参数与违约,但他们都必须有 正常的位置参数。 默认值可以包含一个 变量 上创建 测试套件或全球范围 ,但局部变量的关键字 遗嘱执行人不能使用。 从机器人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
正如所有的python支持者必须已经注意到的,语法 指定默认参数严重受Python语法 函数的默认值。
Varargs和用户关键字
有时甚至默认值是不够的,有必要 为一个关键字接受 数量可变的参数 。 用户的关键字 也支持这个特性。 所需要的就是拥有 变量列表 这样的 作为 @ { varargs }
在关键字可能位置参数后签名。 这个语法可以结合前面描述的默认值,和 最后列表变量得到所有剩下的参数不匹配 其他参数。 列表变量可以有任意数量的物品,甚至是零。
*** 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}
注意,如果使用上面最后一个字与不止一个 参数,第二个参数 $ {选择}
总是给定的 值而不是默认的值。 这种情况即使给定 值是空的。 最后一个例子也说明了一个变量 数量的参数接受一个用户关键字可以用在一个 为 循环 。 这种组合的两个,而先进的功能 有时是非常有用的。
再次,python支持者可能注意到变量的数量 参数语法非常接近一个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例子 对于一个完整的示例相同的关键字。
还kwargs支持与用户关键字和kwargs工作非常类似的工作 在Python中。 在签名也向前传递参数时, & { kwargs }
差不多是Python的吗 * * kwargs
。
将参数嵌入到关键字的名字
机器人框架也另一种方法向用户传递参数 关键字比指定关键字名称后细胞内 在前一节中解释。 这种方法是基于嵌入 参数直接进入关键字名称和它的主要好处是 使其更容易使用真实和清晰的句子作为关键字。
基本语法
它一直可以使用关键字的样子 选择狗 从列表 和 从列表中选择猫 ,但所有这些关键字 一定是单独实现。 嵌入参数的概念 入关键字的名字是所有你需要的是一个字的名字 从列表中选择$ {动物} 。
*** Keywords ***
Select ${animal} from list
Open Page Pet Selection
Select Item From List animal_list ${animal}
关键字使用嵌入式论点不能采取任何“正常”的论点 (指定 (参数) 设置)除此之外 就像其他用户创建关键字。 中使用的参数的名称 自然会可以在关键字和他们有不同吗 价值取决于关键字。 例如, $ {动物}
在前面的是有价值的 狗
如果关键字 使用像 从列表中选择狗 。 显然它不是 强制使用这些参数在关键字,他们可以 因此作为通配符。
这类关键字也用同样的方式作为其他关键词 除了空间和强调不被忽视 的名字。 然而,他们是不区分大小写的像其他关键词。 为 示例中,关键字在上面的例子中可以使用 从列表中选择x ,但不喜欢 选择x fromlist 。
嵌入参数不支持默认值或变量的数量 参数正常参数。 使用变量时 把这些关键词是可能的,但可以减少可读性。 只注意到嵌入式参数处理用户的关键词。
嵌入参数匹配的太多
一个棘手的部分使用嵌入式参数是确保 值调用时使用的关键字匹配正确的参数。 这 是一个问题尤其是如果有多个参数和人物 分离也可能出现在给定的值。 例如, 关键字 城市选择$ { } $ {团队} 如果使用不正确工作 与城市包含了部分 选择洛杉矶湖人队 。
解决这个问题很简单,那就是引用的参数(如。 城市选择“$ { } " $ {团队} " ),在引用中使用关键字 格式(如。 选择“洛杉矶”“湖人队” )。 这种方法是 不足以解决所有的冲突,但它是 仍然强烈推荐,因为它使论点脱颖而出 其他关键字。 一个更强大,但也更复杂 解决方案, 使用自定义正则表达式 在定义变量时, 在下一节中解释。 最后,如果事情变得复杂, 这可能是一个更好的主意转而使用普通位置参数。
参数匹配的问题往往出现在创建太多了 的关键字 忽略了/ / /,/但前缀 。 例如, $ {名称}回家 匹配 给珍妮回家 所以 那 $ {名称}
获得的价值 给珍妮
。 引号的 参数,像在 " $ {名称}”回家 ,解决这个问题 很容易。
使用自定义正则表达式
与嵌入参数被称为关键字时,值 匹配在内部使用 正则表达式 (简称regexp)。 默认的逻辑,这样每一个论点 名字是一个模式所取代 . * ?
基本上匹配 任何字符串。 这个逻辑通常很有效,但而已 上面所讨论的,有时候关键字 比赛多 目的 。 引用或分离参数 文本可以帮助但是,例如,下面的测试失败,因为关键字 我执行“ls”与“韩” 这两个定义匹配 关键词。
*** Test Cases ***
Example
I execute "ls"
I execute "ls" with "-lh" *** Keywords ***
I execute "${cmd}"
Run Process ${cmd} shell=True I execute "${cmd}" with "${opts}"
Run Process ${cmd} ${opts} shell=True
解决这个问题是使用自定义正则表达式 确保关键字匹配只应该在那 特定的上下文。 能够使用该功能,并完全 理解本节中的示例,您需要理解 最基本的正则表达式语法。
一个定制的嵌入式参数正则表达式定义之后 基本的参数,参数名称和正则表达式 用冒号分隔。 例如,一个论点,应该匹配 只有数字可以被定义 $ {参数:\ d + }
。 使用自定义 下面的例子说明了正则表达式。
*** Test Cases ***
Example
I execute "ls"
I execute "ls" with "-lh"
I type 1 + 2
I type 53 - 11
Today is 2011-06-27 *** Keywords ***
I execute "${cmd:[^"]+}"
Run Process ${cmd} shell=True I execute "${cmd}" with "${opts}"
Run Process ${cmd} ${opts} shell=True I type ${a:\d+} ${operator:[+-]} ${b:\d+}
Calculate ${a} ${operator} ${b} Today is ${date:\d{4\}-\d{2\}-\d{2\}}
Log ${date}
在上面的例子中关键字 我执行“ls”与“韩” 匹配 只有 我执行“$ { cmd }”和“$ {选择} " 。 这是保证 因为自定义正则表达式 [^ "]+
在 我执行 “$ { cmd:[^]}” 意味着一个匹配的参数不能包含任何 引号。 在这种情况下不需要添加自定义的regexp 其他 我执行 变体。
提示
如果你引用参数,使用正则表达式 [^ "]+
直到第一个保证的参数匹配 关闭报价。
支持正则表达式语法
使用Python实现,自然使用Python的机器人框架 再保险 非常标准的模块 正则表达式 语法 。 这个语法与嵌入式否则完全支持 参数,但regexp扩展格式 (?…)
不能 使用。 还需要注意的是,嵌入参数进行匹配 不区分大小写。 如果正则表达式语法无效, 创建关键字失败与错误中可见 测试执行 错误 。
转义特殊字符
有一些特殊字符需要使用时逃走了 自定义正则表达式嵌入参数。 首先,可能关闭 花括号( }
)的模式需要保住了一个反斜杠 ( \ }
),否则参数就会结束了。 这是 与关键字前面的示例中所示 今天是$ {日期:\ d { 4 \ } - \ d { 2 \ } \ d { 2 \ } } 。
反斜杠( \ )是一种特殊的字符在Python中常规 表达式语法,因此需要逃脱了如果你想要一个 文字反斜杠字符。 在这种情况下最安全的转义序列 是四个反斜杠( \ \ \ \
),但是,这取决于下一个 性格,还两个反斜杠可能就足够了。
注意到关键字名称和可能的嵌入参数 应该 不 使用正常的逃脱了 测试数据泄漏 规则 。 这意味着,例如,反斜杠的表达式 就像 $ {名称:\ w + }
不应该逃跑。
使用自定义的变量嵌入参数正则表达式
每当定制的嵌入式参数使用正则表达式时,机器人 框架会自动提高指定的regexp,这样他们 匹配变量除了与模式相匹配的文本。 这 意味着它总是可以用关键字使用变量 嵌入参数。 例如,下面的测试用例能通过 从早期的例子使用关键词。
*** Variables ***
${DATE} 2011-06-27 *** Test Cases ***
Example
I type ${1} + ${2}
Today is ${DATE}
一个缺点的变量自动定制正则匹配 表达式是可能值的关键字 实际上并没有匹配指定的正则表达式。 例如,变量 $ {日期}
在上面的例子中可以包含任何价值 今天是$ {日期} 仍将匹配相同的关键字。
行为驱动开发的例子
最大的好处有参数作为关键字的名字是它的一部分 使它更容易使用更高级的句子的关键词在编写测试 病例 行为驱动方式 。 下面的例子说明了这一点。 请注意 也前缀 鉴于 , 当和 然后 是 遗漏了 关键字定义 。
*** Test Cases ***
Add two numbers
Given I have Calculator open
When I add 2 and 40
Then result should be 42 Add negative numbers
Given I have Calculator open
When I add 1 and -2
Then result should be -1 *** Keywords ***
I have ${program} open
Start Program ${program} I add ${number 1} and ${number 2}
Input Number ${number 1}
Push Button +
Input Number ${number 2}
Push Button = Result should be ${expected}
${result} = Get Result
Should Be Equal ${result} ${expected}
请注意
在机器人框架受嵌入参数特性 如何 步骤定义 中创建一个受欢迎的BDD工具。
用户关键字返回值
同样作为图书馆的关键词,也可以返回用户关键词 值。 通常的定义返回值 (返回) 设置,但也可以使用 内装式 关键字 从关键字 和 从关键字如果回来 。 无论如何返回值,就可以 分配给变量 在测试用例和其他用户的关键词。
使用 (返回) 设置
最常见的情况是,用户关键字返回一个值,它是 分配给一个标量变量。 当使用 (返回) 设置,这是 完成在接下来的细胞通过返回值后设置。
用户关键字也可以返回多个值,然后可以分为 几个标量变量,变量列表,或标量变量 和一个列表变量。 几个可以简单地通过返回值 在不同的细胞后,指定这些值 (返回) 设置。
*** Test Cases ***
One Return Value
${ret} = Return One Value argument
Some Keyword ${ret} Multiple Values
${a} ${b} ${c} = Return Three Values
@{list} = Return Three Values
${scalar} @{rest} = Return Three Values *** Keywords ***
Return One Value
[Arguments] ${arg}
Do Something ${arg}
${value} = Get Some Value
[Return] ${value} Return Three Values
[Return] foo bar zap
使用特殊的关键字返回
内装式 关键字 从关键字 和 从关键字如果回来 从用户的关键字有条件地允许返回中间的字。 他们两人也接受可选的处理完全一样的返回值 与 (返回) 设置上面所讨论的。
下面的第一个例子是功能与之前相同 (返回) 设置的例子。 第二,更先进的例子 演示了返回内部条件 for循环 。
*** Test Cases ***
One Return Value
${ret} = Return One Value argument
Some Keyword ${ret} Advanced
@{list} = Create List foo baz
${index} = Find Index baz @{list}
Should Be Equal ${index} ${1}
${index} = Find Index non existing @{list}
Should Be Equal ${index} ${-1} *** Keywords ***
Return One Value
[Arguments] ${arg}
Do Something ${arg}
${value} = Get Some Value
Return From Keyword ${value}
Fail This is not executed Find Index
[Arguments] ${element} @{items}
${index} = Set Variable ${0}
:FOR ${item} IN @{items}
\ Return From Keyword If '${item}' == '${element}' ${index}
\ ${index} = Set Variable ${index + 1}
Return From Keyword ${-1} # Could also use [Return]
请注意
这两个 从关键字 和 从关键字如果回来 因为机器人框架2.8。
用户关键字拆卸
用户使用关键字可以定义拆解 (拆卸) 设置。
关键字拆卸工作一样 测试用例 拆卸 。 最重要的是,拆卸总是一个 关键字,尽管它可以被另一个用户的关键字,就会执行 也当用户关键字失败。 此外,所有的步骤 拆卸执行即使其中一个失败。 然而,失败 关键字拆卸将会失败的测试用例和后续步骤 测试不运行。 的名称关键字执行拆卸 也可以是变量。
*** Keywords ***
With Teardown
Do Something
[Teardown] Log keyword teardown Using variables
[Documentation] Teardown given as variable
Do Something
[Teardown] ${TEARDOWN}