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 参数,动态生成相应的测试类。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/77184.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

根据源码,模拟实现 RabbitMQ - 通过 SQLite + MyBatis 设计数据库(2)

目录 一、数据库设计 1.1、数据库选择 1.2、环境配置 1.3、建库建表接口实现 1.4、封装数据库操作 1.5、针对 DataBaseManager 进行单元测试 一、数据库设计 1.1、数据库选择 MySQL 是我们最熟悉的数据库,但是这里我们选择使用 SQLite,原因如下&am…

JavaScript、TypeScript、ES5、ES6之间的联系和区别

ECMAScript: 一个由 ECMA International 进行标准化,TC39 委员会进行监督的语言。通常用于指代标准本身。JavaScript: ECMAScript 标准的各种实现的最常用称呼。这个术语并不局限于某个特定版本的 ECMAScript 规范,并且可能被用于…

看看安森美深力科NSI45090JDT4G 是如何点亮汽车内外照明系统解决方案

关于线性恒流调节器(CCR):是一种用于控制电流的稳定输出。它通常由一个功率晶体管和一个参考电流源组成。CCR的工作原理是通过不断调节功率晶体管的导通时间来维持输出电流的恒定。当输出电流超过设定值时,CCR会减少功率晶体管的导…

Linux:shell脚本 正则表达式与AWK

一、正则表达式 由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能,类似于增强版的通配符功能,但与通配符不同,通配符功能是用来处理文件…

八股文之框架篇(Spring Boot、SSM)

文章目录 Spring中的单例bean是线程安全的吗什么是AOP,项目中有没有使用到AOPSpring中的事务是如何实现的Spring中事务失效的场景有哪些Bean的生命周期Spring中的循环依赖(循环引用)SpringMVC的执行流程SpringBoot自动配置原理Spring、Spring…

生信豆芽菜-差异基因富集分析

网址:http://www.sxdyc.com/enrichmentEnrich 该工具使用R 语言的clusterProfiler包对关键基因集进行GO和KEGG富集分析,注意这个的关键基因集可以是差异基因,WGCNA的module基因,也可以是表型相关的基因集 1、数据准备 准备一个基因…

kubernetes企业级高可用部署

目录 1、Kubernetes高可用项目介绍 2、项目架构设计 2.1、项目主机信息 2.2、项目架构图 1、Kubernetes高可用项目介绍 2、项目架构设计 2.1、项目主机信息 2.2、项目架构图 2.3、项目实施思路 3、项目实施过程 3.1、系统初始化 3.2、配置部署keepalived服务 3.3、…

【Android Studio】 win11 安装配置 jdk17 超详细

概述 一个好的安装教程能够帮助开发者完成更便捷、更快速的开发。书山有路勤为径,学海无涯苦作舟。我是秋知叶i、期望每一个阅读了我的文章的开发者都能够有所成长。 一、下载JDK JDK官网 这里下载 JDK17 windows x64 installer 二、安装JDK 双击打开下载的 j…

如何在 iOS 上安装并使用 ONLYOFFICE 文档

借助 iOS 版文档应用,您可在移动端设备上访问存储于 ONLYOFFICE 账户中的文件,查看和编辑现有文本文档、电子表格和演示文稿,创建新文档并对其进行整理,以及连接第三方云存储服务。您可与其他门户网站用户协作编辑文档&#xff0c…

16.5.4 【Linux】SELinux 政策内的规则管理

SELinux 各个规则的布林值查询 getsebool 如果想要查询系统上面全部规则的启动与否 (on/off,亦即布林值),很简单的通过 sestatus-b 或 getsebool -a 均可! SELinux 各个规则规范的主体程序能够读取的文件 SELinux typ…

QT QtXlsx安装使用

QtXlsx介绍 QtXlsx是一个可以读取和写入Excel文件的库。它不需要Microsoft Excel,可以在Qt5支持的任何平台上使用。 这里一定是需要QT5支持的。 须知安装QtXlsx时,需要下载perl 1.安装perl 这里选择官网下载安装即可。 官网地址:https://p…

【Git】(四)子模块

1、增加子模块 进入准备添加子模块所在的目录,例如library。 git submodule add -b 1.0.0.0 gitgitee.com:sunriver2000/SubModule.git参数-b用于指定子模块分支。 2、更新子模块 git submodule update --progress --init --recursive --force --remote -- "…

Sending a Sequence Over the Network

一、题目 题面翻译 你现在有一个序列 a a a,定义一个用该序列生成新序列 b b b 的规则如下: 把 a a a 这个序列分成连续的几段;对于每一段,我们把这一段的长度插入到这一段的左边或右边。每一段进行操作后便得到了 b b b 序…

《零基础7天入门Arduino物联网-04》电路基础知识上

配套视频课程:《零基础学Arduino物联网,入门到进阶》 配套课件资料获取:微联实验室 配套学习套件购买:淘宝搜索店铺【微联实验室】 直流电与交流电 直流电(DC) 是指电流的方向始终保持不变的电流。这意味着…

什么是可视化编程?为什么它如此重要?

可视化编程,又叫可视化程序设计,一直以来就是备受讨论的“热门技术”。一方面,程序员抵触它,觉得它不如用代码开发。另一方面,对于产品经理等稍微懂点开发的业余人员,它确实能提供价值。所以,它…

LeetCode 1572. 矩阵对角线元素的和

【LetMeFly】1572.矩阵对角线元素的和 力扣题目链接:https://leetcode.cn/problems/matrix-diagonal-sum/ 给你一个正方形矩阵 mat,请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1&…

数据可视化和数字孪生相互促进的关系

数据可视化和数字孪生是当今数字化时代中备受关注的两大领域,它们在不同层面和领域为我们提供了深入洞察和智能决策的机会,随着两种技术的不断融合发展,很多人会将他们联系在一起,本文就带大家浅谈一下二者之间相爱相杀的关系。 …

Maven方式构建SpringBoot项目

目录 1、创建maven项目 2、添加springboot相关依赖 3、配置启动端口 4、修改APP文件 5、配置controller 6、启动应用 1、创建maven项目 项目如下&#xff1a; 2、添加springboot相关依赖 <parent><groupId>org.springframework.boot</groupId><arti…

自动化安装系统(二)

利用PXE实现自动化安装 PXE简介 PXE&#xff1a;Preboot Excution Environment&#xff0c;预启动执行环境&#xff0c;是由Intel公司研发&#xff0c;基于Client/Server的网络模式&#xff0c;支持远程主机通过网络从远端服务器下载映像&#xff0c;并由此支持通过网络启动操…

小白到运维工程师自学之路 第七十三集 (kubernetes应用部署)

一、安装部署 1、以Deployment YAML方式创建Nginx服务 这个yaml文件在网上可以下载 cat nginx-deployment.yaml apiVersion: apps/v1 #apiVersion是当前配置格式的版本 kind: Deployment #kind是要创建的资源类型&#xff0c;这里是Deploymnet metadata: #metadata是该资源…