參數(shù)化方式有三種,以下面的登錄接口為例
from httprunner import HttpRunner, Config, Step, RunRequest
class TestCaseLogin(HttpRunner):
config = Config('hrun3_demo').base_url('http://xxx:9090').export(*['vars_name'])
teststeps = [
Step(
RunRequest('login')
.post('/xxx/login.html')
.with_headers(**{'X-Requested-With': 'XMLHttpRequest'})
.with_data({'accounts':'ss','pwd':'123456'})
.extract()
.with_jmespath('body.msg','value_msg')
.validate()
.assert_equal('body.msg','登錄成功')
.assert_equal('body.code',0)
)
]
if __name__ == '__main__':
TestCaseLogin().test_start()
1.裝飾器
- 聲明:
在使用參數(shù)化之前,首先要導入pytest包,和httprunner的Parameters這個類
使用httprunner改造過的pytest參數(shù)化,通過parameters這個字段去引用
注意:需結(jié)合 test_start()方法使用
如果聲明多個參數(shù)值,那么用例數(shù)會是笛卡爾積后的數(shù)量,我這里只聲明一個參數(shù)值
@pytest.mark.parametrize(
'param',
Parameters(
{
'base_url':['http://xxx:9090'],
'url':['/xxx/login.html'],
'accounts':['ss'],
'pwd':['123456']
}),
)
def test_start(self, param):
super().test_start(param)
- 引用
使用$base_url,$url,$accounts,$pwd 方式引用參數(shù),下面是完整代碼
from httprunner import HttpRunner, Config, Step, RunRequest
import pytest
from httprunner import Parameters
class TestCaseLogin(HttpRunner):
@pytest.mark.parametrize(
'param',
Parameters(
{
'base_url':['http://xxx:9090'],
'url':['/xxx/login.html'],
'accounts':['ss'],
'pwd':['123456']
}),
)
def test_start(self, param):
super().test_start(param)
config = Config('hrun3_demo').base_url('$base_url').export(*['vars_name'])
teststeps = [
Step(
RunRequest('login')
.post('$url')
.with_headers(**{'X-Requested-With': 'XMLHttpRequest'})
.with_data({'accounts':'$accounts','pwd':'$pwd'})
.extract()
.with_jmespath('body.msg','value_msg')
.validate()
.assert_equal('body.msg','登錄成功')
.assert_equal('body.code',0)
)
可以看到 headers沒有參數(shù)化,因為 目前headers像url 那樣參數(shù)化調(diào)不通
.with_headers(**'$headers')時會報錯,當然按道理來講應該可以調(diào)用的
這個就放在第三種參數(shù)化方式里實現(xiàn)吧
2.csv文件
通過外部csv文件進行參數(shù)化,將 csv 文件放到項目的根目錄(也可以在該目錄下指定相對路徑,比如data/*.csv)
這部分url 我先不參數(shù)化,只參數(shù)化用戶名和密碼
- 一對一參數(shù)化
data.csv 文件如下:

data里是兩組測試用例[bull,123456] [ss,123456]
注意 csv里不同字段用“,”分隔
聲明的時候把參數(shù)用 “- ”關(guān)聯(lián)
'accounts-pwd': '${parameterize(data.csv)}'
@pytest.mark.parametrize(
'param',
Parameters(
{
'accounts-pwd': '${parameterize(data.csv)}'
}),
)
def test_start(self, param):
super().test_start(param)
引用還是使用$accounts,$pwd,完整代碼如下:
from httprunner import HttpRunner, Config, Step, RunRequest
import pytest
from httprunner import Parameters
class TestCaseLogin(HttpRunner):
@pytest.mark.parametrize(
'param',
Parameters(
{
'accounts-pwd': '${parameterize(data.csv)}'
}),
)
def test_start(self, param):
super().test_start(param)
config = Config('hrun3_demo').base_url('http://xxx:9090').export(*['vars_name'])
teststeps = [
Step(
RunRequest('login')
.post('/xxx/login.html')
.with_headers(**{'X-Requested-With': 'XMLHttpRequest'})
.with_data({'accounts':'$accounts','pwd':'$pwd'})
.extract()
.with_jmespath('body.msg','value_msg')
.validate()
.assert_equal('body.msg','登錄成功')
.assert_equal('body.code',0)
)
]
if __name__ == '__main__':
TestCaseLogin().test_start()
運行如下,因為有一個用戶名不存在,所以一個成功一個失?。?/p>

3.debugtalk.py
- 定義
在debugtalk.py中定義get_user()函數(shù),返回列表,兩組測試用例,一組成功一組失敗
再將 header 進行參數(shù)化,定義 get_headers()函數(shù)
# @File: debugtalk.py
def get_user():
return [
{'accounts': 'ss', 'pwd': '123456'},
{'accounts': 'bull', 'pwd': ''}
]
def get_headers():
headers={
'X-Requested-With': 'XMLHttpRequest'
}
return headers
- 調(diào)用
debugtalk.py的回調(diào)
get_user()調(diào)用,${gen_user()}
@pytest.mark.parametrize(
'param',
Parameters(
{
'accounts-pwd': '${get_user()}'
}),
)
def test_start(self, param):
super().test_start(param)
headers 調(diào)用,直接導入get_headers 方法
from hrun_demo.mtx_demo.debugtalk import get_headers
然后.with_headers(**get_headers())
完整代碼如下:
from httprunner import HttpRunner, Config, Step, RunRequest
import pytest
from httprunner import Parameters
from hrun_demo.mtx_demo.debugtalk import get_headers
class TestCaseLogin(HttpRunner):
@pytest.mark.parametrize(
'param',
Parameters(
{
'accounts-pwd': '${get_user()}'
}),
)
def test_start(self, param):
super().test_start(param)
config = Config('hrun3_demo').base_url('http://xxx:9090').export(*['vars_name'])
teststeps = [
Step(
RunRequest('login')
.post('/xxx/login.html')
.with_headers(**get_headers())
.with_data({'accounts':'$accounts','pwd':'$pwd'})
.extract()
.with_jmespath('body.msg','value_msg')
.validate()
.assert_equal('body.msg','登錄成功')
.assert_equal('body.code',0)
)
]
if __name__ == '__main__':
TestCaseLogin().test_start()
三種方式實現(xiàn)原理
@pytest.mark.parametrize()會先將param作為一個動態(tài)參數(shù),傳遞給param,然后由httprunner再進行參數(shù)化,httprunner在pytest的parametrize上封裝了一層,增加了csv和debugtalk.py參數(shù)化的支持