Python 单元测试

Python单元测试之道:从入门到精通 单元测试是软件开发中不可或缺的一部分,有助于确保代码的正确性、可维护性和可扩展性。在Python中,有丰富的工具和库可用于进行单元测试。 阅读详情

软件测试即是一种实际输出与预期输出间的审核或者比较过程

什么是单元测试

  1. 什么是单元

    代码逻辑中的最小可复用部分:类、函数等

  2. 单元测试的目标

    详细验证所有(一般以代码覆盖率为指标)实现代码的执行逻辑,尤其是各种边界条件

为什么要写单元测试

程序单元作为应用的最小可测试部件。测试能够保证程序的强壮性,也能促使重新思考代码的设计,避免写出耦合严重的代码。

简单来说,就是能够确保代码质量,能够帮助我们较早地发现 Bug;能够改善代码设计,难以测试的代码一般是设计不够简洁的代码;保证重构不会引入新问题,每次修改之前代码的时候,只需重新跑测试代码就能避免新改动的代码对现有代码产生影响。

何时进行单元测试

  • 扩展实现代码时(实现新功能时)
  • 修改现有代码时(代码重构)
  • 任何代码提交时(CI)

如何保证单元测试的隔离性

  1. 单元测试的隔离性问题

    一般我们写的代码,常基于别人的 API 代码构建,同时,我们的代码也常作为别人的 API 代码被调用。在进行单元测试时,实际外部依赖可能包含复杂计算或者存在网络请求,成本较高,不适合重复执行。例如,我们代码依赖的 API 并没有被实现和被提供,比如我们的代码作为C/S模式中的客户端依赖服务端的某个 HTTP 服务;或者,我们的代码运行时可能会对周围代码产/生负面影响,比如发送一个修改数据库数据、发送电子邮件,显然不适合每次执行都真实地进行这些数据修改或者网络请求。

  2. 如何保证单元测试的隔离性

  • 使用 Mock/Stub/Fake 替换外部依赖
  • 指定替换逻辑的行为
  • 验证带测试逻辑的行为

Python 单元测试相关包

  • unittest: Python 内置库,优点是简洁易用,缺点是使用时比较繁琐
  • pytest:上手容易,使用起来简洁高效
  • mock: 替换掉网络调用或者 rpc 请求等

例子

下面是一个关于几何圆的代码单元测试例子,以说明单元测试在修改现有代码时的作用。

  1. 圆的实现代码 (circle.py)

    # -*- coding: utf-8 -*-
    # @File    : circle.py
    from math import pi
    # pi = 3.14 # 后面会修改代码所依赖的 PI 的值,并进行单元测试
    
    class Circle(object):
        """docstring for Circle"""
    
        def __init__(self, radius):
            super(Circle, self).__init__()
            self.radius = radius
    
        @property
        def diameter(self):
            """
            圆的直径
            :return:  直径
            """
            return 2 * self.radius
    
        @diameter.setter
        def diameter(self, value):
            """
            设置直径
            :param value: 直径的值
            :return: None
            """
            self.radius = value / 2.0
    
        @diameter.deleter
        def diameter(self):
            raise AttributeError("Can't delete attribute")
    
        @property
        def perimeter(self):
            """
            圆的周长
            :return: 周长
            """
            return 2 * pi * self.radius
    
        @perimeter.setter
        def perimeter(self, value):
            self.radius = value / pi / 2.0
    
        @perimeter.deleter
        def perimeter(self):
            raise AttributeError("Can't delete attribute")
    
        @property
        def area(self):
            """
            圆的面积
            :return: 面积
            """
            return pi * (self.radius ** 2)
    
        @area.setter
        def area(self, value):
            self.radius = (value / pi) ** (1 / 2)
    
        @area.deleter
        def area(self):
            raise AttributeError("Can't delete attribute")
    
    
    def print_circle_info(c1):
        print("radius: {}".format(c1.radius))
        print("diameter: {}".format(c1.diameter))
        print("perimeter: {}".format(c1.perimeter))
        print("area: {}".format(c1.area))
    
    
    if __name__ == '__main__':
        c1 = Circle(1)
        print_circle_info(c1)
    
        print("\n================")
        print("set diameter to 4")
        print("================")
        c1.diameter = 4
        print_circle_info(c1)
    
        print("\n================")
        print("set perimeter to 6.28")
        print("================")
        c1.perimeter = 6.28
        print_circle_info(c1)
    
  2. 单元测试代码 ( test_circle_pytest.py )

    # -*- coding: utf-8 -*-
    # @File    : test_circle_pytest.py
    import pytest
    
    from circle import Circle
    
    
    class TestCirclePytest:
        def test_init(self):
            c0 = Circle(1)
            assert c0.radius == 1
    
        def test_diameter(self):
            c0 = Circle(2)
            assert c0.diameter == 4
    
            c0.diameter = 8
            assert c0.diameter == 8
    
            with pytest.raises(AttributeError):
                del c0.diameter
    
        def test_perimeter(self):
            c0 = Circle(1)
            assert c0.perimeter - 6.28318 == pytest.approx(0, abs=1E-5)
    
            c0.perimeter = 6.28
            assert c0.perimeter == 6.28
            assert abs(c0.radius - 1.0) == pytest.approx(0, abs=0.01)
    
            with pytest.raises(AttributeError):
                del c0.perimeter
    
        def test_area(self):
            c0 = Circle(1)
            assert c0.area - 3.14159 == pytest.approx(0, abs=1E-5)
    
            c0.area = 3.14
            assert c0.area == 3.14
    
            with pytest.raises(AttributeError):
                del c0.area
    
  3. 代码实现后的单元测试结果

    unittest

    代码实现后,运行单元测试代码,显然,结果显示代码实现基本没问题

  4. 修改代码中的某些部分

    实际写代码的时候,总会因为某些需求,会需要修改现已实现的代码。为了模拟,这种需求,这里我们修改代码所依赖的 PI 值。修改 circle.py 中的 PI 值为 3.14 :

    # -*- coding: utf-8 -*-
    # @File    : circle.py
    # from math import pi  # 去掉之前的 PI 值的定义
    pi = 3.14
    
    其他代码省略 ...
    
  5. 修改代码后重新运行单元测试代码

unittest2
从运行结果可以看到,修改 pi 的值后,单元测试中部分测试样例没有通过,分析可以发现,主要是因为 pi 值的精度达不到我们测试代码的要求。将 PI 值修改为 3.141592526 显然就可以,甚至可以一点点增加 PI 的精度,直到通过单元测试。

参考链接

  1. Python 单元测试 —— 知乎

  2. 单元测试 —— 廖雪峰的个人网站

    • 单元测试可以有效地测试某个程序模块的行为,是未来重构代码的信心保证。
    • 单元测试的测试用例要覆盖常用的输入组合、边界条件和异常。
    • 单元测试代码要非常简单,如果测试代码太复杂,那么测试代码本身就可能有bug。
    • 单元测试通过了并不意味着程序就没有bug了,但是不通过程序肯定有bug。
  3. python单元测试框架pytest简介 —— 优快云 博客

  4. Python测试框架 - Pytest

  5. 用 pytest 测试 python 代码

  6. Mock 在 Python 单元测试中的使用

python单元测试之unittest python单元测试之unittest 一:单元测试,集成测试,功能测试 单元测试 颗粒度最小,一般由开发小组采用白盒方式来测试,主要测试单元是否符合“设计”;是指对软件中的最小可测试单元进行检查和验证 集成测试 介于单元测试和系统测试之间,一般由开发小组采用白盒+黑盒的方法来测试,即验证“设计”又验证“需求”。主要用来测试模板与模板之间的接口,同时还要测试一些主要的业务功能。 功能测试 颗粒度最大,一般由独立的测试小组采用黑盒的方式来测试,主要测试系统是否符合“需求规格说明书 问题:什么是白盒 阅读详情

相关推荐

python单元测试怎么写_python--单元测试

1.单元测试是什么?单元测试(又称为模块测试, Unit Testing)是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。单元测试粒度最小,一般由开发人员采用白盒方式来测试,主要测试单元是否符合设计。单元测试...

weixin_42515906的博客 1556

Python测试 | 在python中创建单元测试

新钛云服已累计为您分享710篇技术干货作为开发人员或程序员, 只要编写代码,通常就会忽略一件事:测试。测试是开发的一部分,您应该严格测试应用程序,以确保它们满足必需的功能。让我们先从为什么要做测试开始:1、减少手动测试的需求因为测试用例是预先编写的,所以没有真正的理由再进行手动测试。大多数时候,特别是对于大型应用程序,您必须在软件中运行许多阶段,以测试某个特性是否有效。这可以通过测试来避免。想象一...

NewTyun的博客 3222

unittest单元测试实战

unittest 是 python 自带的一个单元测试框架,类似于 java 的 junit,基本结构是类似的。unittest 中有 5 个重要的概念:TestCase、TestSuite、TestRunner、TestLoader、TestFixtureTestcase:一个 TestCase 的实例就是一个测试用例。什么是测试用例呢?就是一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试代码(run),以及测试后环境的还原(tearDown)。

悦分享 2198

用Python进行单元测试

Python编程语言,不仅仅在机器学习、数据分析等领域大放异彩,在web开发中等软件开发中,使用者也越来越多。 在软件开发中,有一种被提倡的开发范式:测试驱动开发。在这种开发范式中,编写单元测试是必不可少的。如果不实施严格的测试驱动开发,编写单元测试程序也是必要的。 对于单元测试而言,最基本的模块是pytest,在本文中会对这个模块给予简要介绍。此外,还有一个现在很流行的模块fizz buzz,本文也会向读者推荐。 为什么要自动化测试 并非所有人都理解自动化测试的必要性,有人甚至认为纯粹是个负担,他们认为

计算机科学、人工智能、数据分析和大数据方向的研发和教学。 4889

SquareLine Studio汉化版安装激活全攻略:LVGL嵌入式UI设计从入门到出代码

嵌入式GUI开发中,LVGL作为轻量级开源图形库,广泛应用于STM32、ESP32等MCU平台。可视化设计器通过拖拽生成LVGL代码,大幅提升UI开发效率。SquareLine Studio正是这类工具的代表,支持界面设计、事件绑定与代码导出。其安装、汉化与激活是初学者常见门槛,尤其涉及LVGL版本匹配、字体配置及FreeRTOS移植等关键环节。本文围绕汉化版安装、一个月免费激活码使用及最小可用流程展开,帮助开发者快速上手LVGL界面设计,规避常见环境与集成问题。

weixin_29189987的博客 417

Mcgs 屏幕Modbus RTU通讯调试

昆仑通态屏幕作为Modbus Master 与 Modbus Slave通过RS485接口实现通信的调试记录

madao1234的博客 5570

Python单元测试

Python单元测试

summerriver1的博客 2105

干扰管理学习日志4-------信道估计方法 LS(最小二乘)、MMSE(最小均方误差)

信道估计,就是从接收数据中将假定的某个信道模型的模型参数估计出来的过程。如果信道是线性的话,那么信道估计就是对系统冲激响应进行估计。需强调的是信道估计是信道对输入信号影响的一种数学表示,而“好”的信道估计则是使得某种估计误差最小化的估计算法。本文主要讲述非盲信道估计中的LS估计和MMSE估计。LS全称为,即估计的信道参数与实际信道参数的差,进行平方求和后得到的误差累积最小。MMSE估计是LS估计的改进,在LS估计的最终结果的基础上乘以加权矩阵,使之与实际信道参数更为接近。

taiyuezyh的博客 1万+

Python 单元测试详解

作者:yukkizhang,腾讯 CSIG 测试工程师本文直接从常用的 Python 单元测试框架出发,分别对几种框架进行了简单的介绍和小结,然后介绍了 Mock 的框架,以及测试报告生成...

腾讯技术工程 8588

Windows下Python安装geopandas全攻略:解决GDAL依赖问题的5个关键步骤

本文详细解析了在Windows系统下安装Python地理空间分析库geopandas时,如何有效解决其核心依赖GDAL的编译难题。文章提供了五个关键步骤,包括理解依赖关系、获取预编译wheel文件、顺序安装及环境验证,旨在帮助用户绕过复杂的C++编译环境,顺利完成geopandas的安装部署。

weixin_28221501的博客 284

华硕主板UEFI模式下安装Ubuntu与Windows双系统全攻略

本文详细讲解了在华硕主板UEFI模式下安装Ubuntu与Windows双系统的完整流程。从安装前的BIOS关键设置(如处理安全启动与CSM)、使用GPT分区表,到在Windows中安全分配空间、手动创建Ubuntu分区,最后完成引导配置,提供了避免常见错误的实用技巧,确保双系统稳定共存。

weixin_29199873的博客 346

Python 面试:单元测试unit testing & 使用pytest

【代码】Python 面试:单元测试unit testing。

weixin_57266891的博客 1461

【强化学习】11 —— Double DQN算法与Dueling DQN算法

可以看到由于数据点的分布,使得拟合出的价值函数无法与真实的价值函数吻合,甚至在部分区域产生了明显的偏差。Dueling DQN 是 DQN 另一种的改进算法,它在传统 DQN 的基础上只进行了微小的改动,但却能大幅提升 DQN 的表现。这样,即使其中一套神经网络的某个动作存在比较严重的过高估计问题,由于另一套神经网络的存在,这个动作最终使用的值不会存在很大的过高估计问题。.在同一个状态下,所有动作的优势值之和为 0,因为所有动作的动作价值的期望就是这个状态的状态价值。环境的状态包括倒立摆角度的正弦值。

sinat_52032317的博客 1万+

在 python 中进行单元测试

单元测试(unit test)就是编写测试来验证某一模块的功能正确性。一般会指定输入,验证输出是否符合预期。 单元测试 进行单元测试,首先要导入 unittest 库。 import unittest 先写一个功能函数,这里以完成加法为例,完成两个数的加法。 def add(a, b): return a + b 为了验证加法函数的功能是否正确,首先创建一个 TestAdd 类,继承类 unittest.TestCase,然后在这个类中定义相应的测试函数 test_add(),测试函数要以 test

算法笨蛋 8174

AI Agent开发第85课-DeepSeek-OCR 安装全指南:从 Transformers 到 vLLM,手把手教你跑通企业级 OCR

本文系统讲解 DeepSeek-OCR 的两种部署方式——基于 Hugging Face Transformers 的标准推理与基于 vLLM 的高性能加速推理。详细说明 CUDA 与 PyTorch 版本匹配、环境验证、依赖安装等关键细节,并提供可直接运行的完整代码示例。无论你是单卡调试还是高并发服务部署,都能在这里找到清晰路径。

打造全国最全的AI Agent开发知识领域的博客 2542

Flutter SDK的删除与重装:一步步教你如何轻松搞定

在Flutter开发过程中,我们可能会遇到一些需要重新安装Flutter SDK的情况,例如升级Flutter版本、解决依赖冲突等。本文将详细介绍如何删除并重新安装Flutter SDK,让你轻松应对各种问题。

理论都是虚的,代码才是王道。 2247

Python中怎么进行单元测试

既然是测试,那我们得有被测试的代码,我们先定义一个简单的函数,这个函数的功能就是接收一个姓名,并返回一句问候语句。 say_hello_function.py 1 def hello_name(name): 2 greet = "Hello , " 3 return greet + name.title() 显然,关于单元测试Python也给我们提供了相应的模块(...

桃子dev的博客 1094

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

python 单元测试_Python 单元测试

简介Python中的单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。如果你听说过“测试驱动开发”(TDD:Test-Driven Development),单元测试就不陌生。单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。比如对函数abs(),我们可以编写出以下几个测试用例:输入正数,比如1、1.2、0.99,期待返回值与输入相同;输入负数...

weixin_39669638的博客 132

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Python 单元测试:八个单元测试框架的使用方法

​ 单元测试是软件开发中不可或缺的一部分,它能够帮助开发者确保代码的质量和稳定性。Python 社区提供了多种单元测试框架,每种框架都有其独特的优势和适用场景。本文将介绍几种常见的 Python 单元测试框架,并通过实际例子帮助读者更好地理解和使用它们。 ​

hlsxjh的博客 742

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

python单元测试入门_python基础——单元测试

python基础——单元测试如果你听说过“测试驱动开发”(TDD:Test-Driven Development),单元测试就不陌生。单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。比如对函数abs(),我们可以编写出以下几个测试用例:输入正数,比如1、1.2、0.99,期待返回值与输入相同;输入负数,比如-1、-1.2、-0.99,期待返回值与输入相反;输入0,期待返回0...

weixin_39544333的博客 252

python单元测试

当你雄心勃勃的写一个大工程的时候,请在你的checklist里写下三个词语:功能函数化,模块化,单元测试。单元测试时伴随在开发过程的自我测试,开发完一个函数,单元测试一下;所以当你写完你的任务时,交给测试人员测试的时候,你心里是充满自信的。当然,你可以不需要unittest这个包,但请你创建test文件夹,创建testXXX.py来测试你的功能。如果你等完成了所有的开发,再来测试,要么来不及测试,要么测一个大概的流程,结果是测试人员无休止的找你。上面的例子,我们要测试类的Func的功能函数,

人工智能微客/aiweker 287

python单元测试框架作用_Python自动单元测试框架

简介: 软件的测试是一件非常乏味的事情,在测试别人编写的软件时尤其如此,程序员通常都只对编写代码感兴趣,而不喜欢文档编写和软件测试这类"没有创新"的工作。既然如此,为什么不让程序员在编写软件时自己加入一些用于测试的代码,使测试过程自动化呢?在软件工程中,这一技术称为自动单元测试,本文介绍在用Python开发软件时如何实现这一目标。一、软件测试大型软件系统的开发是一个很复杂的过程,其中因为人的因素而...

weixin_39835607的博客 1024
上一篇: 提升效率的 Pycharm 功能总结
下一篇: 操作系统: 进程和线程
Mleeeeeee
博客等级 码龄10年 65粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值