zoukankan      html  css  js  c++  java
  • httprunner 3.x学习10

    前言

    httprunner 3.x可以在yaml文件中参数化,在 config 中使用 parameters 关键字
    环境:httprunner==3.1.4

    参数配置

    参数名称的定义分为两种情况:

    • 独立参数单独进行定义;
    • 多个参数具有关联性的参数需要将其定义在一起,采用短横线(-)进行连接。

    数据源指定支持三种方式:

    • 在 YAML/JSON/py 中直接指定参数列表:该种方式最为简单易用,适合参数列表比较小的情况
    • 通过内置的 parameterize(可简写为P)函数引用 CSV 文件:该种方式需要准备 CSV 数据文件,适合数据量比较大的情况
    • 调用 debugtalk.py 中自定义的函数生成参数列表:该种方式最为灵活,可通过自定义 Python 函数实现任意场景的数据驱动机制,当需要动态生成参数列表时也需要选择该种方式

    三种方式可根据实际项目需求进行灵活选择,同时支持多种方式的组合使用。
    假如测试用例中定义了多个参数,那么测试用例在运行时会对参数进行笛卡尔积组合,覆盖所有参数组合情况。

    单个参数时参数化

    先准备测试数据,准备四组登录用的账号和密码,账号为test1,test2,test3,test4,密码统一设置为123456。

    参数user账号数据,设置对应的值 ["test1", "test2", "test3", "test4"],定义单个参数用variables,定义参数化用parameters

    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    config:
        name: login case
        base_url: ${ENV(base_url)}
        variables:
            user: test
            password: 123456
        parameters:
            user: [test1, test2, test3, test4]
    

    如果参数化里面的数据只有一个,比如psw对应的值只有一个,parameters 也可以设置 password的值

    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    config:
        name: login case
        base_url: ${ENV(base_url)}
        variables:
            user: test
            password: 123456
        parameters:
            user: [test1, test2, test3, test4]
            password: 123456
    

    variables 和 parameters 设置相同名称变量时,parameters 优先级大于variables
    完整的 login_params.yml 脚本如下

    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    config:
        name: login case
        base_url: ${ENV(base_url)}
        variables:
            user: test
            password: 123456
        parameters:
            user: [test1, test2, test3, test4]
    
    teststeps:
    -
        name: step login
        variables:
                password: 123456
        request:
            url: /api/v1/login
            method: POST
            json:
                username: $user
                password: $password
        validate:
            - eq: [status_code, 200]
            - eq: [content.code, 0]
            - eq: [content.msg, login success!]
            - len_eq: [content.token, 40]
    

    运行用例,会自动生成四个测试用例

    pytest 脚本

    # NOTE: Generated By HttpRunner v3.1.4
    # FROM: testcaseslogin_params.yml
    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    import pytest
    from httprunner import Parameters
    
    
    from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase
    
    
    class TestCaseLoginParams(HttpRunner):
        @pytest.mark.parametrize(
            "param", Parameters({"user": ["test1", "test2", "test3", "test4"]})
        )
        def test_start(self, param):
            super().test_start(param)
    
        config = (
            Config("login case")
            .variables(**{"user": "test", "password": 123456})
            .base_url("${ENV(base_url)}")
        )
    
        teststeps = [
            Step(
                RunRequest("step login")
                .with_variables(**{"password": 123456})
                .post("/api/v1/login")
                .with_json({"username": "$user", "password": "$password"})
                .validate()
                .assert_equal("status_code", 200)
                .assert_equal("body.code", 0)
                .assert_equal("body.msg", "login success!")
                .assert_length_equal("body.token", 40)
            ),
        ]
    
    
    if __name__ == "__main__":
        TestCaseLoginParams().test_start()
    
    

    关联性的参数化

    上面的案例多个账号,密码都是一样的,如果密码不一样呢?上面的就行不通了,所以针对于一个账号对应一个密码,这种一一对应的关系,可以用关联性的参数化

    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    config:
        name: login case
        base_url: ${ENV(base_url)}
        parameters:
            user-password:
            - [test1, "123456"]
            - [test2, "123456"]
            - [test3, "123456"]
            - [test4, "123456"]
    
    teststeps:
    -
        name: step login
        request:
            url: /api/v1/login
            method: POST
            json:
                username: $user
                password: $password
        validate:
            - eq: [status_code, 200]
            - eq: [content.code, 0]
            - eq: [content.msg, login success!]
            - len_eq: [content.token, 40]
    

    对应pytest脚本

    # NOTE: Generated By HttpRunner v3.1.4
    # FROM: testcaseslogin_params2.yml
    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    import pytest
    from httprunner import Parameters
    
    
    from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase
    
    
    class TestCaseLoginParams2(HttpRunner):
        @pytest.mark.parametrize(
            "param",
            Parameters(
                {
                    "user-password": [
                        ["test1", "123456"],
                        ["test2", "123456"],
                        ["test3", "123456"],
                        ["test4", "123456"],
                    ]
                }
            ),
        )
        def test_start(self, param):
            super().test_start(param)
    
        config = Config("login case").base_url("${ENV(base_url)}")
    
        teststeps = [
            Step(
                RunRequest("step login")
                .post("/api/v1/login")
                .with_json({"username": "$user", "password": "$password"})
                .validate()
                .assert_equal("status_code", 200)
                .assert_equal("body.code", 0)
                .assert_equal("body.msg", "login success!")
                .assert_length_equal("body.token", 40)
            ),
        ]
    
    
    if __name__ == "__main__":
        TestCaseLoginParams2().test_start()
    
    

    笛卡尔积组合

    比如测试账号有四种["test1", "test2", "test3", "test4"],密码也有四种 ["123456", "123456", "123456", "123456"]
    用笛卡尔积组合的话,就是4*4=16种组合

    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    config:
        name: login case
        base_url: ${ENV(base_url)}
        parameters:
            user: [test1, test2, test3, test4]
            password: ["123456", "123456", "123456", "123456"]
    
    teststeps:
    -
        name: step login
        variables:
                password: 123456
        request:
            url: /api/v1/login
            method: POST
            json:
                username: $user
                password: $password
        validate:
            - eq: [status_code, 200]
            - eq: [content.code, 0]
            - eq: [content.msg, login success!]
            - len_eq: [content.token, 40]
    

    这样运行会生成16组用例,对应pytest脚本

    # NOTE: Generated By HttpRunner v3.1.4
    # FROM: testcaseslogin_params3.yml
    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    import pytest
    from httprunner import Parameters
    
    
    from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase
    
    
    class TestCaseLoginParams3(HttpRunner):
        @pytest.mark.parametrize(
            "param",
            Parameters(
                {
                    "user": ["test1", "test2", "test3", "test4"],
                    "password": ["123456", "123456", "123456", "123456"],
                }
            ),
        )
        def test_start(self, param):
            super().test_start(param)
    
        config = Config("login case").base_url("${ENV(base_url)}")
    
        teststeps = [
            Step(
                RunRequest("step login")
                .with_variables(**{"password": 123456})
                .post("/api/v1/login")
                .with_json({"username": "$user", "password": "$password"})
                .validate()
                .assert_equal("status_code", 200)
                .assert_equal("body.code", 0)
                .assert_equal("body.msg", "login success!")
                .assert_length_equal("body.token", 40)
            ),
        ]
    
    
    if __name__ == "__main__":
        TestCaseLoginParams3().test_start()
    

    这跟pytest里面参数化叠加效果是一样的

  • 相关阅读:
    PAT1001
    关于yahoo.com.cn邮箱导入Gmail邮箱验证异常的机制解析及解决办法
    浙大机试感受
    PAT1002
    mysql修改密码后无法登陆问题
    Windows 不能在 本地计算机 启动 OracleDBConsoleorcl
    Deprecated: Function ereg_replace() is deprecated
    PHP中静态方法(static)与非静态方法的使用及区别
    微信小程序开发,weui报“渲染层错误”的解决办法
    Android系统下载管理DownloadManager功能介绍及使用示例
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/14904674.html
Copyright © 2011-2022 走看看