pytest 装饰器@pytest.mark.parametrize参数的参数化注意事项
总结:pytest 装饰器@pytest.mark.parametrize 的实参建议使用列表list或元组tuple,若使用字典dict则需被元组或列表嵌套,详情请往下看。
- pytest 装饰器@pytest.mark.parametrize 单一参数的参数化
- 支持dict 列表数据类型作为实参,可传入多条测试数据;
- 支持tuple 元组数据类型作为实参,可传入多条测试数据;
- 支持set 集合数据类型作为实参,可传入多条测试数据;
- 支持dict 字典数据类型作为实参,但是不适合,因为只输出字典的key,不建议直接用字典作为测试数据传入。
import pytest
# # 使用装饰器参数化,支持列表,左边的"data" 是形参,右边的数据是实参
# @pytest.mark.parametrize("data", ['a', 'b', 'c'])
# def test_singleParam_list(data):
# print(data)
#
#
# # 使用装饰器参数化,支持元组
# @pytest.mark.parametrize('data',(1, 2, 3, 4))
# def test_singleParam_tuple(data):
# print(data)
# # 使用装饰器参数化,支持dict 字典数据类型。但是不适合因为只输出字典的key
# # @pytest.mark.parametrize('data', {'a': 1, 'b': 2, 'c': 3})
# @pytest.mark.parametrize('data', {1: 'a', 2: 'b', 3: 'c'})
# def test_singleParam_dict(data):
# print(data)
# print(type(data))
# 使用装饰器参数化,支持set 集合
@pytest.mark.parametrize('data', {1, 'v', 'd', 2})
def test_singleParam_set(data):
print(data)
if __name__ == '__main__':
pytest.main(["-sv", "./test_single_param.py"])
- pytest 装饰器@pytest.mark.parametrize 多参数的参数化
- 装饰器@pytest.mark.parametrize的形参可以一个,它可以自动解析实参返回的参数个数
- 多参数的参数化,需要用到数据类型的嵌套
元组tuple 支持嵌套元组tuple、列表list、集合set、字典dict;
列表list 支持嵌套列表list、元组tuple、集合set、字典dict;
集合set 支持嵌套元组tuple,不支持集合set、列表list、集合set,会报错:TypeError: unhashable type;
字典dict 支持嵌套tuple、list、set、dict,但是输出Key,不适合用在此处。
import pytest
# 元组tuple嵌套各种容器:list, tuple, set, dict
# # 元组tuple 嵌套列表list
# def return_tuple_dataList():
# # 默认返回元组tuple
# return ['aa', 123], ['bb', 234], ['cc', 345]
#
#
# # 使用函数返回的元组(元组tuple 嵌套列表list数据)传入参数
# @pytest.mark.parametrize('data', return_tuple_dataList())
# def test_multipleParam_tuple_dataList(data):
# # 循环获取元组中的记录,一次取一个列表的记录
# print("\n"+data[0])
# print(str(data[1]))
#
#
# # 元组tuple 嵌套元组tuple
# def return_tuple_dataTuple():
# # 默认返回元组tuple
# return ('aa', 123), ('bb', 234), ('cc', 345)
#
#
# # 使用函数返回的元组(元组tuple 嵌套元组tuple)传入参数
# @pytest.mark.parametrize('data', return_tuple_dataTuple())
# def test_multipleParam_tuple_dataTuple(data):
# # 循环获取元组中的记录,一次取一个元组的记录
# print("\n"+data[0])
# print(str(data[1]))
#
#
# # 元组tuple 嵌套集合set
# def return_tuple_dataSet():
# # 默认返回元组tuple
# return {'aa', 123}, {'bb', 234}, {'cc', 345}
#
#
# # 使用函数返回的元组(元组tuple 嵌套集合set)传入参数
# @pytest.mark.parametrize('data', return_tuple_dataSet())
# def test_multipleParam_tuple_dataSet(data):
# # 循环获取元组中的记录,一次取一个集合的记录,集合是无序的不能通过索引取值
# print("\n")
# print(data)
# for val in data:
# print(val)
# # 集合set 嵌套元组tuple
# def return_set_dataTuple():
# # 返回集合set
# return {('dd', 123), ('ee', 234), ('gg', 345)}
#
#
# # 使用函数返回的集合set(集合set 嵌套元组tuple)数据传入参数
# @pytest.mark.parametrize("data", return_set_dataTuple())
# def test_multipleParam_set_dataTuple(data):
# # 循环获取集合中的记录,一次取一个元组记录
# print("\n"+data[0])
# print(str(data[1]))
# # 集合set 不支持嵌套集合set
# def return_set_dataSet():
# # 返回集合set
# return {{'dd', 123}, {'ee', 234}, {'gg', 345}}
#
#
# # 集合set 不支持嵌套列表list
# def return_set_dataList():
# # 返回集合set
# return {['dd', 123], ['ee', 234], ['gg', 345]}
#
#
# # 集合set 不支持嵌套字典dict
# def return_set_dataDict():
# # 返回集合set
# return {{'name': 'dd', 'password': 123}, {'name': 'ee', 'password': 234}, {'name': 'gg', 'password': 345}}
#
# # 列表list 嵌套list
# def return_list_dataList():
# # 返回列表list
# return [['hh', 123], ['ii', 234], ['jj', 345]]
#
#
# @pytest.mark.parametrize('data', return_list_dataList())
# def test_multipleParam_list_dataList(data):
# # 循环获取列表中的记录,一次取一个列表记录
# print("\n"+data[0])
# print(data[1])
#
#
# # 列表list 嵌套元组tuple
# def return_list_dataTuple():
# # 返回列表list
# return [('hh', 123), ('ii', 234), ('jj', 345)]
#
#
# @pytest.mark.parametrize('data', return_list_dataTuple())
# def test_multipleParam_list_dataTuple(data):
# # 循环获取列表中的记录,一次取一个元组记录
# print("\n"+data[0])
# print(data[1])
#
#
# # 列表list 嵌套集合set
# def return_list_dataSet():
# # 返回列表list
# return [('hh', 123), ('ii', 234), ('jj', 345)]
#
#
# @pytest.mark.parametrize('data', return_list_dataSet())
# def test_multipleParam_list_dataSet(data):
# # 循环获取列表中的记录,一次取一个列表记录
# print("\n"+data[0])
# print(data[1])
#
#
# # 列表list 嵌套字典dict
# def return_list_dataDict():
# # 返回列表list
# return [{'name': 'hh', 'password': 123}, {'name': 'ii', 'password': 234}, {'name': 'jj', 'password': 345}]
#
#
# # 使用函数返回的列表list(列表list 嵌套字典dict)数据传入参数
# @pytest.mark.parametrize('data', return_list_dataDict())
# def test_multipleParam_list_dataDict(data):
# # 循环获取列表中的记录,一次取一个字典记录
# print("\n"+data['name'])
# print(data['password'])
# 字典dict 嵌套字典dict
def return_dict_dataDict():
# 返回列表list
return {"user": {'name': 'hh', 'password': 123}, "info": {'name': 'ii', 'password': 234}, "msg": {'name': 'jj', 'password': 345}}
# 字典嵌套其他数据类型不适合作为装饰器的多参数的实参
# 使用函数返回的列表list(列表list 嵌套字典dict)数据传入参数
@pytest.mark.parametrize('data', return_dict_dataDict())
def test_multipleParam_dict_dataDict(data):
# 循环获取字典中的记录,一次取一个字典记录
print(data) # 输出字典的key
print(type(data))
# 字典dict 嵌套列表list
def return_dict_dataList():
# 返回列表list
return {"user": ['hh', 123], "info": ['ii', 234], "msg": ['jj', 345]}
@pytest.mark.parametrize('data', return_dict_dataList())
def test_multipleParam_dict_dataList(data):
# 循环获取字典中的记录,一次取一个字典记录
print(data) # 输出字典的key
print(type(data))
if __name__ == '__main__':
# -vs 展示打印内容和执行详情
pytest.main(["-vs", "./test_func2.py"])
能力有限,若有错误,欢迎各位大佬指正!