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()
原文地址:https://www.cnblogs.com/yoyoketang/p/14906386.html