httprunner 3.x學習10 - parameters 參數化


前言

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: testcases\login_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: testcases\login_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: testcases\login_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里面參數化疊加效果是一樣的


免責聲明!

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



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