3.2.9 用户关键字
Robot Framework自带的测试库和各种第三方库里提供了大量的关键字,基于现有Robot Framework内置关键字和第三方提供的关键字创建的新关键字叫作用户关键字。一个用户关键字可以使用其他用户关键字。
Robot Framework自带的测试库和第三方库提供的关键字是面向公共常用场景创建的。Robot Framework测试设计是一种ATDD的开发模式,测试用例是依据用例(Use Case)来设计的,而不是根据运行的软件来设计的。测试用例的设计步骤尽量按照用例使用方法设计。可以把用户的每一步操作定义为一个用户关键字,这样可以很好地按用例来设计测试用例。
用户关键字可以在任何一种类型的测试文件里创建,包括测试工程/子目录初始化文件、资源文件和测试套件文件。关键字只在本文件范围内有效,一个测试套件文件无法直接引用另一个测试套件文件里的用户关键字,但是可以引用资源文件里的关键字。在文件中用“*** Keywords ***”表示这是关键字列表。关键字的语法和普通测试用例很像,只是在关键字里可以带输入和输出参数。Send_Message和Get_Reply关键字的实现方式如下。
*** Keywords *** Send_Message [Arguments] ${msg} [Documentation] 向助理机器人发送命令关键字 [Tags] communicate Create File ${questions_file} ${msg} UTF-8 File Should Not Be Empty ${questions_file} Log File ${questions_file} Get_Reply [Documentation] 接收助理机器人返回的消息关键字 [Tags] communicate ${ret} ${output} Run And Return Rc And Output python ${assistant_robot} Should Be Equal As Integers ${ret} 0 Log File ${answer_file} ${content} Get File ${answer_file} [Return] ${content} |
用户关键字的设置部分用方括号“[ ]”表示,可用的设置如下。
·[Documentation]:关于用户关键字的使用说明。
·[Tags]:给用户关键字设置标签,可以通过标签来查找相关的关键字。
·[Arguments]:用户关键字的参数列表。
·[Return]:用户关键字的返回值列表。
·[Teardown]:用户关键字执行完后或执行失败后需执行的操作。
·[Timeout]:用户关键字运行的超时时间。
在RIDE的测试工程、测试套件或资源文件上右击,选择New User Keyword选项,就可以新建用户关键字,如图3-30所示。
和测试用例的Edit选项卡相比,在用户关键字的Edit选项卡(见图3-31)中少了Setup和Template,但是多出了Arguments和Return Value,用于接受输入和返回值。
图3-30 新建用户关键字
图3-31 用户关键字的Edit选项卡
1.参数列表
对于大部分的用户关键字,需要传入参数。根据传入的参数,在相同的处理逻辑下输出不同的结果。
1)位置参数列表
最简单、最直观的参数是位置参数,即将各Scalar变量按位置一个一个列在参数列表里。示例如下。
*** Keywords *** One Argument [Arguments] ${arg_name} Log 传入的参数是 ${arg_name} Three Arguments [Arguments] ${arg1} ${arg2} ${arg3} Log 第一个参数: ${arg1} Log 第二个参数: ${arg2} Log 第三个参数: ${arg3} |
在使用这些用户关键字时将所有参数按格式和顺序传入即可。
*** Test Cases *** Argument_TestCase One Argument file_a.txt Three Arguments 号码 123456 file_a.txt |
2)带默认值的参数列表
大部分情况下,位置参数列表已经足够使用,但是如果参数有默认值,有时会非常方便。参数的默认值用一个等号(=)表示。
*** Keywords *** Argument With Default Value [Arguments] ${arg1} ${arg2} ${arg3}=file_a.txt Log 在文件${arg3}中修改${arg1}的值为${arg2} *** Test Cases *** Default_Argument_TestCase Argument With Default Value 号码 123456 #修改默认的文件file_a.txt Argument With Default Value 号码 123456 file_b.txt #修改另一个文件file_b.txt |
上例中第三个参数${arg3}带默认值“file_a.txt”,使用这个关键字的时候,如果不填第三个参数,就使用默认值。
3)以List变量作为参数
关键字参数列表里除了可以传递Scalar变量之外,还可以传递List变量。示例如下。
*** Keywords *** test_list_args_kw [Arguments] ${arg1} ${arg2} @{arglist} Log ${arg1} Log ${arg2} Log Many @{arglist} *** Test Cases *** List_Argument_TestCase test_list_args_kw 1 2 3 4 5 6 7 test_list_args_kw 取得的参数值如下。 ${arg1}='1' ${arg2}='2' @{arglist}=['3', '4', '5', '6', '7'] |
如果关键字参数里既有Scalar变量又有List变量,List变量要放在Scalar变量的后面。如测试用例List_Argument_TestCase所示,将所有参数按标量一个一个传入,把前两个标量参数赋值完成后,把剩下的参数一起传递到@{arglist}变量。
4)以Dictionary变量作为参数
有时候被测系统接受的参数列表非常灵活。参数个数不确定,或有十几个甚至几十个参数,但是某次只有其中的几个参数需要传递值。这种关键字的参数怎么写呢?举一个例子来说明这样的参数定义。
*** Keywords *** test_dict_args_kw [Arguments] @{arg_list} &{arg_dict} Run Process myApp @{arg_list} &{arg_dict} *** Test Cases *** Dict_Argument_TestCase_1 test_dict_args_kw 1 2 a=3 b=4 Dict_Argument_TestCase_2 test_dict_args_kw 1 2 3 aa=4 bb=5 在上面两个测试用例里,@{arg_list}和&{arg_dict}的值分别是多少呢? 在Dict_Argument_TestCase_1测试用例里,它们的值如下。 @{arg_list}=['1', '2'] &{arg_dict}={'a': '3', 'b': '4'} 在Dict_Argument_TestCase_2测试用例里,它们的值如下。 @{arg_list}=['1', '2', '3'] &{arg_dict}={'aa': '4', 'bb': '5'} |
对于这个被测系统来说,接受的参数个数不定,部分参数用?key=value?形式赋值。在?Dict_ Argument_TestCase_1测试用例里,我们将1、2传入前两个参数,将a=3、b=4作为Dictionary传给&{arg_dict}变量。而在Dict_Argument_TestCase_2测试用例里,我们将1、2、3传给前3个参数,将aa=4、bb=5作为Dictionary传给&{arg_dict}变量。
2.关键字返回值
像大部分库函数一样,用户关键字可以有返回值。返回值可以将变量放在[Return]字段里,也可以用BuiltIn库函数提供的关键字Return From Keyword或Return From Keyword If显式返回。
用[Return]返回的示例如下。
*** Keywords *** add_two_number_kw [Arguments] ${arg1} ${arg2} ${result} Evaluate ${arg1}+${arg2} [Return] ${result} *** Test Cases *** Return_Value_Testcase_1 ${result} add_two_number_kw 1 2 Log ${result} |
用BuiltIn库函数提供的关键字返回的示例如下。
*** Keywords *** add_two_number_kw [Arguments] ${arg1} ${arg2} ${result} Evaluate ${arg1}+${arg2} Return From Keyword ${result} Comment 后面的语句将不执行 find_index_kw [Arguments] ${element} @{items} ${index} Set Variable ${0} :FOR ${item} IN @{items} #用FOR循环查找${element}在${items}列表里的位置 \ Return From Keyword If '${item}' == '${element}' ${index} #如果找到${element}, #就立刻退出循环,并返回其在列表@{items}里的位置 \ ${index} Set Variable ${index + 1} Return From Keyword ${-1} #如果没找到,就返回-1 *** Test Cases *** Return_Value_Testcase_1 ${result} add_two_number_kw 1 2 Log ${result} #值为3 Return_Value_Testcase_2 ${result} find_index_kw me [can|you|find|me| ] Log ${result} #me在数组里的位置为3 |
Return From Keyword返回指定的变量,只有满足判断条件,Return From Keyword If才执行返回操作。一旦返回操作执行,关键字即退出执行,后面的语句将不再执行。
3.关键字Teardown
在关键字里还有一个字段—[Teardown]。和测试套件或测试用例的Teardown类似,关键字执行成功或失败后,需要执行的操作可以放在Teardown里。关键字Teardown的语法和测试用例一致,参数列表与关键字以及各个参数之间用竖线分隔。
*** Keywords *** check_log_file_kw [Arguments] ${logfile} Open File ${logfile} Do Something Here [Teardown] Close File ${logfile} |
在这个关键字里,打开了一个文件进行一些检查和操作,如果中途出现异常,文件可能没有及时释放而使其余的关键字执行异常。这种情况下可以在Teardown里将文件关闭。
版权声明:51Testing软件测试网获得人民邮电出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。