课外活动:简单了解原生测试框架Unittest前置后置的逻辑

简单了解原生测试框架Unittest前置后置的逻辑

一、测试框架执行顺序解析

1.1 基础执行流程

import unittestclass A(unittest.TestCase):@classmethoddef setUpClass(cls):print(f"【CLASS START】{cls.__name__}")def setUp(self):print(f"【TEST START】{self._testMethodName}")def test_a(self):print("▶ 执行测试逻辑A")def test_b(self):print("▶ 执行测试逻辑B")def tearDown(self):print(f"【TEST END】{self._testMethodName}")@classmethoddef tearDownClass(cls):print(f"【CLASS END】{cls.__name__}")

1.2 执行顺序可视化

TestClass TestCase setUpClass() 1 setUp() 2 test_method() 3 tearDown() 4 loop [每个测试方法] tearDownClass() 5 TestClass TestCase

二、核心方法功能解析

2.1 类级别方法

方法触发时机执行次数典型应用场景
setUpClass()测试类初始化时1次数据库连接建立
tearDownClass()测试类所有方法执行完成后1次资源释放/日志归档

代码实现特征:

@classmethod
def setUpClass(cls):# 必须使用classmethod装饰器# 通过cls参数访问类属性# 不能直接调用实例方法

2.2 实例级别方法

方法触发时机执行次数典型应用场景
setUp()每个测试方法执行前N次(N=测试方法数)测试数据初始化
tearDown()每个测试方法执行后N次环境清理/结果验证

方法调用关系:

测试启动
├── setUpClass()
│   ├── setUp() -> test_a() -> tearDown()
│   └── setUp() -> test_b() -> tearDown()
└── tearDownClass()

三、代码执行过程深度分析

3.1 实际执行日志

【CLASS START】A
【TEST START】test_a
▶ 执行测试逻辑A
【TEST END】test_a
【TEST START】test_b
▶ 执行测试逻辑B
【TEST END】test_b
【CLASS END】A

3.2 关键执行节点说明

  1. 类初始化阶段

    • 创建测试类实例前执行setUpClass()
    • 适用于全局配置加载
  2. 测试方法执行周期

    setUp
    test_method
    tearDown
  3. 类销毁阶段

    • 所有测试执行完毕后调用tearDownClass()
    • 必须使用@classmethod装饰器

四、特殊场景处理机制

4.1 异常中断处理

def setUp(self):try:# 初始化操作except Exception as e:self.skipTest(f"初始化失败: {str(e)}")@classmethod
def tearDownClass(cls):if hasattr(cls, 'db_conn'):cls.db_conn.close()  # 确保资源释放

4.2 多层级继承场景

class BaseTest(unittest.TestCase):@classmethoddef setUpClass(cls):print("父类初始化")class ChildTest(BaseTest):@classmethoddef setUpClass(cls):super().setUpClass()  # 必须显式调用父类方法print("子类初始化")

五、最佳实践建议

  1. 资源管理原则

    • setUpClass中打开文件/数据库连接
    • tearDownClass中关闭连接
    • setUp中初始化测试数据
    • tearDown中清理临时数据
  2. 执行效率优化

    15% 10% 50% 25% 方法执行时间占比 setUpClass tearDownClass setUp/tearDown 测试逻辑
    "setUpClass" : 15
    "tearDownClass" : 10
    "setUp/tearDown" : 50
    "测试逻辑" : 25
    

六、完整代码

"""
Python :3.13.3
Selenium: 4.31.0
"""import unittestclass A(unittest.TestCase):@classmethoddef setUpClass(cls):print(cls.setUpClass.__name__)def setUp(self):print(self.setUp.__name__)def test_a(self):print(self.test_a.__name__)def test_b(self):print(self.test_b.__name__)@classmethoddef tearDownClass(cls):print(cls.tearDownClass.__name__)def tearDown(self):print(self.tearDown.__name__)

「小贴士」:点击头像→【关注】按钮,获取更多软件测试的晋升认知不迷路! 🚀

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习设计模式《八》——原型模式

一、基础概念 原型模式的本质是【克隆生成对象】; 原型模式的定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象 。 原型模式的功能: 1、通过克隆来创建新的对象实例; 2、为克隆出来的新对象实例复制…

olmOCR - PDF文档处理工具包

文章目录 一、关于 olmOCR相关资源包含内容团队 二、安装三、本地使用示例查看结果多节点/集群使用管道完整文档 一、关于 olmOCR olmOCR 是用于训练语言模型处理PDF文档的工具包,支持大规模PDF文本解析和转换。 相关资源 源码:https://github.com/all…

Android开发补充内容

Android开发补充内容 fragment通信生命周期 Okhttp基本使用websocket Retrofit基本使用 RxJava基本使用定时任务 Hilt基本使用进阶使用例子 组件库Material ComponentsJetpack Compose fragment 通信 fragment于activity通信的一种原生方法是使用Bundle: Bundle …

隐私计算框架FATE二次开发心得整理(工业场景实践)

文章目录 版本介绍隐私计算介绍前言FATE架构总体架构FateBoard架构前端架构后端架构 FateClient架构创建DAG方式DAG生成任务管理python SDK方式 FateFlow架构Eggroll架构FATE算法架构Cpn层FATE ML层 组件新增流程新增组件流程新增算法流程 版本介绍 WeBank的FATE开源版本 2.2.…

AI驱动的制造工艺:系统化探索与创新

DeepSeek 技术全景 在当今 AI 技术蓬勃发展的时代,DeepSeek 已成为该领域中一颗耀眼的明星。自 2023 年 7 月 17 日成立以来,这家由知名私募巨头幻方量化孕育而生的公司,迅速在 AI 领域崭露头角 。DeepSeek 的目标是开发顶尖的大语言模型(LLM),并利用数据蒸馏技术打造更精…

【嵌入式开发-LCD】

嵌入式开发-LCD ■ LCD简介 ■ LCD简介

java反射(2)

package 反射;import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Arrays;public class demo {public static void main(String[] args) throws Exception {// 通过类的全限定名获取对应的 Class 对象…

使用 Cesium 构建 3D 地图应用的实践

CesiumJS 是一个功能强大的开源 JavaScript 库,能够帮助开发者快速构建高性能、高精度的 3D 地球和地图应用 。本文将介绍如何使用 Cesium 构建一个基本的 3D 地图应用,并加载自定义的 3D Tiles 模型。 初始化 Cesium Viewer 首先,在 Vue 的…

结合Splash与Scrapy:高效爬取动态JavaScript网站

在当今的Web开发中,JavaScript的广泛应用使得许多网站的内容无法通过传统的请求-响应模式直接获取。为了解决这个问题,Scrapy开发者经常需要集成像Splash这样的JavaScript渲染引擎。本文将详细介绍Splash JS引擎的工作原理,并探讨如何将其与S…

企业级可观测性实现:OpenObserve云原生平台的本地化部署与远程访问解析

文章目录 前言1. 安装Docker2. 创建并启动OpenObserve容器3. 本地访问测试4. 公网访问本地部署的OpenObserve4.1 内网穿透工具安装4.2 创建公网地址 5. 配置固定公网地址 前言 嘿,各位小伙伴们,今天要给大家揭秘一个在云原生领域里横扫千军的秘密法宝—…

将本地项目提交到新建的git仓库

方式一: # 登录git,新建git仓库和指定的分支,如master、dev# 下载代码,默认下载master分支 git clone http://10.*.*.67/performance_library/pfme-*.git # 切换到想要提交代码的dev分支 git checkout dev# 添加想要提交的文件 git add .#…

.NET平台用C#在PDF中创建可交互的表单域(Form Field)

在日常办公系统开发中,涉及 PDF 处理相关的开发时,生成可填写的 PDF 表单是一种常见需求,例如员工信息登记表、用户注册表、问卷调查或协议确认页等。与静态 PDF 不同,带有**表单域(Form Field)**的文档支持…

在macOS上安装windows系统

使用Boot Camp 1. 准备工作:确认Mac满足Boot Camp系统要求,准备好Windows安装光盘或ISO映像文件,以及一个至少8GB的空白USB闪存驱动器用于保存驱动程序。 2. 打开Boot Camp助理:在“应用程序”文件夹的“实用工具”中找到“Boot…

683SJBH基于J2EE的广州旅游管理系统

第1章  绪论 课题背景 自互联网internet成为一种革命性的大众媒体以来,其发展速度之快令人惊叹。而作为世界最大朝阳产业的旅游,当它与电子商务这一新兴模式相结合时,其潜藏的商业价值表露无遗。根据CNN(美国有线电视新闻网&…

前端面试每日三题 - Day 27

这是我为准备前端/全栈开发工程师面试整理的第27天每日三题练习,涵盖了: CSS选择器的优先级与权重计算机制Angular中的依赖注入(Dependency Injection)机制设计一个支持实时协作编辑(如Google Docs)的前端…

PostgreSQL数据库操作SQL

数据库操作SQL 创建 创建数据库 create database db_test;创建并指定相关参数 with owner : 所有者encoding : 编码connection limit :连接限制 create database db_test1 with owner postgresencoding utf-8connection limit 100;修改 修改数据库名称 renam…

JSP HTTP 状态码详解

JSP HTTP 状态码详解 引言 HTTP 状态码是 HTTP 协议的一部分,用于表示客户端与服务器之间请求与响应的状态。在 JavaServer Pages (JSP) 技术中,HTTP 状态码同样扮演着重要的角色。本文将详细解析 JSP 中的 HTTP 状态码,帮助开发者更好地理解和应用这些状态码。 HTTP 状态…

文件一键解密软件工具(支持pdf、word、excel、ppt、rar、zip格式文件)

一键解密解锁神器支持解密pdf、doc、docx、xls、xlsx、ppt、pptx、rar、zip格式文件,Excel表格、Word文档、PPT演示、RAR、ZIP压缩包、PDF文档一键轻松解密!简单/高效/安全。这款软件由密码帝官方提供,确保了其合法性和安全性,用户…

Banana Pi BPI-CM6 是一款八核 RISC-V 模块,兼容 Raspberry Pi CM 载板

Banana Pi BPI-CM6 是一款 SpacemIT K1 八核 RISC-V 系统级模块,遵循 Raspberry Pi CM5 的设计,并提供高达 16GB LPDDR4 RAM、高达 128GB eMMC 闪存、千兆以太网控制器和 WiFi 6 蓝牙 5.2 模块。 BPI-CM6 虽然与 Raspberry Pi CM5 基本兼容&#xff0c…

【项目篇之统一硬盘操作】仿照RabbitMQ模拟实现消息队列

统一硬盘操作 创建出实例封装交换机的操作封装队列的操作封装绑定的操作封装消息的操作总的完整代码: 我们之前已经使用了数据库去管理交换机,绑定,队列 还使用了数据文件去管理消息 此时我们就搞一个类去把上述两个部分都整合在一起&#…