Python 单元测试与测试驱动开发(TDD):提升代码质量的利器

news/2025/4/1 18:07:54/文章来源:https://www.cnblogs.com/yoyoliwu/p/18800845

Python 单元测试与测试驱动开发(TDD):提升代码质量的利器

在软件开发中,单元测试是确保代码质量的重要环节。通过单元测试,可以验证代码的功能是否按预期工作,及时发现并修复潜在问题。测试驱动开发(TDD)则是一种以测试为先导的开发方法,它要求开发者在编写代码之前先编写测试用例。本文将介绍如何使用 Python 的 unittestpytest 框架进行单元测试,以及 TDD 的实践方法。

一、单元测试基础

单元测试是对程序中的最小可测试部分(通常是函数或方法)进行测试。Python 提供了多种工具来编写和运行单元测试,其中最常用的是 unittestpytest

(一)使用 unittest 框架

unittest 是 Python 标准库中自带的单元测试框架。它提供了一套完整的工具来创建和运行测试,包括测试用例、测试套件、测试运行器和测试夹具。

示例:使用 unittest 编写测试

假设我们有一个简单的函数 add,用于计算两个数字的和:

# my_math.py
def add(a, b):return a + b

我们可以为这个函数编写单元测试:

# test_my_math.py
import unittest
from my_math import addclass TestMathOperations(unittest.TestCase):def test_add(self):self.assertEqual(add(1, 2), 3)self.assertEqual(add(-1, -1), -2)if __name__ == '__main__':unittest.main()

运行测试:

python test_my_math.py

(二)使用 pytest 框架

pytest 是一个第三方的测试框架,它提供了更简洁的语法和更强大的功能。pytest 不需要继承 unittest.TestCase,并且支持参数化测试和丰富的插件。

示例:使用 pytest 编写测试

安装 pytest

pip install pytest

编写测试代码:

# test_my_math.py
from my_math import adddef test_add():assert add(1, 2) == 3assert add(-1, -1) == -2

运行测试:

pytest test_my_math.py

二、测试驱动开发(TDD)

TDD 是一种开发实践,它要求开发者在编写代码之前先编写测试用例。TDD 的典型流程如下:

  1. 编写测试:先编写单元测试和集成测试,确保每个功能和模块按预期工作。
  2. 编写代码:根据测试需求编写实现代码。
  3. 运行测试:执行测试用例,确保所有测试通过。
  4. 重构代码:在确保测试通过后,优化代码结构。

示例:TDD 实践

假设我们要开发一个函数 multiply,用于计算两个数字的乘积。按照 TDD 的流程,我们首先编写测试:

# test_my_math.py
import unittest
from my_math import multiplyclass TestMathOperations(unittest.TestCase):def test_multiply(self):self.assertEqual(multiply(2, 3), 6)self.assertEqual(multiply(-1, 4), -4)if __name__ == '__main__':unittest.main()

然后编写实现代码:

# my_math.py
def multiply(a, b):return a * b

运行测试,确保测试通过:

python test_my_math.py

三、最佳实践

(一)测试文件命名

测试文件应以 test_ 开头或以 _test 结尾。例如,test_my_math.pymy_math_test.py

(二)测试用例命名

测试用例应以 test_ 开头。例如,test_multiply

(三)使用断言

unittest 提供了多种断言方法,用于检查测试结果是否符合预期。例如,assertEqualassertTrueassertRaises 等。

(四)参数化测试

pytest 支持参数化测试,可以通过 parametrize 装饰器实现。这使得编写多个测试用例更加方便。

(五)测试报告

pytest 可以生成 HTML 格式的测试报告。使用 pytest-html 插件:

pip install pytest-html
pytest --html=report.html

四、总结

通过本文的介绍,你已经掌握了如何使用 unittestpytest 进行 Python 代码的单元测试,以及 TDD 的实践方法。单元测试是确保代码质量的重要手段,而 TDD 则可以帮助你在开发过程中更早地发现问题,减少后期的维护成本。希望这些技巧和方法能帮助你在 Python 开发中更加高效和自信。

文章来源于zlibrary图书馆中《Python编程从入门到实践》书的Python 单元测试与测试驱动开发(TDD)章节内容

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

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

相关文章

jmeter性能测试(2)——实战

一、单接口性能测试(同一用户进行压力测试)POST http://49.233.201.254:8080/cms/manage/loginJump.do POST data:userAccount=admin&loginPwd=123456按100 压力测试(1)在线程中修改虚拟用户数线程数:虚拟用户数。一个虚拟用户占用一个进程或线程。设置多少虚拟用户数…

2025全国青少年信息素养大赛报名指南(内附报名全流程)

2025全国青少年信息素养大赛报名指南 (内附报名全流程)2025 年预估初赛在 28 万~32 万人次左右,今年竞争会比较激烈,大家提前备考,NOI官网发布了“关于参加CSP-J/S认证需符合年龄条件的公告”,报名参加CSP-J/S的被认证者在当年9月1日(不含)需满12周岁,包括第一轮和第…

Codeforces Round 1013 (Div. 3)(前5)

比赛链接 A:Olympiad Date 让我们开始一个数字计数器 cnt[i] ( 0≤i≤9) 3≤cnt[0],1≤cnt[1],2≤cnt[2], 1≤cnt[3],1≤cnt[5] 答案已找到。如果在计算所有数字之后,没有满足其中一个条件,则没有解决方案,答案为 0. 代码如下 #include <bits/stdc++.h> using namesp…

【题解】E - Replace

背景 这把报了 UnRated 从 E 开始看,于是非常惨烈的只拿下了 E。这个 2054 难度的题居然只有绿。E - Replace 题意 给你两个字符串 \(s,t\),你每次可以把 \(s\) 中的一种字符换成另一种,求把 \(s\) 变成 \(t\) 的最小操作数,可能无解。 思路 我们先考虑无解怎么判:可以得到…

质数筛——欧拉筛

欧拉筛 核心思想 和数只被它最小的质因数筛去 prime_number是当前小于i的所有质数集合 p是prime_number的元素,当没有找到最小质因数pi时,p是j的最小质因数,j可以被筛去,当找到最小质因数时就要退出循环,否则不能保证p是j的最小质因数 算法的时间复杂度:O(n),到n的所有和…

索引的分类

远离那些贬低你理想的人。狭隘的人经常如此,伟大的人会让你感觉自己也可以变好。 ——马克吐温按「数据结构」分类:B+tree索引、Hash索引、Full-text索引。 按「物理存储」分类:聚簇索引(主键索引)、二级索引(辅助索引) 按「字段特性」分类:主键索引、唯一索引、普通索引、前缀…

Linux基本使用-3

常用快捷键使用ctrl + c ==> 强制停止,结束当前命令运行或清空已输入命令ctrl + d ==> 退出登出,退出当前登录账户或退出程序history ==> 查看历史命令!命令前缀 ==> 自动匹配上一个命令ctrl + r ==> 搜索历史命令ctrl + a|e ==> 光…

评论夸一夸功能

评论夸一夸功能原文:https://www.tianyubk.com/863.html效果图1. 新建CSS文件 ​项目根目录/resouces/插件/小工具/评论​ (可以新建上述目录)新建 kuakua.css​ 文件 .kuakua-first-box {margin: auto;width: 440px;border-radius: 16px;bottom: auto;min-height: 10rem;le…

执行一条SQL请求的过程

远离那些贬低你理想的人。狭隘的人经常如此,伟大的人会让你感觉自己也可以变好。 ——马克吐温大体来说,MySQL 可以分为 Server 层和存储引擎层两部分。 Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如…

pikachu-RCE

exec "ping" 注入方式和DVWA靶场 - Command Injection一致 exec "evel"通过代码可以看出用户输入的信息未经过任何过滤被直接执行 尝试传入phpinfo();

位运算的操作

代码展示: #include <iostream> using namespace std;int main() {int n, m;cin >> n >> m;while (m--) {int op;cin >> op;if (op == 1) {int x;cin >> x;cout << ((n >> x) & 1) << endl;} else if (op == 2) {int l, …

将本地代码上传至github进行代码管理

博客地址:https://www.cnblogs.com/zylyehuo/