参数化的本质就是:对列表中的对象循环,然后再赋值给具体的对象
import pytest
def add(a, b):
return a + b
@pytest.mark.parametrize('a,b,result', [
(1, 2, 3),
(2, 3, 5),
('Hi,', 'xia', 'Hi,xia'),
(1.0, 1.0, 2.0),
(1, 1.0, 2.0),
(0, 0, 0)])
def test_add_many(a, b, result):
assert add(a, b) == result
把测试数据拿出来单独存储
import pytest
def add(a,b):
return a+b
def listParam():
list1=[
(1, 2, 3),
(2, 3, 5),
('Hi,', 'xia', 'Hi,xia'),
(1.0, 1.0, 2.0),
(1, 1.0, 2.0),
(0, 0, 0)
]
return list1
@pytest.mark.parametrize('a,b,result',listParam())
def test_add_many(a,b,result):
assert add(a,b)==result
结合具体的数据类型演示参数化的应用
import pytest
def add(a, b):
return a + b
def dataList():
datas = [
[1, 1, 2],
['a', 'b', 'ab'],
[0, 0, 0],
[2, 2, 4],
['x', 'y', 'xy'],
]
return datas
'''list'''
@pytest.mark.parametrize('a,b,result', dataList())
def test_add_list(a, b, result):
assert add(a=a, b=b) == result
'''tuple'''
def dataTuple():
datas = [
(1, 1, 2),
('a', 'b', 'ab'),
(0, 0, 0),
(2, 2, 4),
('x', 'y', 'xy'),
]
return datas
@pytest.mark.parametrize('a,b,result', dataTuple())
def test_add_tuple(a, b, result):
assert add(a=a, b=b) == result
'''dict'''
def dataDict():
datas = [
{'a': 1, 'b': 1, 'result': 2},
{'a': 'a', 'b': 'b', 'result': 'ab'},
{'a': 0, 'b': 0, 'result': 0},
{'a': 2, 'b': 2, 'result': 4},
{'a': 'x', 'b': 'y', 'result': 'xy'},
]
return datas
@pytest.mark.parametrize('data', dataDict())
def test_add_dict(data):
assert add(a=data['a'], b=data['b']) == data['result']
通过pytest的参数化对json文件操作并转成pytest测试代码:
r.json()是dict类型的
import pytest
import requests
import json
def getJson():
return json.load(open('postman.json', encoding='utf-8'))['item']
@pytest.mark.parametrize('data', getJson())
def test_postman_json(data):
r = requests.request(url=data['request']['url'],
method=data['request']['method'],
json=json.loads(data['request']['body']['raw']))
'''用json.loads()把原本是str类型的参数转成dict类型,请求的参数转成通用的json格式'''
'''用json.dumps把原本是dict类型的参数转成str类型,因为响应参数是str类型的'''
'''r.json()是dict类型的'''
'''断言比较,数据类型必须相同'''
assert json.dumps(r.json()) in json.dumps(data['response'][0])