• httprunner 3.x学习12


    前言

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

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

    本篇讲解调用 debugtalk.py 中自定义的函数生成参数列表,生成的参数列表必须为 list of dict 的数据结构。

    单个参数

    需对 user_id 进行参数化数据驱动,参数取值范围为 1001~1004,那么就可以在 debugtalk.py 中定义一个函数,返回参数列表。

    def get_user_id():
        return [
            {"user_id": 1001},
            {"user_id": 1002},
            {"user_id": 1003},
            {"user_id": 1004}
        ]
    

    然后,在 YAML/JSON 的 parameters 中就可以通过调用自定义函数的形式来指定数据源。

    config:
        name: "demo"
        base_url: ${ENV(base_url)}
        parameters:
            user_id: ${get_user_id()}
    

    另外,通过函数的传参机制,还可以实现更灵活的参数生成功能,在调用函数时指定需要生成的参数个数。

    引用自定义函数

    对于具有关联性的多个参数,实现方式也类似。

    例如,在 debugtalk.py 中定义函数 get_account,生成指定数量的账号密码参数列表。

    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    def get_account(num):
        accounts = []
        for index in range(1, num+1):
            accounts.append(
                {"user": "test%s" % index, "password": "123456"},
            )
    
        return accounts
    

    那么在 YAML/JSON 的 parameters 中就可以调用自定义函数生成指定数量的参数列表。

    config:
        name: "demo"
        parameters:
            username-password: ${get_account(4)}
    
    testcases:
    -       
        name: login-参数化
    

    使用案例

    debugtalk.py 中定义 get_user_password 函数,返回 4 个用户名和密码数据。

    # debugtalk.py
    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    def get_account(num):
        accounts = []
        for index in range(1, num+1):
            accounts.append(
                {"user": "test%s" % index, "password": "123456"},
            )
        return accounts
    
    if __name__ == '__main__':
        print(get_account(4))
    

    生成 list of dict 数据格式

    [
    {'user': 'test1', 'password': '123456'}, 
    {'user': 'test2', 'password': '123456'}, 
    {'user': 'test3', 'password': '123456'}, 
    {'user': 'test4', 'password': '123456'}
    ]
    

    testcases/params_func.yml 文件内容

    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    config:
        name: login case
        base_url: ${ENV(base_url)}
        parameters:
            user-password: ${get_account(4)}
    
    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: testcasesparams_func.yml
    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    import pytest
    from httprunner import Parameters
    
    
    from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase
    
    
    class TestCaseParamsFunc(HttpRunner):
        @pytest.mark.parametrize(
            "param", Parameters({"user-password": "${get_account(4)}"})
        )
        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__":
        TestCaseParamsFunc().test_start()
    
  • 相关阅读:
    程序员父亲的遗产——编程十诫 转载
    如何跟程序员谈一场没有Bug的恋爱
    java集合(ArrayList,Vector,LinkedList,HashSet,TreeSet的功能详解)
    CentOS7.0下载各版本说明 新增Everything版
    Virtualbox虚拟机安装CentOS 6.5图文详细教程
    s:iterator数据累加示例代码
    关于程序员的59条搞笑但却真实无比的编程语录
    jQuery EasyUI API 中文文档
    Java发送带html标签内容的邮件
    javascript比较两个时间大小
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/14906386.html
Copyright © 2020-2023  润新知