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自定义测试库的作用域的理解的更多相关文章

  1. Robot Framework - 3 - 测试库API

    08- 创建测试库--发布测试库 ***** 测试库文档 为了便于维护,测试库文档应该从源代码中生成. Robot  Framework 有自己的文档工具 libdoc.py生成 API 文档. 一个 ...

  2. robot framework自定义python库

    自定义python库的好处: robot framework填表式,将python的灵活性弄没了,但是不要担心,RF早就想到了解决办法,就是扩充自己的库. 1.在python应用程序包目录下创建一个新 ...

  3. RF框架自定义测试库开发

    静态库 方法(methods)直接映射为关键字名称.关键字接受和方法相同的参数, 通过抛异常来 报告错误, 通过往标准输出里写入来写 log, 同时可以通过return 来返回结果. 创建步骤: ▲ ...

  4. Robot Framework 自动化测试 Selenium2Library 库 用法

    Robot Framework自动化测试Selenium2Library库详细用法 一.浏览器驱动   通过不同的浏览器执行脚本.   Open Browser Htpp://www.xxx.com ...

  5. Robot Framework: 自定义自己的python库

    利用Robot Framework编写测试用例,往往需要开发自己的关键字,有的关键字需要通过自己编写python代码来实现.这在rf中,就需要自己定义python库.这个过程其实不复杂,本文来介绍下. ...

  6. 使用远程接口库进一步扩展Robot Framework的测试能力

    引言: Robot Framework的四层结构已经极大的提高了它的扩展性.我们可以使用它丰富的扩展库来完成大部分测试工作.可是碰到下面两种情况,仅靠四层结构就不好使了: 1.有些复杂的测试可能跨越多 ...

  7. Robot Framework(Databaselibrary库操作)

    1.安装 DatabaseLibrary 库 DatabaseLibrary 下载地址:https://pypi.python.org/pypi/robotframework-databaselibr ...

  8. Robot Framework(Collections 库)

    Collections 库 Collections 库同样为Robot Framework 标准类库,它所提供的关键字主要用于列表.索引.字典的处理. 在使用之前需要在测试套件(项目)中添加:

  9. Robot Framework自动化测试Selenium2Library库详细用法

    一.浏览器驱动 通过不同的浏览器执行脚本. Open Browser Htpp://www.xxx.com chrome 浏览器对应的关键字: firefox FireFox ff internete ...

随机推荐

  1. Python 基础1 - 位运算符

    引言 本文主要介绍位运算符,实际上Python有以下7类运算符: [赋值运算符].[比较运算符].[算术运算符].[逻辑运算符].[身份运算符].[成员运算符].[位运算符] 位运算符 按位运算符是把 ...

  2. Mac添加中国法定节假日安排

    最近中秋.国庆临近,当大家开始抢票才反应过来,原来假日已然临近,打开mac日历,发现并没有标注节假日安排,发现了这篇文章,写了这篇读后感. 上面的文章介绍使用了两种在苹果系列设备设置中国节假日的方式: ...

  3. Delphi - 通过WinAPI WinExec直接调用系统工具

    看如下代码: WinExec('mspaint.exe', SW_SHOWNORMAL); // SW_SHOWNORMAL = 1 系统画图 WinExec('write.exe', SW_SHOW ...

  4. Java之封装,继承,多态

    一,前言 ​ 今天总结一下关于Java的三大特性,封装,继承,多态.其实关于三大特性对于从事编程人员来说都是基本的了,毕竟只要接触Java这些都是先要认识的,接下来就系统总结一下. 二,封装 ​ 先来 ...

  5. [python]python中的if, while, for

    python中的代码块,通过缩进对齐,来表达代码逻辑. 1. if语句 if expression1: if_suite elif expression2: elif_suite else: else ...

  6. 洛谷P1246编码问题-排列组合,分类讨论

    编码问题 题意就是a,b,c.....ab.....编码,给你一个字符串,输出这是第几个: 这里可以用暴力枚举,但也可以用组合数学的高超知识: 既然这样我就说一下排列组合的方法,如果要弄一个 各位数字 ...

  7. codeforces E. Mahmoud and Ehab and the function(二分+思维)

    题目链接:http://codeforces.com/contest/862/problem/E 题解:水题显然利用前缀和考虑一下然后就是二分b的和与-ans_a最近的数(ans_a表示a的前缀和(奇 ...

  8. HDU - 3966 树链刨分

    题目传送门 操作就是询问某个点的值, 然后就是对一条路径上的值全部修改. 最基本的树刨题目了. 树刨的思想: 1. 对于每个点找到他的重儿子. void dfs1(int o, int u){ sz[ ...

  9. codeforces 822 D. My pretty girl Noora(dp+素数筛)

    题目链接:http://codeforces.com/contest/822/problem/D 题解:做这题首先要推倒一下f(x)假设第各个阶段分成d1,d2,d3...di组取任意一组来说,如果第 ...

  10. Pytorch读取,加载图像数据(一)

    在学习Pytorch的时候,先学会如何正确创建或者加载数据,至关重要. 有了数据,很多函数,操作的效果就变得很直观. 本文主要用其他库读取图像文件(学会这个,你就可以在之后的学习中,将一些效果直观化) ...