zoukankan      html  css  js  c++  java
  • Robot Framework自定义测试库的作用域的理解

      robot framework中,强大的测试库api支持,用户可根据实际需求定义测试库,导入后可使用自定义库中相应的关键字。

      当自定义的测试库是类库,则需要考虑一个问题:类实例。用类实现的库可以有内部状态, 这些状态可以被关键字或构造函数修改. 因为这些状态会影响到关键字实际的行为, 所以, 保证一个测试用例不会意外地影响到另一个用例显得非常重要. 这种依赖行为有可能造成非常难定位的bug。例如, 添加了新的测试用例, 而这些用例使用库的方式并不一致。

      Robot Framework 为了保证测试用例之间的独立性, 默认情况下, 它为每个测试用例创建新的测试库实例. 然而, 这种方式不总是我们想要的, 比如有时测试用例需要共享某个状态的时候. 此外, 那些无状态的库显然也不需要每次都创建新实例。实例化测试库类的方式可以通过属性ROBOT_LIBRARY_SCOPE定义的三个作用域来控制

      1.TEST CASE:为每个测试用例创建测试库实例,用例间相互独立,此为默认情况;

      创建测试库类:GTest.py

     1 class GTest(object):
     2 
     3     ROBOT_LIBRARY_SCOPE = "TEST CASE"
     4     counter = 0
     5 
     6     def __init__(self):
     7         GTest.counter += 1
     8 
     9     def count(self):
    10         return self.counter, id(self)
    View Code

       创建测试套件login.robot:

     1 *** Settings ***
     2 Documentation     Suite description
     3 Library           GTest.py
     4 
     5 *** Test Cases ***
     6 Test title
     7     [Tags]    DEBUG
     8     @{res}   count
     9     log many    @{res}
    10 
    11 Test title2
    12     [Tags]      DEBUG
    13     @{res}   count
    14     log many    @{res}
    View Code

     从用例的执行结果来看,每个使用GTest库的测试用例运行时,counter值加1,且实例id各不相同,所以SCOPE为"TEST CASE"的测试库会为每个测试用例创建实例,这种配置更适用于严格控制用例间相互影响的场景;

      2.TEST SUITE:为每个测试套件创建测试库实例,该测试套件内的所有用例共享这个库实例

      修改测试库类GTest.py, 将ROBOT_LIBRARY_SCOPE值替换为"TEST SUITE"

     1 class GTest(object):
     2 
     3     ROBOT_LIBRARY_SCOPE = "TEST SUITE"
     4     counter = 0
     5 
     6     def __init__(self):
     7         GTest.counter += 1
     8 
     9     def count(self):
    10         return self.counter, id(self)
    View Code

      新增测试套件login2.robot

     1 *** Settings ***
     2 Documentation     Suite description
     3 Library           GTest.py
     4 
     5 *** Test Cases ***
     6 Test title
     7     [Tags]    DEBUG
     8     @{res}   count
     9     log many    @{res}
    10 
    11 Test title2
    12     [Tags]      DEBUG
    13     @{res}   count
    14     log many    @{res}
    View Code

      运行测试套件login.robot和login2.robot

     从以上测试结果来看,图1中,同一测试套件内所有测试用例获取到的GTest实例相同;图2中,不同测试套件获取到的GTest实例不同,因此SCOPE设置为"TEST SUITE"时,会为每个测试套件创建一个测试库实例;

      3.GLOBAL:整个测试过程中只创建一个测试库实例,所有测试套件、测试用例共享同一个测试库实例

      修改测试库GTest.py,将ROBOT_LIBRARY_SCOPE修改为"GLOBAL"

     1 class GTest(object):
     2 
     3     ROBOT_LIBRARY_SCOPE = "GLOBAL"
     4     counter = 0
     5 
     6     def __init__(self):
     7         GTest.counter += 1
     8 
     9     def count(self):
    10         return self.counter, id(self)
    View Code

      运行测试套件login.robot和login2.robot

     从用例运行结果来看,测试套件login.robot和login2.robot所用GTest的同一个实例,且只有一个。因此SCOPE设置为"GLOBAL"后,整个测试过程中只生成一个测试库实例。所有套件、测试用例共享这个测试库实例;

      robot官网中说明,如果同一个测试库被多次以不同参数导入,则不管ROBOT_LIBRARY_SCOPE是否定义,每个测试套件会创建一个新的实例

      创建测试库GTest.py,  ROBOT_LIBRARY_SCOPE定义为"GLOBAL"

     1 class GTest(object):
     2 
     3     ROBOT_LIBRARY_SCOPE = "GLOBAL"
     4     counter = 0
     5 
     6     def __init__(self, *args):
     7         self.args = args
     8         GTest.counter += 1
     9 
    10     def count(self):
    11         return self.counter, id(self)
    View Code

      创建测试套件login.robot

     1 *** Settings ***
     2 Documentation     Suite description
     3 Library           GTest.py      suite1      login1
     4 
     5 *** Test Cases ***
     6 Test title
     7     [Tags]    DEBUG
     8     @{res}   count
     9     log many    @{res}
    10 
    11 Test title2
    12     [Tags]      DEBUG
    13     @{res}   count
    14     log many    @{res}
    View Code

      创建测试套件login2.robot

     1 *** Settings ***
     2 Documentation     Suite description
     3 Library           GTest.py      login2      suite2
     4 
     5 *** Test Cases ***
     6 Test title
     7     [Tags]    DEBUG
     8     @{res}   count
     9     log many    @{res}
    10 
    11 Test title2
    12     [Tags]      DEBUG
    13     @{res}   count
    14     log many    @{res}
    View Code

    从测试用例运行结果来看,虽然将作用域定义成了全局的,但是由于在不同测试套件中以不同参数导入,所以用例执行过程中为不同的测试套件生成了不同的实例。

    出来混,迟早是要还的...
  • 相关阅读:
    测试我的第一个随笔
    ORB-SLAM2初步
    STL map 简介
    day4-内置函数
    Python学习之路day4-函数高级特性、装饰器
    Python学习之路day3-函数
    Python学习之路day3-字符编码与转码
    Python学习之路day3-文件操作
    Python学习之路day3-集合
    Python学习之路【第二篇】-pyc简介、Python常用的数据类型及其用法和常用运算符
  • 原文地址:https://www.cnblogs.com/blackeyes1023/p/11613463.html
Copyright © 2011-2022 走看看