3.2.4 变量文件
虽然可以用Set Global Variable和Set Suite Variable改变定义在测试用例或测试套件里的变量作用域,但是散落在各个文件里的而被设置成Global或Suite的变量使得阅读和调试更加困难,维护成本也变得高昂。变量文件提供了一种集中式的变量管理方式。变量文件是Python代码的一种格式,除定义简单的静态变量外,它还可以定义动态变量或更复杂的对象。
1.直接定义简单变量
变量文件其实就是一个Python模块,除以下划线(_)开头的变量是隐藏的变量外,其他变量可以被Robot Framework识别。变量名是区分大小写的。对于全局变量,推荐用全大写表示。示例如下。
VARIABLE = "An example string" ANOTHER_VARIABLE = "This is pretty easy! " INTEGER = 42 STRINGS = ["one", "two", "three", "four"] NUMBERS = [1, INTEGER, 3.14] MAPPING = {"one": 1, "two": 2, "three": 3} |
上面的变量文件里前两个是Scalar变量,第三个是数字变量,然后是两个List变量,最后一个是Dictionary变量。但是所有的变量都用Scalar变量的表示方式来命名。这是Python的表示方式,在Robot Framework中使用的时候要再加上识别符号,如${VARIABLE}、@{STRINGS}、&{MAPPING}。
为了明确表示变量的类型,在Robot Framework变量文件里可以对List和Dictionary变量加相应的前缀“LIST__”或“DICT__”。“__”是两条下划线。例如:
LIST__STRINGS = ["one", "two", "three", "four"] DICT__ MAPPING = {"one": 1, "two": 2, "three": 3} |
这些前缀不是变量名的一部分,在Robot Framework里使用变量的时候要去掉这些前缀,而直接使用@{STRINGS}和 &{MAPPING}。加了这样的前缀后,Robot Framework导入变量文件时会审查变量的合法性,以确定这些变量是否被赋予了合法的List或Dictionary类型的值。
2.定义动态变量
由于变量文件是真实的Python模块,因此能够动态地设置变量。
importrandom importtime RANDOM_INT=random.randint(0,10)#[0,10]的随机数 CURRENT_TIME=time.asctime()#当前时间,例如'ThuMar712:45:212019' iftime.localtime()[3]>12: AFTERNOON=True else: AFTERNOON=False |
上例中定义了3个变量RANDOM_INT、CURRENT_TIME和AFTERNOON。每次运行程序时,这些变量都可能取不一样的值。
3.带参数的变量文件
变量文件里的变量还可以根据使用者传入的参数不同而赋予不同的值。示例如下。
import math as _math def _get_area(diameter): radius = diameter / 2.0 area = _math.pi * radius * radius return area AREA = _get_area(arg) |
arg是引用变量文件时传入的参数(圆的直径),area变量会根据传入圆的直径计算出圆的面积并赋给AREA变量。
4.变量文件的使用
所有的测试数据文件(测试工程的__init__文件、测试套件文件、资源文件)都可以在设置(*** Settings ***)部分用“Variables”关键字引用变量文件。被引用的变量文件如果没有指定路径,首先会在引用的测试数据文件的同级目录中查找,如果找不到,则会在Python定义的库搜索路径里查找。示例如下。
***Settings*** Variablesmyvariables.py Variables../data/variables.py Variables${RESOURCES}/common.py Variablestaking_arguments.pyarg1${ARG2} |
除在测试数据文件的设置里引用变量文件外,还可以由Robot Framework命令行在运行时通过参数(--variablefile)传入,这样变量的作用域就是整个测试工程。示例如下。
--variablefile myvariables.py --variablefile path/variables.py --variablefile /absolute/path/common.py --variablefile taking_arguments.py:arg1:arg2 |
3.2.5 Setup和Teardown
Robot Framework的测试数据由测试工程、测试套件和测试用例这3级构成。这3级测试数据的设置部分中都可以包括Setup 和Teardown。Setup 指定在执行测试用例前需要执行的操作,如打开被测系统;而Teardown指定执行测试用例后或测试中途失败后需要执行的操作,如关闭被测系统。
Setup和Teardown的语法如下。
关键字|参数1|参数2|…|参数n |
在RIDE中,在相应的测试工程、测试套件或测试用例上单击Settings<<按钮即可看到Setup和Teardown。在测试工程和测试套件里的Setup和Teardown如图3-24所示。
·Suite Setup:当进入一个目录或测试套件文件时执行的操作。
·Suite Teardown:当这个目录或测试套件里的所有测试用例都执行完后需要执行的操作。
·Test Setup:目录或测试套件里的每一个测试用例执行前需要执行的操作。
·Test Teardown:目录或测试套件里的每一个测试用例执行完后需要执行的操作。
在测试用例上单击Settings?<<按钮可以设置测试用例的Setup和Teardown,如图3-25所示。
图3-24 测试工程和测试套件里的Setup和Teardown
图3-25 设置测试用例的Setup和Teardown
·Setup:执行本测试用例之前执行的操作。
·Teardown:执行本测试用例后执行的操作。
下一级中设置的Setup或Teardown会覆盖上一级中的定义。例如,如果在目录上设置了Setup,在其下的测试套件中也设置了Setup,那么执行这个测试套件的时候,目录里的Setup就不会执行。如果测试用例中定义了Setup或Teardown,那么执行这个测试用例的时候,就不会执行目录和测试套件里定义的Test Setup或Test Teardown。
Setup和Teardown里只能使用一个关键字及其参数,关键字和各个参数之间用竖线(|)分隔。当参数本身带有竖线时,用转义字符“\|”转义。如果要在Setup或Teardown里使用多个关键字,可以用AND连接多个关键字或重新创建一个关键字来包含需要调用的多个关键字。
示例如下。
***Settings*** TestSetupOpenApplication#程序A TestTeardownCloseApplication ***TestCases*** Defaultvalues [Documentation]#执行测试套件中定义的Setup和Teardown DoSomething Overriddensetup [Documentation]#执行自己的Setup,Teardown由测试套件里定义的关闭程序完成 [Setup]OpenApplication#程序B DoSomething Noteardown [Documentation]#执行测试套件里的Setup,执行自己的Teardown,这里Teardown定义为什么都不做 DoSomething [Teardown] |
上面是一个关于测试套件文件的示例,在测试套件中定义了Test Setup和Test Teardown,默认每个测试用例执行前都应该执行打开程序A的操作,每个测试用例执行完后,即可执行关闭程序的操作。但是在测试用例里,如果定义了自己的Setup或Teardown,就会覆盖测试套件中的定义。
版权声明:51Testing软件测试网获得人民邮电出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。