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'])
分类:
Python
, Python Unittest
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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训练数据并当服务器共享给他人