python-数据驱动

1、parameterized.parameterized

@parameterized.expand必须要求参数是一个iterable可迭代对象。

复制代码
import unittest
from parameterized import parameterized, param

class TestAdd(unittest.TestCase):
    datas = [
        {'first': 1, 'second': 3, 'third': 5},
        {'first': 4, 'second': 7, 'third': 8},
        {"first": {'username': '15669910105'}}]

    # 也可使用json.dumps(data)
    @parameterized.expand(param(data) for data in datas)
    def test_add(self, data):
        print(data)

if __name__ == '__main__':
    unittest.main()
复制代码

 

2、ddt、unpack

ddt包含类的装饰器ddt和两个方法装饰器@data、@file_data。

@data(a,b)

        那么a和b各运行一次用例

@data([a,d],[c,d])

        如果没有@unpack,那么[a,b]当成一个参数传入用例运行

        如果有@unpack,那么[a,b]被分解开,按照用例中的两个参数传递

复制代码
import unittest
from ddt import ddt, unpack, data, file_data

tup = ('first','second','third')

datas = [
    {'first': 1, 'second': 3, 'third': 5},
    {'first': 4, 'second': 7, 'third': 8},
    {"first": {'username': '15669910105'}}
]

file_path = '../file/yaml/demo.yaml'

@ddt
class TestCases(unittest.TestCase):
    """
    tup元祖
    @data(tup)  取的是整改元祖
    @data(*tup) 取的是元祖中元素

    datas列表
    @data(datas)  取的是整改列表
    @data(*datas) 取的是列表中元素
    @data(*datas)@unpack  取的是列表元素中子元素
    
    file_data
    @data(file_path)  取的是文件路径
    """
    @data(tup)
    def test_tups(self, value):
        print(value)

    @data(*tup)
    def test_tup(self, value):
        print(value)


    @data(datas)
    def test_dicts(self, value):
        print(value)

    @data(*datas)
    def test_dict(self, value):
        print(value)

    @data(*datas)
    @unpack
    def test_dict_element(self, first, second, third):
        print(first, second, third)

    @file_data(file_path)
    def test_file(self,teststeps):
        print(teststeps)
        
if __name__ == '__main__':
    unittest.main()
复制代码

 

3、pytest.mark.parametrize

@pytest.mark.parametrize,里面写两个参数

        第一个参数是字符串,多个参数中间用逗号隔开

        第二个参数是list,多组数据用元祖类型

复制代码
import pytest

datas = [
    {'name': 'x', 'first': 1, 'second': 3, 'third': 5},
    {'name': 'y', 'first': 4, 'second': 7, 'third': 8},
    #{'name': 'z', "first": {'username': '15669910105'}}
]

@pytest.mark.parametrize("data",datas)
def test_1(data):
    print(data)

@pytest.mark.parametrize("naem,data1,data2,data3",datas)
def test_2(naem,data1,data2,data3):
    print(naem,data1,data2,data3)

@pytest.mark.parametrize("data", datas, ids=[data['name'] for data in datas])
def test_3(data):
    print(data)
复制代码

 

4、pytest.fixture

  无需安装模块,采用pytest内部fixture装饰器。

        fixture是可以有返回值的,如果没return默认返回None。用例调用fixture的返回值,直接就是把fixture的函数名称当成变量传入。

复制代码
import pytest

datas = [
   {'name': 'x','first': 1, 'second': 3, 'third': 5},
   {'name': 'y','first': 4, 'second': 7, 'third': 8},
   {'name': 'z',"first": {'username': '15669910105'}}
]

@pytest.fixture(params=datas,ids=[data['name'] for data in datas])
def fixture_param(request):  #参数化
    return request.param

def test_1(fixture_param):  #调用
    print(fixture_param)

if __name__ == '__main__':
    pytest.main(['-s', 'test.py'])
复制代码

 

posted @   南方的墙  阅读(131)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示