上一篇里写的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()
运行结果如下: