【30天玩转python】单元测试与调试

news2024/9/22 5:20:06

单元测试与调试

在 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 是否等于 3
        self.assertEqual(add(-1, 1), 0) # 测试 -1 + 1 是否等于 0
        self.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 unittest

def divide(a, b):
    if b == 0:
        raise ValueError("除数不能为零")
    return a / b

class TestDivideFunction(unittest.TestCase):

    def test_divide(self):
        self.assertEqual(divide(10, 2), 5)
        self.assertRaises(ValueError, divide, 10, 0)  # 检查是否抛出 ValueError

if __name__ == '__main__':
    unittest.main()
2.3 测试套件

当有多个测试类或测试方法时,可以将它们组织到测试套件(test suite)中,通过一次运行来测试多个功能。

def suite():
    suite = unittest.TestSuite()
    suite.addTest(TestMathFunctions('test_add'))
    suite.addTest(TestDivideFunction('test_divide'))
    return suite

if __name__ == '__main__':
    runner = unittest.TextTestRunner()
    runner.run(suite())

3. 使用 pytest 进行单元测试

除了 unittest,Python 中还有更简洁的第三方测试框架,如 pytestpytest 提供了更灵活的断言方式和更简单的测试用例编写方式。

3.1 pytest 示例

使用 pytest 时,不需要像 unittest 那样创建测试类,只需编写简单的测试函数即可。pytest 通过函数名称的前缀 test_ 自动识别测试用例。

示例:使用 pytest 测试加法函数

# 被测试函数
def add(a, b):
    return a + b

# 测试函数
def test_add():
    assert add(1, 2) == 3
    assert add(-1, 1) == 0
    assert add(1, 2) != 4

运行 pytest 时,只需在终端中执行 pytest 命令,它会自动寻找所有以 test_ 开头的函数并运行测试。


4. 调试方法

调试是编程过程中非常重要的一部分,Python 提供了多种调试方法,最常用的是 pdb 模块和 print() 调试。

4.1 使用 print() 进行调试

最简单的调试方式是通过在代码中插入 print() 函数,查看变量的值或函数的执行情况。虽然简单,但当项目较大或逻辑复杂时,print() 调试会变得混乱且难以维护。

示例:print() 调试

def add(a, b):
    result = a + b
    print(f"add({a}, {b}) = {result}")
    return result

add(5, 3)

尽管 print() 调试是快速查看问题的方法,但在大型项目中,建议使用更专业的调试工具。

4.2 使用 pdb 模块

pdb 是 Python 内置的调试器,可以让我们逐行执行代码,查看变量的状态,设置断点等。使用 pdb.set_trace() 可以在代码中设置断点,进入调试模式。

示例:使用 pdb 进行调试

import pdb

def add(a, b):
    pdb.set_trace()  # 在此处设置断点
    return a + b

add(5, 3)

运行上面的代码后,程序会在 pdb.set_trace() 处暂停,我们可以在终端中输入调试命令,比如:

  • n:执行下一行代码
  • c:继续运行代码直到下一个断点
  • p variable_name:打印变量的值
  • q:退出调试器
4.3 使用 VSCode 进行调试

VSCode 提供了集成的调试功能,通过图形化界面设置断点、逐行执行代码以及查看变量状态。以下是使用 VSCode 调试 Python 代码的步骤:

  1. 打开 VSCode 并加载 Python 项目。
  2. 在代码的某行点击左侧的灰色区域设置断点。
  3. 点击 VSCode 窗口左侧的“运行和调试”按钮(或按 F5)启动调试模式。
  4. 调试时可以单步执行、跳过、继续运行等操作。

5. 代码覆盖率

代码覆盖率(Code Coverage)是衡量单元测试对代码的覆盖程度的指标,通常包括语句覆盖、分支覆盖等。高覆盖率的测试可以帮助我们发现潜在的代码问题。

Python 提供了 coverage 工具来生成代码覆盖率报告。

安装 coverage

pip install coverage

生成覆盖率报告

coverage run -m unittest discover  # 运行测试
coverage report  # 生成覆盖率报告
coverage html  # 生成 HTML 格式的覆盖率报告

6. 小结

  • 单元测试 是开发过程中验证代码正确性的重要工具,Python 中的 unittestpytest 框架可以帮助我们轻松编写测试用例。
  • 调试 是定位错误的关键步骤,除了简单的 print() 调试,还可以使用专业的 pdb 调试器以及 IDE 集成的调试功能。
  • 通过良好的单元测试和调试习惯,可以有效提升代码质量,减少错误,并保证项目的长期维护性。

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

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

相关文章

828华为云征文 | 云服务器Flexus X实例:开源项目 LangChain 部署,实例测试

目录 一、LangChain 介绍 二、部署 LangChain 2.1 安装 langchain 2.2 安装 langchain_community 2.3 安装 qianfan 三、实例运行 3.1 Chat Models 3.2 LLMs 3.3 Embedding Models 四、总结 本篇文章主要通过 Flexus云服务器X实例 部署开源项目 LangChain&#xff0c…

【Delphi】通过 LiveBindings Designer 链接控件示例

本教程展示了如何使用 LiveBindings Designer 可视化地创建控件之间的 LiveBindings,以便创建只需很少或无需源代码的应用程序。 在本教程中,您将创建一个高清多设备应用程序,该应用程序使用 LiveBindings 绑定多个对象,以更改圆…

[SAP ABAP] 生成表维护视图

SAP由于数据量较大,很多自定义表都需要通过用户自行去维护,一般可以直接在SE16N对数据字典进行维护数据,但不是每个用户都有其操作权限,而且直接在数据字典上操作数据有很高的风险,因此SAP提供了表维护视图生成器&…

算法学习2

学习目录 一.插入排序 一.插入排序 从数组的第一个元素开始,当前元素与其前一个元素进行比较; 大于(或小于时)将其进行交换,即当前元素替换到前一位; 再将该元素与替换后位置的前一个元素进行交换&#xf…

【全网最全】2024年华为杯研赛A题保奖思路+matlab/py代码+成品论文等(后续会更新完整

您的点赞收藏是我继续更新的最大动力! 一定要点击如下卡片链接,那是获取资料的入口! 点击链接加入【2024华为杯研赛资料汇总】:https://qm.qq.com/q/goQLLNwfgQhttps://qm.qq.com/q/goQLLNwfgQ A 风电场有功功率优化分配思路 这是…

分页插件、代码生成器

01-分页插件、代码生成器 分页插件使用 首先在pom.xml文件中导入依赖 然后再mybatis-config.xml文件中写入插件 在测试类中写入方法 在mybatis.xml文件中设置plugins标签里的属性helperDialectkeyi自动检查当前数据库用的什么,不用设置也行,默认就设置了 分页插件里面属性详解…

XXL-JOB分片概念讲解

3. 分片功能讲解 3.1 案例需求: 1.我们现在实现这样的需求,在指定节假日,需要给平台的所有用户去发送祝福的短信 3.2.编码实现: a.初始化数据 1.在数据库中导入xxl_job_demo.sql数据 b.集成Druid&MyBatis 1.添加依赖 &…

VisualPromptGFSS

COCO-20 i ^i i太大,不建议复现

利士策分享,华为三折叠手机:重塑未来科技生活的里程碑

利士策分享,华为三折叠手机:重塑未来科技生活的里程碑 在这个日新月异的科技时代,华为再次以惊人的创新力,引领我们迈向智能设备的全新纪元——华为三折叠手机, 不仅是技术的飞跃,更是对未来生活方式的一次…

初识set,map

已知快速查找: 1.暴力查找 2.排序二分查找(插入删除麻烦) 3.搜索树->二叉搜索树(极端情况n)->平衡树(AVL树,红黑树)(logn高度太高,搜索次数多)->多叉平衡搜索…

发现编程的全新境界——明基RD280U显示器使用体验

前言 在大学的四年里,我几乎每天都泡在实验室,盯着电脑屏幕,一行行地码代码。那时,学校提供的显示器是非常基础的款式,功能简单,几乎没有任何特别之处,甚至配置也比较低。那个时候,…

【MySQL 01】数据库基础

目录 1.数据库是什么 2.基本操作 数据库服务器连接操作 数据库和数据库表的创建 服务器,数据库,表关系 数据逻辑存储 3.MySQL架构 4.SQL分类 5.存储引擎 1.数据库是什么 mysql&&mysqld: mysql:这通常指的是 MySQL …

PMBOK® 第六版 排列活动顺序

目录 读后感—PMBOK第六版 目录 职场中有句玩笑话:“工作是永远做不完的,任何时候都不可能做完。”这里所吐槽的要点就在于工作任务繁多以及工作缺乏秩序。工作确实是做不完的,倘若工作都能完成,那也就不需要工作了。 工作中令人…

统信服务器操作系统【搭建FTP】设置介绍

如何在操作系统上安装vsftp服务。设置匿名用户登录、设置授权用户密码访问功能,并介绍使用匿名方式、授权用户方式访问vsftp服务。本文适用于A、D、E三个服务器操作系统版本,除安装方式的差异,其他设置均相同。 文章目录 功能概述一、功能介绍二、准备环境三、安装步骤1. 在…

MoFA: 迈向AIOS

再一次向朋友们致以中秋的祝福! MoFA (Modular Framework for Agents)是一个独特的模块化AI智能体框架。MoFA以组合(Composition)的逻辑和编程(Programmable)的方法构建AI智能体。开发者通过模版的继承、编程、定制智能体&#xf…

MobaXterm : Network error: Connection refused(连接被拒绝)

具体报错如下如所示: 首先进行问题排查 ① 检查SSH服务是否运行 sudo service ssh status ② 检查SSH服务是否已启动(启用返回 enable) sudo systemctl is-enabled ssh ③ 查看所有的端口 sudo netstat -tulnp ④ 查看SSH使用的22号端口有…

部标(JT/T1078)流媒体对接说明

1.前言 最近在配合客户开发流媒体相关的服务的时候,整理了一些对接过程资料,这里做个分享与记录。流媒体的对接主要牵扯到4个方面: (1)平台端:业务端系统,包含前端呈现界面。 (2&a…

Spring IDEA 2024 自动生成get和set以及toString方法

1.简介 在IDEA中使用自带功能可以自动生成get和set以及toString方法 2.步骤 在目标类中右键,选择生成 选择Getter和Setter就可以生成每个属性对应的set和get方法, 选择toString就可以生成类的toString方法,

推荐一款PS VR2电脑PC适配器 / 转接板方案

一、引言 随着虚拟现实技术的不断发展,PS VR2 为用户带来了沉浸式的游戏和娱乐体验。然而,为了让 PS VR2 能够与电脑连接,充分发挥其性能并拓展使用场景,需要开发一款电脑适配器 / 转接板。本技术文档方案旨在详细阐述该适配器 / …

Linux软件包管理器、Linux开发工具、vim的配置等的介绍

文章目录 前言一、Linux软件包管理器yum二、Linux开发工具1. 命令模式2. 插入模式3. 底行模式4. 三种模式的切换5. 命令模式下的快捷键 三、vim的配置总结 前言 Linux软件包管理器、Linux开发工具、vim的配置等的介绍 一、Linux软件包管理器yum 关于rzsz 这个工具用于 window…