Robot Framework自定义测试库的作用域的理解
robot framework中,强大的测试库api支持,用户可根据实际需求定义测试库,导入后可使用自定义库中相应的关键字。
当自定义的测试库是类库,则需要考虑一个问题:类实例。用类实现的库可以有内部状态, 这些状态可以被关键字或构造函数修改. 因为这些状态会影响到关键字实际的行为, 所以, 保证一个测试用例不会意外地影响到另一个用例显得非常重要. 这种依赖行为有可能造成非常难定位的bug。例如, 添加了新的测试用例, 而这些用例使用库的方式并不一致。
Robot Framework 为了保证测试用例之间的独立性, 默认情况下, 它为每个测试用例创建新的测试库实例. 然而, 这种方式不总是我们想要的, 比如有时测试用例需要共享某个状态的时候. 此外, 那些无状态的库显然也不需要每次都创建新实例。实例化测试库类的方式可以通过属性ROBOT_LIBRARY_SCOPE定义的三个作用域来控制
1.TEST CASE:为每个测试用例创建测试库实例,用例间相互独立,此为默认情况;
创建测试库类:GTest.py
class GTest(object):
ROBOT_LIBRARY_SCOPE = "TEST CASE"
counter = 0
def __init__(self):
GTest.counter += 1
def count(self):
return self.counter, id(self)
创建测试套件login.robot:
*** Settings ***
Documentation Suite description
Library GTest.py *** Test Cases ***
Test title
[Tags] DEBUG
@{res} count
log many @{res} Test title2
[Tags] DEBUG
@{res} count
log many @{res}

从用例的执行结果来看,每个使用GTest库的测试用例运行时,counter值加1,且实例id各不相同,所以SCOPE为"TEST CASE"的测试库会为每个测试用例创建实例,这种配置更适用于严格控制用例间相互影响的场景;
2.TEST SUITE:为每个测试套件创建测试库实例,该测试套件内的所有用例共享这个库实例
修改测试库类GTest.py, 将ROBOT_LIBRARY_SCOPE值替换为"TEST SUITE"
class GTest(object):
ROBOT_LIBRARY_SCOPE = "TEST SUITE"
counter = 0
def __init__(self):
GTest.counter += 1
def count(self):
return self.counter, id(self)
新增测试套件login2.robot
*** Settings ***
Documentation Suite description
Library GTest.py *** Test Cases ***
Test title
[Tags] DEBUG
@{res} count
log many @{res} Test title2
[Tags] DEBUG
@{res} count
log many @{res}
运行测试套件login.robot和login2.robot

从以上测试结果来看,图1中,同一测试套件内所有测试用例获取到的GTest实例相同;图2中,不同测试套件获取到的GTest实例不同,因此SCOPE设置为"TEST SUITE"时,会为每个测试套件创建一个测试库实例;
3.GLOBAL:整个测试过程中只创建一个测试库实例,所有测试套件、测试用例共享同一个测试库实例
修改测试库GTest.py,将ROBOT_LIBRARY_SCOPE修改为"GLOBAL"
class GTest(object):
ROBOT_LIBRARY_SCOPE = "GLOBAL"
counter = 0
def __init__(self):
GTest.counter += 1
def count(self):
return self.counter, id(self)
运行测试套件login.robot和login2.robot
从用例运行结果来看,测试套件login.robot和login2.robot所用GTest的同一个实例,且只有一个。因此SCOPE设置为"GLOBAL"后,整个测试过程中只生成一个测试库实例。所有套件、测试用例共享这个测试库实例;
robot官网中说明,如果同一个测试库被多次以不同参数导入,则不管ROBOT_LIBRARY_SCOPE是否定义,每个测试套件会创建一个新的实例
创建测试库GTest.py, ROBOT_LIBRARY_SCOPE定义为"GLOBAL"
class GTest(object):
ROBOT_LIBRARY_SCOPE = "GLOBAL"
counter = 0
def __init__(self, *args):
self.args = args
GTest.counter += 1
def count(self):
return self.counter, id(self)
创建测试套件login.robot
*** Settings ***
Documentation Suite description
Library GTest.py suite1 login1 *** Test Cases ***
Test title
[Tags] DEBUG
@{res} count
log many @{res} Test title2
[Tags] DEBUG
@{res} count
log many @{res}
创建测试套件login2.robot
*** Settings ***
Documentation Suite description
Library GTest.py login2 suite2 *** Test Cases ***
Test title
[Tags] DEBUG
@{res} count
log many @{res} Test title2
[Tags] DEBUG
@{res} count
log many @{res}


从测试用例运行结果来看,虽然将作用域定义成了全局的,但是由于在不同测试套件中以不同参数导入,所以用例执行过程中为不同的测试套件生成了不同的实例。
Robot Framework自定义测试库的作用域的理解的更多相关文章
- Robot Framework - 3 - 测试库API
08- 创建测试库--发布测试库 ***** 测试库文档 为了便于维护,测试库文档应该从源代码中生成. Robot Framework 有自己的文档工具 libdoc.py生成 API 文档. 一个 ...
- robot framework自定义python库
自定义python库的好处: robot framework填表式,将python的灵活性弄没了,但是不要担心,RF早就想到了解决办法,就是扩充自己的库. 1.在python应用程序包目录下创建一个新 ...
- RF框架自定义测试库开发
静态库 方法(methods)直接映射为关键字名称.关键字接受和方法相同的参数, 通过抛异常来 报告错误, 通过往标准输出里写入来写 log, 同时可以通过return 来返回结果. 创建步骤: ▲ ...
- Robot Framework 自动化测试 Selenium2Library 库 用法
Robot Framework自动化测试Selenium2Library库详细用法 一.浏览器驱动 通过不同的浏览器执行脚本. Open Browser Htpp://www.xxx.com ...
- Robot Framework: 自定义自己的python库
利用Robot Framework编写测试用例,往往需要开发自己的关键字,有的关键字需要通过自己编写python代码来实现.这在rf中,就需要自己定义python库.这个过程其实不复杂,本文来介绍下. ...
- 使用远程接口库进一步扩展Robot Framework的测试能力
引言: Robot Framework的四层结构已经极大的提高了它的扩展性.我们可以使用它丰富的扩展库来完成大部分测试工作.可是碰到下面两种情况,仅靠四层结构就不好使了: 1.有些复杂的测试可能跨越多 ...
- Robot Framework(Databaselibrary库操作)
1.安装 DatabaseLibrary 库 DatabaseLibrary 下载地址:https://pypi.python.org/pypi/robotframework-databaselibr ...
- Robot Framework(Collections 库)
Collections 库 Collections 库同样为Robot Framework 标准类库,它所提供的关键字主要用于列表.索引.字典的处理. 在使用之前需要在测试套件(项目)中添加:
- Robot Framework自动化测试Selenium2Library库详细用法
一.浏览器驱动 通过不同的浏览器执行脚本. Open Browser Htpp://www.xxx.com chrome 浏览器对应的关键字: firefox FireFox ff internete ...
随机推荐
- Zabbix-3.4快速安装
过多的介绍不写了,本篇文章主要是快速安装下zabbix服务,如果不知道zabbix监控原理,可以先去了解下. 用的是Centos7.2系统安装的zabbix-3.4 1.下载Zabbix-releas ...
- js数组的五种迭代遍历方式 every filter forEach map some
ECMAScript 5 为数组定义了 5 个迭代方法. 每个方法都接收两个参数 数组项的值和索引 every():对数组中的每一项运行给定函数,如果该函数对每一项都返回 true,则返回 tru ...
- MSIL实用指南-类相关生成
一.创建class用MethodBuilder的DefineType方法,可以指定父类,得到一个TypeBuilder对象. 二.实现继承接口用TypeBuilder的AddInterfaceImpl ...
- 基于Taro与typescript开发的网易云音乐小程序(持续更新)
基于Taro与网易云音乐api开发,技术栈主要是:typescript+taro+taro-ui+redux,目前主要是着重小程序端的展示,主要也是借此项目强化下上述几个技术栈的使用,通过这个项目也可 ...
- 「每日五分钟,玩转JVM」:对象从哪来
面向对象 众所周知,Java是一门面向对象的高级编程语言,那么现在问题来了,对象从哪来呢?有些人会说通过new关键字来创建一个对象,说的很好,本篇我们就来解密在new一个对象的过程中,JVM都给我们做 ...
- JMeter特点&性能测试工具选型的原则&模拟压力的原理
1.JMeter自身的特点 1)开源.轻量级.更适合自动化和持续集成(100M左右,LoadRunner 4G左右) 2)学习难度大 3)资料少.全英文 2. 性能测试工具选型的原则 1)成本 a.工 ...
- BZOJ-2535 航空管制 toposort
题目传送门 题解: 如果正着连边,可以发现最困难的点是ti不好处理. 所以我们连反边,然后将ti转换成前面有n-ti+1架飞机起飞了作为限制条件. 对于第一问,直接toposort 然后反着输出求出的 ...
- codeforces 822 D. My pretty girl Noora(dp+素数筛)
题目链接:http://codeforces.com/contest/822/problem/D 题解:做这题首先要推倒一下f(x)假设第各个阶段分成d1,d2,d3...di组取任意一组来说,如果第 ...
- DELPHI GDI + TGPFont UnitPixel 问题解决
查不少资料,在 GPfont := TGPFont.Create(fontFamily, Font.Size , FontStyleRegular,UnitPixel ); 时,显示的字体,并不是按D ...
- 【Offer】[58-1] 【翻转单词顺序】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字母样处理.例如输入字符串"I am ...