上一篇里寫的httprunner 3.x--variables變量和聲明(變量和值一一對應) 中的variables是對 “一對一”的參數有用,
但對於變量需要多個數值,比如登錄賬號需要多個賬號密碼的,總不能一個賬號密碼寫一個測試用例,這時候就需要用到關鍵字parameters
參數化:多對多(多對一)
直接指定參數
csv導入(相對路徑,絕對路徑)
yml格式可用相對路徑,也可用絕對路徑
pytest只能用絕對路徑(用相對路徑會報錯,還沒找到解決辦法)
參數化:一多一
【參數化:多對多(多對一是一樣的)】
一 . 直接指定參數列表:
該種方式最為簡單易用,適合參數列表比較小的情況
【yml格式的測試用例】
config: name: "hz測試" parameters: uid: [1**97,1245] choujiang_id: [***,33] username: [**,mm] base_url: "https://lottery.hz.z****in.com" verify: False teststeps: - name: "接口test /lotteryTest.php" request: method: GET url: /lotteryTest.php params: uid: $uid choujiang_id: $choujiang_id username: $username validate: - eq : ["status_code", 200] - eq : ["body.status", 1]
其中打**的參數是正確,username是任意都行,所以上面的參數有8種組合
[1**97,***,**] [1**97,***,mm] [1**97,33,**] [1**97,33,mm]
[1245,***,**] [1234,***,mm] [1245,33,**] [1245,33,mm]
運行結果如下:
【pytest格式測試用例】
# NOTE: Generated By HttpRunner v3.1.3 # FROM: testcases/hetest_re.yml import pytest from httprunner import Parameters from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase class TestCaseHetestRe(HttpRunner): @pytest.mark.parametrize( "param", Parameters( {"uid": [1**7, 1245], "choujiang_id": [***, 33], "username": ["**", "mm"]} ), ) def test_start(self, param): super().test_start(param) config = ( Config("hz測試").base_url("https://lottery.hz.z*****in.com").verify(False) ) teststeps = [ Step( RunRequest("接口test /lotteryTest.php") .get("/lotteryTest.php") .with_params( **{ "uid": "$uid", "choujiang_id": "$choujiang_id", "username": "$username", } ) .validate() .assert_equal("status_code", 200) .assert_equal("body.status", 1) ), ] if __name__ == "__main__": TestCaseHetestRe().test_start()
然后用pytest方法運行
運行結果如下:
二 . csv導入
1.引用外部的csv文件,文件位置和debugtalk.py同一級別,即項目的根目錄(也可以在該目錄下指定相對路徑,比如data/*.csv) 2.一個csv只存放一個字段
3.csv文件里的字段名要和實際的一致
1)csv文件位置和debugtalk.py同一級別
同時在pycharm中能看到該csv文件
在 YAML/JSON 測試用例文件中,就可以通過內置的 parameterize(可簡寫為 P)函數引用 CSV 文件
引用csv文件語法${P(user_name.csv)}
【yml格式】
config: name: "hz測試" parameters: uid: ${parameterize(hzuid.csv)} choujiang_id: ${parameterize(hzcjid.csv)} username: [**,mm] base_url: "https://lottery.hz.z****n.com" verify: False
【pytest格式】
pytest格式運用csv文件時,csv要存放在和測試用例同一目錄下,要不然會報錯(或者用絕對路徑,下面會有介紹)
@pytest.mark.parametrize( "param", Parameters( { "uid": "${parameterize(hzuid.csv)}", "choujiang_id": "${parameterize(hzcjid.csv)}", "username": ["**", "mm"], } ), )
2)csv文件如果是相對路徑,情況如下:
【yml格式】
引用如下:
config: name: "hz測試" parameters: uid: ${parameterize(data/hzuid.csv)} choujiang_id: ${parameterize(data/hzcjid.csv)} username: [**,mm] base_url: "https://lottery.hz.z****in.com" verify: False
運行結果同樣正常!!!
【pytest格式】
pytest格式要用絕對路徑:
@pytest.mark.parametrize( "param", Parameters( { "uid": "${parameterize(/Users/may/Documents/automatortest/httprunner/testHttprunner/mayhttprunner/data/hzuid.csv)}", "choujiang_id": [***,125], "username": ["**", "mm"], } ), ) def test_start(self, param): super().test_start(param)
運行結果:
--------------------------------------------------------------------------
--------------------------------------------------------------------------
【參數化:一對一】
csv文件如下
要的目標是兩組參數
[1**7,***,**] [4353,33,mm]
把參數關聯起來,用 “- ”關聯
uid-choujiang_id-username: ${parameterize(data/hz1t1.csv)}
【yml格式】
config: name: "hz測試" parameters: uid-choujiang_id-username: ${parameterize(data/hz1t1.csv)} base_url: "https://lottery.hz.z****n.com" verify: False teststeps: - name: "接口test /lotteryTest.php" request: method: GET url: /lotteryTest.php params: uid: $uid choujiang_id: $choujiang_id username: $username validate: - eq : ["status_code", 200] - eq : ["body.status", 1]
運行結果:
兩組參數即兩個用例
【pytest格式】如下:(用絕對路徑)
# NOTE: Generated By HttpRunner v3.1.3 # FROM: testcases/hzoto.yml import pytest from httprunner import Parameters from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase class TestCaseHzoto(HttpRunner): @pytest.mark.parametrize( "param", Parameters({"uid-choujiang_id-username":
"${parameterize(/Users/may/Documents/automatortest/httprunner/testHttprunner/mayhttprunner/data/hz1t1.csv)}"}),
)
def test_start(self, param): super().test_start(param) config = ( Config("hz測試").base_url("https://lottery.hz.z****n.com").verify(False) ) teststeps = [ Step( RunRequest("接口test /lotteryTest.php") .get("/lotteryTest.php") .with_params( **{ "uid": "$uid", "choujiang_id": "$choujiang_id", "username": "$username", } ) .validate() .assert_equal("status_code", 200) .assert_equal("body.status", 1) ), ] if __name__ == "__main__": TestCaseHzoto().test_start()
運行結果如下: