当前位置: 首页 > news >正文

pytest自动生成测试类 demo

一、 pytest自动生成测试类 demo

# -*- coding:utf-8 -*-
# @Author: 喵酱
# @time: 2023 - 08 -15
# @File: test4.py
# desc:
import pytest
import unittest# 动态生成测试类def create_test_class(class_name:str, test_cases:list) -> type:"""生成测试类:param class_name: 测试类的类名,是一个字符串:param test_cases: 是一个可迭代的对象(list),每一个元素case是一个字典在pytest测试类中,每一个方法,就是一条case,所以这里将多条case数据,生成测试类的多个方法:return: 测试类,包含多个方法(测试case)"""# 使用 type() 函数动态创建一个继承自 unittest.TestCase 的子类test_class = type(class_name, (unittest.TestCase,), {})for case in test_cases:test_method = generate_test_method(case)# 动态为测试类添加测试方法setattr(test_class, test_method.__name__, test_method)return test_class# 生成测试方法
def generate_test_method(case: dict) -> callable:"""生成单个测试方法。Args:case (dict): 测试用例字典,包含输入和输出的信息。Returns:callable: 生成的测试方法。"""def test_method(self):"""实际执行测试的方法。"""assert case["input"] == case["output"]# 设置测试方法的名称test_method.__name__ = f"test_{case['name']}"return test_method# 定义测试数据
@pytest.fixture(params=[{"name": "case1", "input": 1, "output": 1},{"name": "case2", "input": 3, "output": 3},
])
def test_case(request):return request.param# 测试生成的测试类
@pytest.mark.usefixtures("test_case")
def test_generator(test_case):test_class = create_test_class("DynamicTestClass", [test_case])# 加载测试类,并创建测试套件suite = unittest.TestLoader().loadTestsFromTestCase(test_class)# 运行测试套件result = unittest.TextTestRunner().run(suite)# 断言测试结果是否成功assert result.wasSuccessful()

执行 test_generator 方法

运行顺序:

1、手动触发运行  test_generator 方法

2、在执行test_generator 方法 方法之前,会先执行test_case 方法。

3、test_case 方法,数据有2条数据,则test_case 方法会执行两次

4、test_generator 同样也会执行两次。

最终效果,就是生成了两次名为 DynamicTestClass 的测试类,每个测试类,只生成了一个方法(case)

 二、代码详解

2.1 整体运行顺序

1、定义了一个函数 create_test_class,用于动态生成测试类。
2、定义了一个函数 generate_test_method,用于生成单个测试方法。
3、使用了 @pytest.fixture 装饰器定义了一个夹具(fixture) test_case,用于提供测试数据。
4、使用了 @pytest.mark.usefixtures("test_case") 装饰器标记了一个测试函数 test_generator,表示在执行该测试函数之前需要先执行 test_case 夹具。
5、在函数 test_generator 中,调用了 create_test_class 函数,传入一个测试数据。然后加载并运行生成的测试类。
6、执行测试时,先执行夹具函数 test_case 来获取测试数据。
7、根据测试数据,动态生成一个测试类 DynamicTestClass,并为该类添加一个测试方法。
8、创建测试套件,并运行测试套件中的测试用例。
9、使用 unittest.TextTestRunner 运行测试套件,并返回测试结果。
10、最后,根据测试结果判断是否成功,并进行断言。


总结起来,整个代码的执行流程是:先执行夹具函数获取测试数据,然后动态生成测试类并创建测试套件,最后运行测试套件中的测试用例,输出测试结果,并进行断言判断。

2.1 定义测试数据

# 定义测试数据
@pytest.fixture(params=[{"name": "case1", "input": 1, "output": 1},{"name": "case2", "input": 3, "output": 3},
])
def test_case(request):return request.param

1、@pytest.fixture 是 pytest 框架提供的装饰器,用于定义夹具(fixture)。夹具是在测试函数或测试类执行前后进行特定操作、提供数据等的函数。

2、在这段代码中,test_case 是一个夹具函数。通过 @pytest.fixture 装饰器对其进行标记,表示它是一个夹具。

3、params 参数是用来定义多个测试用例数据的列表。每个测试用例数据都是一个字典,包含了三个键值对:name、input 和 output。name 是用来描述测试用例的名称,input 是输入数据,output 是预期输出结果。

4、当执行测试函数时,pytest 会自动调用夹具函数,并根据参数列表中的每个字典生成不同的测试数据。每个测试用例都会独立执行一次测试函数,并且将对应的测试数据作为参数传递给测试函数。

在这段代码中,夹具函数 test_case 返回 request.param,request.param 表示当前测试用例的数据。当执行 test_generator 函数时,会先调用夹具函数 test_case 获取测试数据,然后将该测试数据作为参数传递给 test_generator 函数。

2.2 运行生成的测试类 test_generator

# 测试生成的测试类
@pytest.mark.usefixtures("test_case")
def test_generator(test_case):test_class = create_test_class("DynamicTestClass", [test_case])# 加载测试类,并创建测试套件suite = unittest.TestLoader().loadTestsFromTestCase(test_class)# 运行测试套件result = unittest.TextTestRunner().run(suite)# 断言测试结果是否成功assert result.wasSuccessful()

1、装饰器: @pytest.mark.usefixtures("test_case")

@pytest.mark.usefixtures("test_case") 是 Pytest 测试框架中一个装饰器标记(decorator marker),用于指定在运行测试用例之前需要先执行的 fixture(夹具)。

fixture 是一种在测试运行之前准备测试环境、数据或者资源的机制。它可以用来为测试用例提供必要的前置条件,例如设置数据库连接、创建临时文件、初始化测试数据等。

在给定的代码中,@pytest.mark.usefixtures("test_case") 将 "test_case" 作为 fixture 的名称进行标记。这意味着在运行使用了该标记的测试用例之前,Pytest 将先执行名为 "test_case" 的 fixture 方法。

使用 @pytest.mark.usefixtures 标记可以方便地应用 fixture,而无需在每个测试用例函数中显式调用 fixture。通过将标记应用于测试用例函数,测试框架将自动处理 fixture 的执行和销毁,并将其提供给测试用例函数作为参数使用。

总之,@pytest.mark.usefixtures("test_case") 允许你在测试运行之前自动执行名为 "test_case" 的 fixture 方法,为测试用例提供必要的准备工作。

2.3 generate_test_method

generate_test_method 函数中的 case 参数是一个字典类型。在示例代码中,test_case 是一个包含测试用例信息的字典,其中包括字段 "name""input""output",用于表示测试名称、输入和期望输出。

传递给 generate_test_method 函数的 case 参数应该具有与示例中定义的测试用例字典相同的结构。例如:

case = {"name": "example", "input": 1, "output": 2}
test_method = generate_test_method(case)

在这个示例中,case 是一个字典,表示一个测试用例,包含 "name""input""output" 字段。generate_test_method 函数将根据这些字段生成一个测试方法,并为该方法设置名称。

2、create_test_class

在函数 create_test_class 中,test_cases 参数的类型可以是任何可迭代对象,比如列表或元组。

示例代码中使用了迭代循环来遍历 test_cases,假设 test_cases 是一个列表,每个元素都是一个测试用例字典。所以 test_cases 的结构可以类似以下的形式:

test_cases = [{"name": "case1", "input": 1, "output": 2},{"name": "case2", "input": 3, "output": 3},
]

其中,每个 test_cases 列表的元素都是一个包含测试用例信息的字典。

所以,在调用 create_test_class 函数时,你可以传递一个包含测试用例字典的列表作为 test_cases 参数,动态生成相应的测试类。

相关文章:

pytest自动生成测试类 demo

一、 pytest自动生成测试类 demo # -*- coding:utf-8 -*- # Author: 喵酱 # time: 2023 - 08 -15 # File: test4.py # desc: import pytest import unittest# 动态生成测试类def create_test_class(class_name:str, test_cases:list) -> type:"""生成测试类…...

服务器卡顿了该如何处理

服务器卡顿了该如何处理 当Windows系统的服务器出现卡顿问题时,以下是一些常见的故障排除步骤: 1.检查网络连接:确保服务器的网络连接正常。检查网络设备、交换机、防火墙等设备,确保它们正常运行。尝试通过其他计算机访问服务器…...

常量对象 只能调用 常成员函数

一、遇到问题&#xff1a; //函数声明 void ReadRanFile(CString szFilePath); const CFvArray<CString>& GetPanelGrade() const { return m_fvArrayPanelGrade; } //在另一个文件中调用ReadtRanFile这个函数 const CFsJudConfig& psJudConfig m_pFsDefJu…...

Progressive-Hint Prompting Improves Reasoning in Large Language Models

本文是LLM系列的文章&#xff0c;针对《Progressive-Hint Prompting Improves Reasoning in Large Language Models》的翻译。 渐进提示改进了大型语言模型中的推理 摘要1 引言2 相关工作3 渐进提示Prompting4 实验5 结论6 实现细节7 不足与未来工作8 广泛的影响9 具有不同提示…...

mysql中INSERT INTO ... ON DUPLICATE KEY UPDATE的用法,以及与REPLACE INTO 语句用法的异同

INSERT INTO ... ON DUPLICATE KEY UPDATE 是 MySQL 中一种用于插入数据并处理重复键冲突的语法。与之相似的还有 REPLACE INTO 语句。以下是它们的用法和异同点的详细说明&#xff1a; 一、INSERT INTO ... ON DUPLICATE KEY UPDATE INSERT INTO ... ON DUPLICATE KEY UPDAT…...

wireshark 实用过滤表达式(针对ip、协议、端口、长度和内容)

wireshark 实用过滤表达式&#xff08;针对ip、协议、端口、长度和内容&#xff09; 1. 关键字 “与”&#xff1a;“eq” 和 “”等同&#xff0c;可以使用 “and” 表示并且&#xff0c; “或”&#xff1a;“or”表示或者。 “非”&#xff1a;“!" 和 "not”…...

MATLAB图形窗口固定

起因是上次作图的时候写了&#xff1a; clc clear close all 这三个典型的刷新语句 清空工作区、命令行并且关闭图窗 就导致每次我把图窗拉到合适的位置观察&#xff0c;再一次点击运行都会重新刷新在出生点&#xff08;x&#xff09; 所以想把图窗固定在某个位置 显然更…...

【数据结构】_7.二叉树概念与基本操作

目录 1.树形结构 1.1 树的概念 1.2 树的相关概念 1.3 树的表示 1.4 树在实际中的应用—表示文件系统的目录树结构 ​编辑​2.二叉树 2.1 概念 2.2 特殊二叉树 2.3 二叉树的性质 2.4 二叉树的存储结构 2.4.1 顺序存储结构&#xff08;数组存储结构&#xff09; 2.4.2…...

Flink之Partitioner(分区规则)

Flink之Partitioner(分区规则) 方法注释global()全部发往1个taskbroadcast()广播(前面的文章讲解过,这里不做阐述)forward()上下游并行度一致时一对一发送,和同一个算子连中算子的OneToOne是一回事shuffle()随机分配(只是随机,同Spark的shuffle不同)rebalance()轮询分配,默认机…...

tk切换到mac的code分享

文章目录 前言一、基础环境配置二、开发软件与扩展1.用到的开发软件与平替、扩展情况 总结 前言 最近换上了coding人生的第一台mac&#xff0c;以前一直偏好tk&#xff0c;近来身边的朋友越来越多的用mac了&#xff0c;win的自动更新越来越占磁盘了&#xff0c;而且win11抛弃了…...

spark的standalone 分布式搭建

一、环境准备 集群环境hadoop11&#xff0c;hadoop12 &#xff0c;hadoop13 安装 zookeeper 和 HDFS 1、启动zookeeper -- 启动zookeeper(11,12,13都需要启动) xcall.sh zkServer.sh start -- 或者 zk.sh start -- xcall.sh 和zk.sh都是自己写的脚本-- 查看进程 jps -- 有…...

浅析基于视频汇聚与AI智能分析的新零售方案设计

一、行业背景 近年来&#xff0c;随着新零售概念的提出&#xff0c;国内外各大企业纷纷布局智慧零售领域。从无人便利店、智能售货机&#xff0c;到线上线下融合的电商平台&#xff0c;再到通过大数据分析实现精准推送的个性化营销&#xff0c;智慧零售的触角已经深入各个零售…...

SpringMVC之异常处理

SpringMVC之异常处理 异常分为编译时异常和运行时异常&#xff0c;编译时异常我们trycatch捕获&#xff0c;捕获后自行处理&#xff0c;而运行时异常是不可预期的&#xff0c;就需要规范编码来避免&#xff0c;在SpringMVC中&#xff0c;不管是编译异常还是运行时异常&#xff…...

保险龙头科技进化论:太保的六年

如果从2013年中国首家互联网保险公司——众安在线的成立算起&#xff0c;保险科技在我国的发展已走进第十个年头。十年以来&#xff0c;在政策指引、技术发展和金融机构数字化转型的大背景下&#xff0c;科技赋能保险业高质量发展转型已成为行业共识。 大数据、云计算、人工智…...

升级STM32电机PID速度闭环编程:从F1到F4的移植技巧与实例解析

引言&#xff1a; 在嵌入式系统开发中&#xff0c;STM32系列微控制器广泛应用于各种应用领域。而对于直流有刷电机的控制&#xff0c;PID速度闭环是一种常用的控制方式。本文将以此为例&#xff0c;探讨如何从STM32F1系列移植到STM32F4系列&#xff0c;并详细介绍HAL库在不同型…...

GaussDB 实验篇+openGauss的4种1级分区案例

✔ 范围分区/range分区 -- 创建表 drop table if exists zzt.par_range; create table if not exists zzt.par_range (empno integer,ename char(10),job char(9),mgr integer(4),hiredate date,sal numeric(7,2),comm numeric(7,2),deptno integer,constraint pk_par_emp pri…...

Ruby软件外包开发语言特点

Ruby 是一种动态、开放源代码的编程语言&#xff0c;它注重简洁性和开发人员的幸福感。在许多方面都具有优点&#xff0c;但由于其动态类型和解释执行的特性&#xff0c;它可能不适合某些对性能和类型安全性要求较高的场景。下面和大家分享 Ruby 语言的一些主要特点以及适用的场…...

《系统架构设计师教程》重点章节思维导图

内容来自《系统架构设计师教程》&#xff0c;筛选系统架构设计师考试中分值重点分布的章节&#xff0c;根据章节的内容整理出相关思维导图。 重点章节 第2章&#xff1a;计算机系统知识第5章&#xff1a;软件工程基础知识第7章&#xff1a;系统架构设计基础知识第8章&#xff1…...

mac录屏工具,录屏没有声音的解决办法

mac录屏工具&#xff0c;录屏没有声音的解决办法 在使用macbook录制屏幕时&#xff0c;发现自带的录屏工具QuickTime Player没有声音&#xff0c;于是尝试了多款录屏工具&#xff0c;对其做一些经验总结&#xff08;省流&#xff1a;APP Store直接可以免费下载使用Omi录屏专家…...

神经网络基础-神经网络补充概念-33-偏差与方差

概念 偏差&#xff08;Bias&#xff09;&#xff1a; 偏差是模型预测值与实际值之间的差距&#xff0c;它反映了模型对训练数据的拟合能力。高偏差意味着模型无法很好地拟合训练数据&#xff0c;通常会导致欠拟合。欠拟合是指模型过于简单&#xff0c;不能捕捉数据中的复杂模式…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...