1. 程式人生 > 其它 >httprunner 3.x學習11 - 引數化(parameters)引用外部 csv 資料檔案

httprunner 3.x學習11 - 引數化(parameters)引用外部 csv 資料檔案

前言

httprunner 3.x引數化(parameters)資料來源支援三種方式:

  • 在 YAML/JSON/py 中直接指定引數列表:該種方式最為簡單易用,適合引數列表比較小的情況
  • 通過內建的 parameterize(可簡寫為P)函式引用 CSV 檔案:該種方式需要準備 CSV 資料檔案,適合資料量比較大的情況
  • 呼叫 debugtalk.py 中自定義的函式生成引數列表:該種方式最為靈活,可通過自定義 Python 函式實現任意場景的資料驅動機制,當需要動態生成引數列表時也需要選擇該種方式
    本篇講解內建的 parameterize(可簡寫為P)函式引用 CSV 檔案

獨立引數

對於已有引數列表,並且資料量比較大的情況,比較適合的方式是將引數列表值儲存在 CSV 資料檔案中。
對於 CSV 資料檔案,需要遵循如下幾項約定的規則:

  • CSV 檔案中的第一行必須為引數名稱,從第二行開始為引數值,每個(組)值佔一行;
  • 若同一個 CSV 檔案中具有多個引數,則引數名稱和數值的間隔符需實用英文逗號;
  • 在 YAML/JSON 檔案引用 CSV 檔案時,檔案路徑為基於專案根目錄(debugtalk.py 所在路徑)的相對路徑。

例如,user_id 的引數取值範圍為 1001~2000,那麼我們就可以建立 user_id.csv,並且在檔案中按照如下形式進行描述。

user_id
1001
1002
...
1999
2000

然後在 YAML/JSON 測試用例檔案中,就可以通過內建的 parameterize(可簡寫為 P)函式引用 CSV 檔案。

config:
    name: "demo"
    base_url: ${ENV(base_url)}
    parameters:
        user: ${P(data/user.csv)}

即 P 函式的引數(CSV 檔案路徑)是相對於專案根目錄的相對路徑。
當然,這裡也可以使用 CSV 檔案在系統中的絕對路徑,不過這樣的話在專案路徑變動時就會出現問題,因此推薦使用相對路徑的形式。

csv檔案存放user資料

先準備測試資料,準備四組登入用的賬號和密碼,賬號為test1,test2,test3,test4,密碼統一設定為123456。

data/user.csv檔案測試資料

user
test1
test2
test3
test4

testcases/params_csv.yml 檔案引用 data/user.csv 檔案語法${P(user.csv)}

# testcases/params_csv.yml
# 上海-悠悠,httprunner QQ交流群:717225969

config:
    name: login case
    base_url: ${ENV(base_url)}
    variables:
        user: test
        password: 123456
    parameters:
        user: ${P(data/user.csv)}

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_csv.yml


import pytest
from httprunner import Parameters


from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase


class TestCaseParamsCsv(HttpRunner):
    @pytest.mark.parametrize("param", 
                             Parameters({"user": "${P(data/user.csv)}"}))
    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")
            .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__":
    TestCaseParamsCsv().test_start()

csv存放user和psw資料

data/user_password.csv 檔案測試資料

user,password
test1,123456
test2,123456
test3,123456
test4,123456

testcases/params_csv2.yml 檔案引用 data/user_password.csv 檔案

# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/

config:
    name: login case
    base_url: ${ENV(base_url)}
    parameters:
        user-password: ${P(data/user_password.csv)}

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_csv2.yml
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/

import pytest
from httprunner import Parameters


from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase


class TestCaseParamsCsv2(HttpRunner):
    @pytest.mark.parametrize(
        "param", Parameters({"user-password": "${P(data/user_password.csv)}"})
    )
    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__":
    TestCaseParamsCsv2().test_start()

V3.x版本支援相對路徑,檔案路徑為基於專案根目錄(debugtalk.py 所在路徑)的相對路徑。如:data/user_id.csv