參數(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ù)化之前煌往,首先要導(dǎo)入pytest包眼俊,和httprunner的Parameters這個(gè)類
使用httprunner改造過的pytest參數(shù)化继低,通過parameters這個(gè)字段去引用
注意:需結(jié)合 test_start()方法使用
如果聲明多個(gè)參數(shù)值黑界,那么用例數(shù)會(huì)是笛卡爾積后的數(shù)量勉失,我這里只聲明一個(gè)參數(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ù)化,因?yàn)?目前headers像url 那樣參數(shù)化調(diào)不通
.with_headers(**'$headers')時(shí)會(huì)報(bào)錯(cuò)乱凿,當(dāng)然按道理來講應(yīng)該可以調(diào)用的
這個(gè)就放在第三種參數(shù)化方式里實(shí)現(xiàn)吧
2.csv文件
通過外部csv文件進(jìn)行參數(shù)化顽素,將 csv 文件放到項(xiàng)目的根目錄(也可以在該目錄下指定相對(duì)路徑,比如data/*.csv)
這部分url 我先不參數(shù)化徒蟆,只參數(shù)化用戶名和密碼
- 一對(duì)一參數(shù)化
data.csv 文件如下:
data里是兩組測試用例[bull,123456] [ss,123456]
注意 csv里不同字段用“,”分隔
聲明的時(shí)候把參數(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()
運(yùn)行如下胁出,因?yàn)橛幸粋€(gè)用戶名不存在,所以一個(gè)成功一個(gè)失敹紊蟆:
3.debugtalk.py
- 定義
在debugtalk.py中定義get_user()函數(shù)全蝶,返回列表,兩組測試用例,一組成功一組失敗
再將 header 進(jìn)行參數(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)用绷落,直接導(dǎ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()
三種方式實(shí)現(xiàn)原理
@pytest.mark.parametrize()會(huì)先將param作為一個(gè)動(dòng)態(tài)參數(shù),傳遞給param始苇,然后由httprunner再進(jìn)行參數(shù)化砌烁,httprunner在pytest的parametrize上封裝了一層,增加了csv和debugtalk.py參數(shù)化的支持