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