Dictionary变量——自动化测试精解(7)

发表于:2021-1-07 09:25

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:刘云    来源:51Testing软件测试网原创

  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软件测试网获得人民邮电出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号