【30天玩转python】单元测试与调试
单元测试与调试
在 Python 开发中,编写单元测试和进行调试是保证代码质量、减少错误的重要步骤。单元测试可以帮助我们验证代码功能是否符合预期,调试则可以在代码出现问题时快速定位错误原因。
1. 单元测试简介
单元测试是对程序中最小可测试部分(通常是函数或类)进行验证的过程,确保每个部分都能正常工作。Python 中有多个测试框架,其中最常用的是 unittest 模块。
2. 使用 unittest 进行单元测试
unittest 是 Python 标准库中的单元测试框架,类似于其他语言中的 JUnit、NUnit 等。它可以用于创建测试用例、测试集以及对代码进行断言。
2.1 基本结构
要使用 unittest 进行单元测试,通常需要创建一个测试类,该类继承自 unittest.TestCase。在这个类中,编写测试方法,并使用 assert 系列方法来验证代码的输出。
示例:简单的加法函数测试
import unittest# 被测试函数
def add(a, b):return a + b# 创建测试类,继承 unittest.TestCase
class TestMathFunctions(unittest.TestCase):# 测试 add 函数def test_add(self):self.assertEqual(add(1, 2), 3) # 测试 1 + 2 是否等于 3self.assertEqual(add(-1, 1), 0) # 测试 -1 + 1 是否等于 0self.assertNotEqual(add(1, 2), 4) # 测试 1 + 2 不等于 4# 运行测试
if __name__ == '__main__':unittest.main()
2.2 断言方法
unittest 提供了多种断言方法,用于验证不同的测试结果:
| 断言方法 | 描述 |
|---|---|
assertEqual(a, b) | 检查 a == b 是否为 True |
assertNotEqual(a, b) | 检查 a != b 是否为 True |
assertTrue(x) | 检查 x 是否为 True |
assertFalse(x) | 检查 x 是否为 False |
assertIsNone(x) | 检查 x is None 是否为 True |
assertIsNotNone(x) | 检查 x is not None 是否为 True |
assertIn(a, b) | 检查 a 是否包含在 b 中 |
assertNotIn(a, b) | 检查 a 是否不包含在 b 中 |
assertRaises(Exception) | 检查是否抛出了指定的异常 |
示例:更多断言方法
import unittestdef divide(a, b):if b == 0:raise ValueError("除数不能为零")return a / bclass TestDivideFunction(unittest.TestCase):def test_divide(self):self.assertEqual(divide(10, 2), 5)self.assertRaises(ValueError, divide, 10, 0) # 检查是否抛出 ValueErrorif __name__ == '__main__':unittest.main()
2.3 测试套件
当有多个测试类或测试方法时,可以将它们组织到测试套件(test suite)中,通过一次运行来测试多个功能。
def suite():suite = unittest.TestSuite()suite.addTest(TestMathFunctions('test_add'))suite.addTest(TestDivideFunction('test_divide'))return suiteif __name__ == '__main__':runner = unittest.TextTestRunner()runner.run(suite())
3. 使用 pytest 进行单元测试
除了 unittest,Python 中还有更简洁的第三方测试框架,如 pytest。pytest 提供了更灵活的断言方式和更简单的测试用例编写方式。
3.1 pytest 示例
使用 pytest 时,不需要像 unittest 那样创建测试类,只需编写简单的测试函数即可。pytest 通过函数名称的前缀 test_ 自动识别测试用例。
示例:使用 pytest 测试加法函数
# 被测试函数
def add(a, b):return a + b# 测试函数
def test_add():assert add(1, 2) == 3assert add(-1, 1) == 0assert add(1, 2) != 4
运行 pytest 时,只需在终端中执行 pytest 命令,它会自动寻找所有以 test_ 开头的函数并运行测试。
4. 调试方法
调试是编程过程中非常重要的一部分,Python 提供了多种调试方法,最常用的是 pdb 模块和 print() 调试。
4.1 使用 print() 进行调试
最简单的调试方式是通过在代码中插入 print() 函数,查看变量的值或函数的执行情况。虽然简单,但当项目较大或逻辑复杂时,print() 调试会变得混乱且难以维护。
示例:print() 调试
def add(a, b):result = a + bprint(f"add({a}, {b}) = {result}")return resultadd(5, 3)
尽管 print() 调试是快速查看问题的方法,但在大型项目中,建议使用更专业的调试工具。
4.2 使用 pdb 模块
pdb 是 Python 内置的调试器,可以让我们逐行执行代码,查看变量的状态,设置断点等。使用 pdb.set_trace() 可以在代码中设置断点,进入调试模式。
示例:使用 pdb 进行调试
import pdbdef add(a, b):pdb.set_trace() # 在此处设置断点return a + badd(5, 3)
运行上面的代码后,程序会在 pdb.set_trace() 处暂停,我们可以在终端中输入调试命令,比如:
n:执行下一行代码c:继续运行代码直到下一个断点p variable_name:打印变量的值q:退出调试器
4.3 使用 VSCode 进行调试
VSCode 提供了集成的调试功能,通过图形化界面设置断点、逐行执行代码以及查看变量状态。以下是使用 VSCode 调试 Python 代码的步骤:
- 打开 VSCode 并加载 Python 项目。
- 在代码的某行点击左侧的灰色区域设置断点。
- 点击 VSCode 窗口左侧的“运行和调试”按钮(或按
F5)启动调试模式。 - 调试时可以单步执行、跳过、继续运行等操作。
5. 代码覆盖率
代码覆盖率(Code Coverage)是衡量单元测试对代码的覆盖程度的指标,通常包括语句覆盖、分支覆盖等。高覆盖率的测试可以帮助我们发现潜在的代码问题。
Python 提供了 coverage 工具来生成代码覆盖率报告。
安装 coverage
pip install coverage
生成覆盖率报告
coverage run -m unittest discover # 运行测试
coverage report # 生成覆盖率报告
coverage html # 生成 HTML 格式的覆盖率报告
6. 小结
- 单元测试 是开发过程中验证代码正确性的重要工具,Python 中的
unittest和pytest框架可以帮助我们轻松编写测试用例。 - 调试 是定位错误的关键步骤,除了简单的
print()调试,还可以使用专业的pdb调试器以及 IDE 集成的调试功能。 - 通过良好的单元测试和调试习惯,可以有效提升代码质量,减少错误,并保证项目的长期维护性。
相关文章:
【30天玩转python】单元测试与调试
单元测试与调试 在 Python 开发中,编写单元测试和进行调试是保证代码质量、减少错误的重要步骤。单元测试可以帮助我们验证代码功能是否符合预期,调试则可以在代码出现问题时快速定位错误原因。 1. 单元测试简介 单元测试是对程序中最小可测试部分&…...
13.第二阶段x86游戏实战2-动态模块地址
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要…...
【WebLogic】WebLogic 11g 控制台模式下安装记录
WebLogic 11g的安装有三种方式: 1)GUI图形化模式; 2)控制台模式; 3)静默模式; 下面为大家展示下控制台模式下的安装过程记录,整个安装过程大部分都是回车,仅在【接收…...
失踪人口回归(明天开始继续更新学习内容)
从明天开始继续更新个人学习经验及收获,可能会直接从C入门开始,总结一下C在C的基础上增加的新语法。这篇就当作水贴算了,大家别点赞,留点赞给明天的文章,哈哈 我是安姐的修沟..............
AIGC对网络安全的影响
AIGC对网络安全的影响 引言 人工智能生成内容(AIGC)技术的快速发展对网络安全领域产生了深远影响。AIGC不仅在内容创作、媒体生成等方面展现了强大的能力,还可能被恶意使用,带来新的安全威胁。本文将探讨AIGC对网络安全的影响,列举实际案例,并提供相关建议。 AIGC技术…...
golang学习笔记25——golang 实现 MD5加密、RSA加密 和 Base64编码
推荐学习文档 golang应用级os框架,欢迎stargolang应用级os框架使用案例,欢迎star案例:基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识,这里有免费的golang学习笔…...
2024海外电商数据分析之印度篇
在2024年,印度电商市场继续保持着强劲的增长势头,成为全球电商领域中的一个亮点。根据Inc42发布的《2024年上半年印度电商市场报告》,印度电商市场规模已经达到1160亿美元,预计在2023年至2030年间,将以19%的复合年增长…...
JavaWeb纯小白笔记02:Tomcat的使用:发布项目的三种方式、配置虚拟主机、配置用户名和密码
通过Tomcat进行发布项目的目的是为了提供项目的访问能力:Tomcat作为Web服务器,能够处理HTTP请求和响应,将项目的内容提供给用户进行访问和使用。 一.Tomcat发布项目的三种方式: 第一种:直接在Tomcat文件夹里的webapp…...
为什么数据需要 QA 流程
当有人问我做什么工作时,我会说我是一名数据质量保证 (QA) 工程师。他们并不真正理解我的意思。“嗯,我做数据测试,”我试图解释,但常常无济于事。我有一些从事技术和软件开发的朋友,他们不太了解数据测试是什么&#…...
Spring Boot 学习之路 -- 基础认知
前言 最近因为业务需要,被拉去研究后端的项目,代码框架基于 Spring Boot,对我来说完全小白,需要重新学习研究…出于个人习惯,会以 Blog 文章的方式做一些记录,文章内容基本来源于「 Spring Boot 从入门到精…...
JavaScript --json格式字符串和对象的转化
json字符串解析成对象 : var obj JSON.parse(str) 对象转化成字符串:var str1 JSON.stringify(obj1) <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Com…...
LabVIEW提高开发效率技巧----采用并行任务提高性能
在复杂的LabVIEW开发项目中,合理利用并行任务可以显著提高系统的整体性能和响应速度。并行编程是一种强大的技术手段,尤其适用于实时控制、数据采集以及多任务处理等场景。LabVIEW的数据流编程模型天然支持并行任务的执行,结合多核处理器的硬…...
裸土检测算法实际应用、裸土覆盖检测算法、裸土检测算法
裸土检测算法主要用于环境保护、农业管理、城市规划和土地管理等领域,通过图像识别技术来检测和识别地表上的裸露土壤。这种技术可以帮助管理者实时监控裸土面积,及时采取措施,防止水土流失、环境污染和生态退化。 一、技术实现 裸土检测算…...
深入剖析链表反转:多语言实现与高级语法特性20240924
深入剖析链表反转:多语言实现与高级语法特性 引言 在数据结构与算法的学习中,链表是基础结构之一,尤其在动态内存分配和操作中体现了它的重要性。今天,我们将通过反转单链表这一经典算法题,从不同编程语言的角度进行…...
【数据结构初阶】链式二叉树接口实现超详解
文章目录 1. 节点定义2. 前中后序遍历2. 1 遍历规则2. 2 遍历实现2. 3 结点个数2. 3. 1 二叉树节点个数2. 3. 2 二叉树叶子节点个数2. 3. 3 二叉树第k层节点个数 2. 4 二叉树查找值为x的节点2. 5 二叉树层序遍历2. 6 判断二叉树是否是完全二叉树 3. 二叉树性质 1. 节点定义 用…...
力扣189 轮转数组 Java版本
文章目录 题目描述代码 题目描述 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4…...
RMAN异机恢复数据库记录
场景:数据库服务器宕机,无法恢复 处理:使用备份资料进行异地恢复 1.此处环境为同平台、同版本(操作系统版本可以不同,但数据库版本需相同),源机器和目标机器具有相同的目录结构。 2.目标机器只…...
JVM 调优篇7 调优案例4- 线程溢出
一 线程溢出 1.1 报错信息 每个 Java 线程都需要占用一定的内存空间,当 JVM 向底层操作系统请求创建一个新的 native 线程时,如果没有足够的资源分配就会报此类错误。报错信息:java.lang.outofmemoryError:unable to create new Native Thr…...
C++类与对象(三)
目录 1.再谈构造函数 1.1 构造函数体赋值 1.2 初始化列表 1.3 explicit关键字 2.STATIC成员 2.1 概念 2.2 特性 3.C中成员初始化的新玩法 4.友元 4.1 友元函数 4.2 友元类 5.内部类 6.再次理解封装 7.再次理解面向对象 本次内容大纲: 1.再谈构造函数 …...
云栖实录 | 阿里云 OpenLake 解决方案重磅发布:多模态数据统一纳管、引擎平权联合计算、数据共享统一读写
新一轮人工智能浪潮正在重塑世界,以生成式 AI 为代表的技术快速应用,推动了数据与智能的深化融合,同时也给数据基础设施带来了全新的变革与挑战。面向 AI 时代的数据基础设施如何构建?底层数据平台架构在 AI 时代如何演进…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...
