• RobotFramework测试框架(11)--变量文件


    Variable files包含的variables可以用于test data中(即测试用例)中。Variables可以使用Variables section或者从命令行设置。
    但是也允许动态创建。

    变量文件通常使用模块实现,有两种实现方式。

    1、直接从模块中获取变量

    变量被指定为模块的属性。在简单的情况下,语法是如此简单,以至于不需要真正的编程。例如,创建一个变量,其值为指定的文本。这种方法的一个限制是它不允许使用参数。

    MY_VAR = 'my value'
    
    • 1

    ${MY_VAR}

    2、从特殊函数获取变量

    变量文件可以有一个特殊的方法(例如 get_variablesgetVariables),它返回一个作为映射的变量。因为这个方法可以接收参数,所以这种方法非常灵活。

    另一种实现变量文件的方式是作为类,由框架来实例化这些类。在这种情况下,同样可以将变量创建为属性,或者从方法中动态获取它们。此外,变量文件也可以以YAML和JSON格式创建。例如,可以使用get_variables方法来获取这些变量。

    使用变量文件

    Setting section

    所有的测试用例文件,可以在Setting section中使用Variables setting来导入变量文件。

    *** Settings ***
    Variables    myvariables.py
    Variables    ../data/variables.py
    Variables    ${RESOURCES}/common.yaml
    
    • 1
    • 2
    • 3
    • 4

    命令行

    --variablefile myvariables.py
    --variablefile path/variables.py
    --variablefile /absolute/path/common.py
    --variablefile variablemodule
    --variablefile arguments.py:arg1:arg2
    --variablefile rootmodule.Variables:arg1:arg2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    Getting variables directly from a module

    基础语法

    VARIABLE = "An example string"
    ANOTHER_VARIABLE = "This is pretty easy!"
    INTEGER = 42
    STRINGS = ["one", "two", "kolme", "four"]
    NUMBERS = [1, INTEGER, 3.14]
    MAPPING = {"one": 1, "two": 2, "three": 3}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    Using objects as values

    变量文件中的变量不仅限于只包含字符串或其他基本类型作为值,就像变量部分一样。相反,它们的变量可以包含任何对象。在下面的示例中,变量包含一个Python字典,并且还有两个从同一文件中实现的自定义对象创建的变量。

    MAPPING = {'one': 1, 'two': 2}
    
    class MyObject:
        def __init__(self, name):
            self.name = name
    
    OBJ1 = MyObject('John')
    OBJ2 = MyObject('Jane')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    Creating variables dynamically

    import os
    import random
    import time
    
    USER = os.getlogin()                # current login name
    RANDOM_INT = random.randint(0, 10)  # random integer in range [0,10]
    CURRENT_TIME = time.asctime()       # timestamp like 'Thu Apr  6 12:45:21 2006'
    if time.localtime()[3] > 12:
        AFTERNOON = True
    else:
        AFTERNOON = False
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    Selecting which variables to include

    当Robot Framework处理变量文件时,它期望所有不以下划线开头的属性都是变量。这意味着在变量文件中创建或从其他地方导入的函数或类也被视为变量。例如,在之前的示例中,除了MY_DICT、MY_PERSON、MY_INT、MY_FLOAT和MY_LIST这些变量之外,如果变量文件中还定义了math函数或get_area函数,以及AREA1和AREA2变量,它们也会被当作变量处理。

    通常,这些额外的变量不会造成问题,但它们可能会覆盖其他变量,导致难以调试的错误。为了避免这种情况,一种可能的做法是给不想作为变量的属性加上下划线前缀。这样,Robot Framework就会忽略这些以下划线开头的属性,不会将它们当作变量来处理。

    import math as _math
    
    def _get_area(diameter):
        radius = diameter / 2.0
        area = _math.pi * radius * radius
        return area
    
    AREA1 = _get_area(1)
    AREA2 = _get_area(2)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    Getting variables from a special function

    另一种获取变量的方法是在变量文件中定义一个特殊函数(也可以使用驼峰命名法)。如果这样的函数存在,Robot Framework会调用它,并期望它返回一个Python字典,其中键是变量名,值是变量值。创建的变量可以像直接从模块中获取变量一样,作为标量、列表和字典使用。此外,还可以使用LIST__和DICT__前缀来更明确地创建列表和字典变量。下面的示例在功能上等同于第一个直接从模块获取变量的示例。

    def get_variables():
        variables = {"VARIABLE ": "An example string",
                     "ANOTHER VARIABLE": "This is pretty easy!",
                     "INTEGER": 42,
                     "STRINGS": ["one", "two", "kolme", "four"],
                     "NUMBERS": [1, 42, 3.14],
                     "MAPPING": {"one": 1, "two": 2, "three": 3}}
        return variables
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    get_variables 函数也可以接受参数,这有助于改变实际创建的变量。函数的参数就像任何 Python 函数的参数一样设置。当使用变量文件时,参数在变量文件路径之后指定,在命令行中它们用冒号或分号与路径分隔。

    以下是一个简单的示例,展示了如何使用带参数的变量文件。在一个更实际的例子中,参数可能是指向外部文本文件或数据库的路径,从中读取变量。

    variables1 = {'scalar': 'Scalar variable',
                  'LIST__list': ['List','variable']}
    variables2 = {'scalar' : 'Some other value',
                  'LIST__list': ['Some','other','value'],
                  'extra': 'variables1 does not have this at all'}
    
    def get_variables(arg):
        if arg == 'one':
            return variables1
        else:
            return variables2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    Implementing variable file as a class

    变量文件总是使用文件系统路径来导入,因此类必须与它所在的模块具有相同的名称。

    框架将使用无参数的方式创建类的一个实例,并从该实例中获取变量。与模块类似,变量可以直接定义为实例的属性,或者从特殊方法 get_variables 中获取。

    当变量直接在实例中定义时,所有包含可调用值的属性都会被忽略,以避免从实例可能具有的方法中创建变量。如果你确实需要可调用的变量,你需要使用其他方法来创建变量文件。

    在实践中,这意味着如果你的变量文件名为 example_variables.py,那么它应该包含一个名为 ExampleVariables 的类。当 Robot Framework 导入这个变量文件时,它会创建一个 ExampleVariables 类的实例,并从该实例中读取变量。

    如果你选择使用 get_variables 方法来返回变量字典,你可以在该方法内定义任何逻辑来生成变量,包括读取外部文件、查询数据库或执行其他计算。然而,直接在类实例中定义变量通常更简单直接,但需要注意避免将方法作为变量暴露出来。

    以下是一个简单的例子,展示了如何在变量文件的类实例中直接定义变量

    The first examples create variables from attributes. It creates variables and from class attributes and from an instance attribute. V A R I A B L E @ L I S T {VARIABLE}@{LIST} VARIABLE@LIST{ANOTHER VARIABLE}

    class StaticExample:
        variable = 'value'
        LIST__list = [1, 2, 3]
        _not_variable = 'starts with an underscore'
    
        def __init__(self):
            self.another_variable = 'another value'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    The second examples utilizes dynamic approach for getting variables. It creates only one variable .${DYNAMIC VARIABLE}

    class DynamicExample:
    
        def get_variables(self, *args):
            return {'dynamic variable': ' '.join(args)}
    
    • 1
    • 2
    • 3
    • 4

    Variable file as YAML

    string:   Hello, world!
    integer:  42
    list:
      - one
      - two
    dict:
      one: yksi
      two: kaksi
      with spaces: kolme
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    *** Variables ***
    ${STRING}     Hello, world!
    ${INTEGER}    ${42}
    @{LIST}       one         two
    &{DICT}       one=yksi    two=kaksi    with spaces=kolme
    
    • 1
    • 2
    • 3
    • 4
    • 5

    Variable file as JSON

    变量文件也可以实现为 JSON 文件。与上一节讨论的 YAML 类似,JSON 是一种数据序列化格式,旨在供人类和机器使用。它基于 JavaScript 语法,虽然不如 YAML 那么易于人类阅读,但仍然相对容易理解和修改。以下示例包含与前面 YAML 示例完全相同的数据:

    {
        "string": "Hello, world!",
        "integer": 42,
        "list": [
            "one",
            "two"
        ],
        "dict": {
            "one": "yksi",
            "two": "kaksi",
            "with spaces": "kolme"
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    JSON 变量文件因其 .json 扩展名而自动被识别,并且它们可以像 YAML 变量文件一样使用。它们在结构、编码等方面的要求也完全相同。与 YAML 不同,Python 内置了对 JSON 的支持,因此无需安装任何额外的模块。

    使用 JSON 变量文件时,你只需创建一个包含所需变量的 JSON 对象,并确保该文件具有 .json 扩展名。然后,在 Robot Framework 的命令行中指定该文件的路径,Robot Framework 将自动加载该文件,并将 JSON 对象中的键值对解析为可在测试用例中使用的变量。

    例如,假设你有一个名为 variables.json 的 JSON 变量文件,内容如下:

    {
        "USERNAME": "robot_user",
        "PASSWORD": "secret_password",
        "SERVER": "http://example.com"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    你可以通过以下命令在 Robot Framework 中使用它:

    robot --variablefile variables.json my_test_suite.robot
    
    • 1

    my_test_suite.robot 测试用例中,你可以直接使用 ${USERNAME}${PASSWORD}${SERVER} 这些变量。

    由于 JSON 是一种广泛使用的数据交换格式,它非常适合用于在不同系统和工具之间传递变量。同时,由于其简单性和明确性,JSON 文件也更容易被非开发人员阅读和编辑。然而,如果你需要更复杂的逻辑或动态生成变量,Python 变量文件可能更加合适。

  • 相关阅读:
    Dubbo 3 StateRouter:下一代微服务高效流量路由
    建设数字经济引领型城市 CDEC2022中国数字智能生态大会广州举行
    【光通信】常见光模块与光纤收发器说明及作用区别
    【无代码爬虫】web scraper 之 采集多个内容
    一文详解Jenkins教程以及Jenkins中的CI/CD自动化部署机制
    基于蒲公英优化算法的函数寻优算法
    JAVA计算机毕业设计德云社剧场网上售票系统Mybatis+系统+数据库+调试部署
    基于java的康泰小区物业管理系统的设计与实现毕业设计源码101926
    el-table筛选数据
    ChatGPT研究报告:AIGC带来新一轮范式转移
  • 原文地址:https://blog.csdn.net/seanyang_/article/details/137410326