httprunner 3.x學習12 - 參數化(parameters)引用 debugtalk 函數


前言

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: testcases\params_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()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM