pytest 装饰器@pytest.mark.parametrize参数的参数化注意事项

总结:pytest 装饰器@pytest.mark.parametrize 的实参建议使用列表list或元组tuple,若使用字典dict则需被元组或列表嵌套,详情请往下看。

  • pytest 装饰器@pytest.mark.parametrize 单一参数的参数化
  1. 支持dict 列表数据类型作为实参,可传入多条测试数据;
  2. 支持tuple 元组数据类型作为实参,可传入多条测试数据;
  3. 支持set 集合数据类型作为实参,可传入多条测试数据;
  4. 支持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 多参数的参数化
  1. 装饰器@pytest.mark.parametrize的形参可以一个,它可以自动解析实参返回的参数个数
  2. 多参数的参数化,需要用到数据类型的嵌套

元组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"])

 

能力有限,若有错误,欢迎各位大佬指正!

posted @ 2023-03-18 16:57  furichan  阅读(346)  评论(0编辑  收藏  举报