3.Dictionary变量
Robot Framework的Dictionary变量和Python的Dictionary变量类似,定义的是键值对列表。Python定义Dictionary变量的语法是d = {"name":"tony", "age":"18"}。而RF用“&{}”表示一个变量是Dictionary类型的。
在Test Suite里定义Dictionary变量的示例如下。
*** Variables *** &{dict} name=tony age=18 *** Test Cases *** Dict_Suite_TestCase Log &{dict}[name] #输出所有key为name的值 Log ${dict.age} #输出所有key为age的值 Log ${dict} #以Scalar变量的表示方式输出整个Dictionary变量 |
运行结果如下。
INFO : tony INFO : 18 INFO : {u'name': u'tony', u'age': u'18'} |
Dictionary变量有两种使用方法。一种是使用“[]”,如&{dict}[name],另一种是${dict.key},如${dict.age}。
在BuiltIn库里没有关键字可以创建Dictionary变量,要处理Dictionary变量需要导入Collections库。在Test Case里定义Dictionary变量的示例如下。
*** Settings *** Library Collections #导入Robot Framework自带的Collections库,这个库专门用来处理List和 Dictionary *** Test Cases *** Dict_Case_TestCase &{new_dict} Create Dictionary a=1 b=2 Log First Log: new_dict=${new_dict} Set To Dictionary ${new_dict} c 3 #往Dictionary里添加键值对 Log Second Log: new_dict=${new_dict} ${var} Pop From Dictionary ${new_dict} b #从Dictionary中弹出指定的key,返回 #key对应的value Log Third Log:var=${var}, new_dict=${new_dict} Remove From Dictionary ${new_dict} a x y #从Dictionary中移除指定的key, #如果找不到指定的key,则忽略它而不报错 Log Fourth Log: new_dict=${new_dict} Keep In Dictionary ${new_dict} no_exist #只保留key为"no_exist"的键值对, #这相当于清空Dictionary变量了 Log Fifth Log: new_dict=${new_dict} |
运行结果如下。
INFO : &{new_dict} = { a=1 | b=2 } INFO : First Log: new_dict={'a': '1', 'b': '2'} INFO : Second Log: new_dict={'a': '1', 'b': '2', 'c': '3'} INFO : ${var} = 2 INFO : Third Log:var=2, new_dict={'a': '1', 'c': '3'} INFO : Removed item with key 'a' and value '1'. INFO : Key 'x' not found. INFO : Key 'y' not found. INFO : Fourth Log: new_dict={'c': '3'} INFO : Removed item with key 'c' and value '3'. INFO : Fifth Log: new_dict={} |
注意,上面的List或Dictionary变量的例子中有一些奇怪的用法,例如:
Log First Log: list_2=${list_2} Log First Log: new_dict=${new_dict} |
“list_2”与“new_dict”是我们刚定义的List和Dictionary变量,难道不应该用“@{}”和“&{}”表示吗?是的,这里没有写错,故意用了Scalar变量的表示方式“${}”。这就类似于Python的str()强制转换函数,可以把几乎任何类型都转换成string类型。“${}”也能将其他类型的变量强制用标量形式解释。Log关键字本身是不能直接输出List和Dictionry变量的,转换成Scalar变量后,就可以用Log输出了。
Log Many是另一个和Log类似的内置关键字,它能用于输出整个List变量或Dictionary变量。如果用Log输出一个List变量,就会出现这样的错误。
FAIL : Keyword 'BuiltIn.Log' expected 1 to 5 arguments, got?0. |
如果用Log输出一个Dictionary变量,就会出现这样的错误。
FAIL : Invalid log level '2'. |
而Log Many就能很好地适配各种变量类型,并且一行只输出一个值或键值对。
关于“${}”强制转换和Log Many的示例如下。
LogMany_TestCase Log ${dict} #结果为{'name': 'tony', 'age': '18'} Log Many &{dict} #结果为name=tony\n age=18 Log Many @{list_suite}#输出List变量,结果为1\n2\n3\n\4\n\5 Log ${list_suite} #强制将List变量转换为Scalar变量,结果为 ['1', '2', '3', '4', '5'] Log &{dict} #不能用Log输出Dictionary变量 |
运行结果如下。
INFO : {'name': 'tony', 'age': '18'}’’ INFO : name=tony INFO : age=18 INFO : 1 INFO : 2 INFO : 3 INFO : 4 INFO : 5 INFO : ['1', '2', '3', '4', '5'] FAIL : Keyword 'BuiltIn.Log' expected 1 to 5 arguments, got 0. |
4.多个变量混合赋值
除了给单个变量赋值外,还可以一次给多个变量赋值,并且变量不需要全是Scalar或List类型的。可以一次将一个列表样式的值赋给多个Scalar变量、一个List变量,或同时赋给这两种变量。
多个变量混合赋值的示例如下。
Multiple_Variable_TestCase ${v1} ${v2} ${v3} Set Variable aa bb cc ${first} @{rest} Set Variable aa bb cc @{before} ${last} Set Variable aa bb cc ${begin} @{middle} ${end} Set?Variable aa bb cc |
各个变量的值如下。
INFO : ${v1} = aa INFO : ${v2} = bb INFO : ${v3} = cc INFO : ${first} = aa INFO : @{rest} = [ bb | cc ] INFO : @{before} = [ aa | bb ] INFO : ${last} = cc INFO : ${begin} = aa INFO : @{middle} = [ bb ] INFO : ${end} = cc |
多个变量混合赋值需要注意以下两点。
(1)如果需要赋值的Scalar变量的个数多于或少于可取的值,那么赋值将失败。
(2)Dictionary变量不能和Scalar或List变量混合赋值,Dictionary变量只能单独赋值。
5.变量的作用域
全局有效的变量在整个测试工程运行期间都可以直接使用。
Test Suite里预先定义的变量在这个Test Suite的所有测试用例中都可用。
在Test Cases里赋值的变量的作用域仅为对应用例。
局部临时变量指一些临时使用的变量,如表示返回值的变量只在某个关键字范围内有效。
关于变量作用域的示例如下。
*** Test?Cases *** First_TestCase ${var} Set?Variable Hello,world! Second_TestCase Log var=${var} |
输出的日志如下。
FAIL : Variable '${var}' not found. |
为了扩大Test Cases里定义的变量有效范围,BuiltIn库提供了下面两个关键字。
·Set Suite Variable:变量的有效范围扩大为全测试套件。
·Set Global Variable:变量的有效范围扩大为整个测试工程。
这两个关键字不仅可以修改任何一种变量的作用域,还可以直接创建作用域为测试套件的变量或全局变量。
扩大作用域到测试套件的示例如下。
*** Test Cases *** Extend_Scope_First_TestCase ${var} Set Variable Hello,world! @{list} Set Variable 1 2 3 4 5 &{dict} Create Dictionary name=tony age=18 gender=male Set Suite Variable ${var_new} a new scalar created in case 1 #创建一个作用域为 #测试套件的变量 Set Suite Variable &{dict_new} a=1 b=2 c=3 Set Suite Variable ${var} #将Scalar局部变量的作用域扩大到测试套件 Set Suite Variable @{list} #将List局部变量的作用域扩大到测试套件 Set Global Variable &{dict} #将Dictionary局部变量的作用域扩大到整个测试工程 Extend_Scope_Second_TestCase Log ${var} Log ${list} Log ${dict} Log ${var_new} Log ${dict_new} |
输出的日志如下。
INFO : Hello,world! INFO : ['1', '2', '3', '4', '5'] INFO : {'name': 'tony', 'age': '18', 'gender': 'male'} INFO : a new scalar created in case 1 INFO : {'a': '1', 'b': '2', 'c': '3'} |
一般来说,各个测试用例之间应该是互相独立的,在一个测试用例里设置变量后,在另一个测试用例里使用它会增加调试的难度,也让用例之间相互有了依赖。所以尽量避免使用Set Suite Variable和Set Global Variable改变变量的作用域。
版权声明:51Testing软件测试网获得人民邮电出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。