Python 新手必看:如何用 unittest 写出高质量代码?

news2024/9/27 19:27:39

文末赠免费精品编程资料~~

在 Python中 ,unittest 模块是进行单元测试的强大工具。无论你是初学者还是有经验的开发者,单元测试都是确保代码质量的重要一环。而 unittest 模块就是让这一过程变得简单、快捷的利器。

什么是单元测试?

在进入 unittest 模块之前,我们先来了解一下单元测试的概念。

单元测试(Unit Test)是指对软件中的最小可测试单元进行验证的测试。通常,这个最小单元是一个函数或方法。通过对这些单元进行测试,我们可以确保每个部分都能独立工作,这有助于在开发过程中发现并修复错误。

为什么要使用单元测试?

  1. 1. 早期发现错误:在代码开发的早期阶段进行单元测试,可以及早发现潜在的问题,减少调试的难度。

  2. 2. 确保代码正确性:通过测试来验证代码的行为,确保代码在各种输入下都能正确运行。

  3. 3. 重构的信心:在重构代码时,单元测试可以帮助确保改动没有引入新的错误。

unittest 模块概览

unittest 是 Python 内置的一个单元测试框架,类似于其他语言中的 JUnit(Java)或 NUnit(.NET)。它提供了一系列用于构建和运行测试的工具,帮助开发者自动化测试流程。

unittest 的基本概念

  • • 测试用例(Test Case):最小的测试单元,通常是一个方法,用于测试代码中的某个特定行为。

  • • 测试套件(Test Suite):一组测试用例的集合,可以用于组织多个测试用例。

  • • 测试运行器(Test Runner):执行测试的引擎,它可以是命令行工具,也可以是 GUI 工具,用于运行测试并输出结果。

快速上手:编写你的第一个测试

下面我们来编写一个简单的例子,了解如何使用 unittest 模块进行单元测试。

假设我们有一个简单的函数 add(a, b),用于返回两个数的和。

def add(a, b):
    return a + b

现在,我们为这个函数编写一个测试用例。

import unittest

class TestMathOperations(unittest.TestCase):

    def test_add(self):
        self.assertEqual(add(1, 2), 3)
        self.assertEqual(add(-1, 1), 0)
        self.assertEqual(add(-1, -1), -2)

if __name__ == '__main__':
    unittest.main()

代码解析

  1. 1. 定义测试类:所有的测试类都需要继承自 unittest.TestCase

  2. 2. 编写测试方法:所有以 test_ 开头的方法都是测试用例。我们在 test_add 方法中编写了针对 add 函数的多个测试。

  3. 3. 断言方法self.assertEqual(a, b) 用于断言 a 和 b 是否相等,这是最常用的断言方法之一。

运行这段代码,unittest 将自动发现所有的测试用例并执行它们。结果如下:

图片

 

如果所有测试都通过,将会显示 "OK"。如果某个测试失败,unittest 会告诉你是哪个测试失败,并显示具体的错误信息。

更高级的测试技巧

1. 多种断言方法

除了 assertEqualunittest 还提供了许多其他的断言方法,例如:

  • • assertTrue(expr) 和 assertFalse(expr):断言表达式 expr 是否为 True 或 False

  • • assertIn(a, b):断言 a 是否包含在 b 中。

  • • assertRaises(exception, callable, *args, **kwds):断言在调用函数时是否抛出了指定的异常。

2. 测试套件

当你有多个测试类或测试用例时,可以使用测试套件来组织它们:

def suite():
    suite = unittest.TestSuite()
    suite.addTest(TestMathOperations('test_add'))
    # 你可以继续添加其他的测试用例或测试类
    return suite

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

3. setUp 和 tearDown

有时,你可能需要在每个测试用例之前设置一些环境(例如初始化数据库连接),或者在测试用例之后清理环境。这时你可以使用 setUp 和 tearDown 方法。

class TestMathOperations(unittest.TestCase):

    def setUp(self):
        print("Setting up the environment...")

    def tearDown(self):
        print("Cleaning up the environment...")

    def test_add(self):
        self.assertEqual(add(1, 2), 3)

setUp 会在每个测试用例之前调用,而 tearDown 则会在测试用例之后调用。

4.跳过测试

有时候,你可能不希望运行某些测试,这时可以使用 @unittest.skip 装饰器。

class TestMathFunctions(unittest.TestCase):
    
    @unittest.skip("跳过这个测试")
    def test_division(self):
        self.assertEqual(divide(10, 2), 5)

5.预期失败

如果你知道某个测试目前会失败,但不希望它阻止其他测试的运行,可以使用 @unittest.expectedFailure

@unittest.expectedFailure
def test_fail(self):
    self.assertEqual(1 / 0, 1)

掌握 unittest 不仅可以帮助你写出更加健壮的代码,还能提升你调试和维护代码的效率。希望通过这篇文章,你能对 unittest 模块有一个全面的了解,并能够在你的项目中灵活应用。

文末福利

如果你对Python感兴趣的话,可以试试我整理的这一份全套的Python学习资料,【点击这里】免费领取!

包括:Python激活码+安装包、Python
web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!

① Python所有方向的学习路线图,清楚各个方向要学什么东西

② 100多节Python课程视频,涵盖必备基础、爬虫和数据分析

③ 100多个Python实战案例,学习不再是只会理论

④ 华为出品独家Python漫画教程,手机也能学习

⑤ 历年互联网企业Python面试真题,复习时非常方便

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

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

相关文章

浩瀚麦克风怎么样?西圣、罗德、神牛领夹麦克风全网巅峰PK测评

​一台优质专业的无线领夹麦克风能够清晰、稳定地收录声音,提升音频录制质量。而劣质的无线领夹麦克风则可能出现声音不清晰、信号不稳定、续航短等各种问题。作为一名资深的数码测评师,我已经测评过了好几十款无线领夹麦克风,今天将从麦克风…

Python应用指南:获取高德地铁站点数据(单城市版)

书接上文,上篇文章是一次性下载全国所以城市的地铁站点数据,但是可视化的过程需要手动把换乘站给一个个复制出来分配到其他各个经过的线路,还需要核对站点顺序不能出错,如果只需要单个城市的数据呢?另外能不能直接生成…

【复杂系统系列(初级)】自动调节动态平衡模型——生物体的稳态机制

【通俗理解】自动调节动态平衡模型——生物体的稳态机制 关键词提炼 #自动调节 #动态平衡 #生物体稳态 #反馈机制 #体温调节 #微分方程模型 第一节:自动调节动态平衡模型的类比与核心概念 1.1 自动调节动态平衡模型的类比 自动调节动态平衡模型可以被视为生物体…

grpc-spring 通信(监控视频传输)

先看效果 这是微软相机,22ms延迟 (不走网络存粹寄存器和内存的通信)这是程序抓取摄像头然后传给client,client的java窗口展示的,延时也是22ms(对了localhost好像也不走网络吧) 几个点 1.openc…

大功率舞台灯调光调色方案 | 支持深度调光,多路输出调光 36V/48V/60V FP7126

在舞台演出中,灯光扮演着非常重要的角色,它不仅可以烘托氛围,营造氛围,更能够为表演者增添光彩,塑造形象。在博物馆场所中,突出展品细节。根据灯光用途和适用类型,舞台灯可以细分为聚光灯、泛光…

foundation model

目录 多模态预训练模型 BLIP LLM GPT3 InstructGPT FLAN chain of thought ToolFormer QWEN Llama3 VLM QWen-VL VideoChat Video-ChatGPT 应用 DriveVLM PlanAgent 多模态预训练模型 CLIP BLIP 《Bootstrapping Language-Image Pre-training for Unified Visi…

突发!Runway 从 HuggingFace 及 GitHub 上删库跑路,背后有何隐情?

突发!2024年8月29日Runway 从 HuggingFace 及 GitHub 上删库跑路,背后有何隐情? 🧐 今天我们来聊一聊科技圈一则爆炸性消息:Runway ML 从 HuggingFace 和 GitHub 上删库跑路,毫无预警!这个举动…

基于asp.net的在线考试系统源码分享

这是一个基于asp.net的开发的在线考试系统,需要的小伙伴自己参考源码,下载链接我放在后面了。 1.主要功能 主要功能包含用户注册登陆、学生登录、老师登陆、试卷管理、分数管理、 填空题选择、选择题管理、题库管理、分数管理、试卷随机生成等等模块。…

【精选】基于Django的智能水果销售系统设计与实现

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

面试必问的 Linux 命令帮你整理好啦...

01.背景 作为一名测试工程师,Linux 是必须要掌握的一项技能。 因为大部分的互联网公司的项目都是搭建和部署在 Linux 服务器上的,所以测试就算不去负责搭建和维护测试环境,也需要在测试过程中去服务器那边定位测试中的问题。 所以&#xf…

PTA L1-027 出租

L1-027 出租(20分) 下面是新浪微博上曾经很火的一张图: 一时间网上一片求救声,急问这个怎么破。其实这段代码很简单,index数组就是arr数组的下标,index[0]2 对应 arr[2]1,index[1]0 对应 arr[0…

这四种人不能合作做生意

合伙创业千万不要和这四种人合伙,不然公司做大了都不是你的! 一、不愿出钱的人,不愿出钱就不会有决心。公司一旦有风吹草动,最先跑路的都是没有出钱的。 二、不愿付出时间的人,想用业余时间参与,不愿全身心…

Unity编辑器扩展之Hierarchy面板扩展

内容将会持续更新,有错误的地方欢迎指正,谢谢! Unity编辑器扩展之Hierarchy面板扩展 TechX 坚持将创新的科技带给世界! 拥有更好的学习体验 —— 不断努力,不断进步,不断探索 TechX —— 心探索、心进取&#xff…

css-functions-图形函数

概述 本文会讨论和图形函数有关的 5 个函数,分别是:inset、circle、ellipse、polygon和path。这个 5 个图形函数也对应着相应的<basic-shape>。 <basic-shape>是一种表现基础图形的 CSS 数据类型,作用于clip-path或shape-outside属性中;而其值是由图形函数获…

sfud移植

sfud移植 首先看readme文档 文件结构 inc文件夹&#xff1a;各种头文件&#xff0c;注意flash_def和cfg头文件 port文件夹&#xff1a;接口文件 src文件夹&#xff1a;代码源文件 移植 基础&#xff1a;你的SPI没问题&#xff0c;用普通工程可以正常操作Flash 首先打开f…

cloudways相关

服务器优惠链接&#xff1a; https://www.cloudways.com/en/?id1081165 cloudways 后台清缓存位置&#xff1a; 网站迁移到cloudways&#xff08;用cloudways的自动迁移插件&#xff09;&#xff1a; 不管原网站是不是用的cloudways主机&#xff0c;都可以用这个方法。 1…

【React】react项目安装tailwindcss

创建React项目 首先,如果您还没有React项目,可以使用以下命令创建一个新项目: npx create-react-app my-tailwind-app cd my-tailwind-app安装Tailwind CSS 接下来,按照以下步骤安装Tailwind CSS: 安装必要的依赖: npm install -D tailwindcss postcss autoprefixer初始化…

Kubernetes 1.31 新功能: 细粒度补充组控制

这篇文章讨论了 Kubernetes 1.31 中的一个新特性&#xff0c;用于改善 Pod 中容器的补充组&#xff08;Fine-grained SupplementalGroups control&#xff09;处理。 动机&#xff1a;在容器镜像中的 /etc/group 定义的隐式组成员身份 尽管这种行为可能并不受许多 Kubernetes…

Redis安装+常用命令合集大全+Redis Desktop Manager

文章目录 一&#xff1a;Redis 简介二&#xff1a;安装和配置Redis第一步&#xff1a;下载Redis第二步&#xff1a;解压Redis第三步&#xff1a;配置Redis第四步&#xff1a;启动Redis服务器第五步&#xff1a;验证Redis安装第六步&#xff1a;设置Redis为全局命令 三&#xff…

不同品类商标一样属于侵权吗!

商标分类有45类&#xff0c;有网友问普推知产商标老杨&#xff0c;不同品类商标一样属于侵权吗&#xff0c;这个要从多个角度来分析&#xff0c;不同品类商标是相同一样的&#xff0c;这样的基本不侵权的。 在注册申请商标是会经常遇到别人在某类别注册&#xff0c;但是有一些类…