Python学习笔记17:进阶篇(六)代码测试

2024-06-23 11:28

本文主要是介绍Python学习笔记17:进阶篇(六)代码测试,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

代码测试

代码测试是软件开发过程中的关键环节,旨在确保代码质量、功能正确性以及性能符合预期。

在开发过程中,进行代码测试有很多好处:

  1. 提高软件质量:通过发现并修复错误,测试有助于提升软件的功能性、可靠性和稳定性,减少用户遇到的问题。
  2. 降低维护成本:及早发现错误可以减少后期修复的复杂度和成本,因为错误在系统更复杂时更难追踪和修正。
  3. 加速开发流程:自动化测试能够快速反馈代码变更的效果,使得开发者能迅速定位问题,加快迭代速度。
  4. 增强信心:全面的测试套件为开发团队和利益相关者提供了部署代码的信心,知道改动不太可能引入新的错误。
  5. 促进可维护性和可扩展性:编写可测试的代码往往意味着更好的模块化和解耦,这有利于未来的维护和功能扩展。
  6. 文档作用:测试用例本身也起到了文档的作用,展示了代码应该如何被使用,以及预期的行为是什么。
  7. 便于重构:有了坚实的测试基础,开发者可以更加大胆地进行代码重构,优化结构而不必过分担心引入新bug。
  8. 提升团队协作:共同的测试标准和实践促进了团队成员之间的沟通和理解,确保了项目的一致性和质量标准。

作为python学习者,我们更加需要学习代码的测试知识,因为python是自动化测试的首选语言。

测试工具

unittest

unittest是Python标准库中的一个模块,提供了编写和运行测试的强大工具。

  1. 测试用例:每个测试用例通常对应一个函数,使用test_前缀命名。
  2. 断言方法:如assertEqual()、assertTrue()等,用于比较实际结果与预期结果。
  3. 测试套件:使用unittest.TestSuite来组织多个测试用例。
  4. 测试运行器:使用unittest.TextTestRunner来执行测试。

if name == ‘main’:

插个小知识,以免后面看不懂。

在Python程序中,if name == ‘main’: 是一个常见的条件语句,其作用在于判断当前文件是否作为主程序直接被执行。如果文件是被直接执行,那么这个条件下的代码块将会被执行;反之,如果文件是被导入到其他模块中,则该代码块不会执行。这样的设计允许模块既可以作为独立的程序运行,又可以在其他程序中被引用而不会执行主程序的代码。

为什么需要这个判断?

  1. 避免重复执行:当一个模块被其他模块导入时,如果模块中有全局执行的代码(比如打印语句、初始化操作等),如果不加此判断,这些代码就会被执行。这对于只想使用该模块中定义的函数或类的其他模块来说,可能会产生意料之外的结果或副作用。

  2. 便于组织代码:将程序的入口点统一放在这一块,使得代码结构更加清晰。特别是对于包含多个函数和类的大型模块,这种方式有助于区分哪些代码是用来测试或演示模块功能的,哪些是模块的核心功能定义。

def hello(name):print(f"Hello, {name}!")if __name__ == '__main__':hello("World")

在这个例子中,hello函数定义了一个简单的打招呼功能。当直接运行这个脚本时,因为__name__变量的值为’main’,所以会执行下面的代码块,打印出"Hello, World!"。但如果这个模块被其他脚本导入,hello函数可以被正常使用,但打招呼的那行代码不会执行,除非导入模块的脚本也显式调用了hello函数。

测试示例

测试函数

import unittest
from operator import addclass TestAddFunction(unittest.TestCase):def test_add(self):self.assertEqual(add(1, 2), 3)self.assertEqual(add(-1, 1), 0)self.assertEqual(add(0, 0), 0)if __name__ == '__main__':unittest.main()

这段代码中,我们使用了断言assertEqual来测试我们add函数的正确性。
在这里插入图片描述
以上是代码测试通过的示例,假如有错误的结果又会是怎么样的呢?我们还是以add函数示例。

import unittest
from operator import addclass TestAddFunction(unittest.TestCase):def test_add(self):self.assertEqual(add(1, 2), 3)self.assertEqual(add(-1, 1), 2)self.assertEqual(add(0, 0), 0)if __name__ == '__main__':unittest.main()

我们修改第二个断言中的函数预期值,并点击执行。
在这里插入图片描述
最终运行框中提示了第二个断言的错误,预期是0但是我们给的值是2,这是一个不能通过的测试。

能够正常通过的测试有了,不能通过的测试也有了。遇到不能通过的测试怎么呢?

首先,你应该检查你的输入参数,如果你能保证你的输入参数没有问题那么说明你的函数还有问题存在,需要修复。这个时候需要我们修改的是函数本身的逻辑,而不是测试的代码。通过debug的方式找到影响正确输出的代码进行修改即可。

测试类

先准备需要测试目标类。

class BankAccount:def __init__(self):self.balance = 0def deposit(self, amount):"""存款"""if amount > 0:self.balance += amountelse:raise ValueError("存款金额必须大于0")def withdraw(self, amount):"""取款"""if 0 < amount <= self.balance:self.balance -= amountelse:raise ValueError("取款金额必须大于0且不超过账户余额")def get_balance(self):"""查询余额"""return self.balance

编写一个测试实施类,对测试目标类进行测试。

import unittest
from bank_account import BankAccountclass TestBankAccount(unittest.TestCase):def setUp(self):"""每个测试方法执行前的准备工作"""self.account = BankAccount()def test_initial_balance(self):"""测试初始余额是否为0"""self.assertEqual(self.account.get_balance(), 0)def test_deposit(self):"""测试存款功能"""self.account.deposit(100)self.assertEqual(self.account.get_balance(), 100)def test_withdraw(self):"""测试取款功能"""self.account.deposit(800)self.account.withdraw(600)self.assertEqual(self.account.get_balance(), 200)def test_negative_deposit(self):"""测试尝试存入负数时是否抛出异常"""with self.assertRaises(ValueError):self.account.deposit(-50)def test_overdraft_withdraw(self):"""测试尝试超限取款时是否抛出异常"""self.account.deposit(100)with self.assertRaises(ValueError):self.account.withdraw(900)if __name__ == '__main__':unittest.main()

在这里插入图片描述
这就是简单对类进行测试。

断言

断言方法是测试用例的核心,用于比较实际结果与预期结果,从而判断测试是否通过。以下是一些常用的断言方法及其用途:

assertEqual(a, b):检查a和b是否相等。
assertTrue(x):检查x是否为True。
assertFalse(x):检查x是否为False。
assertIn(item, list):检查item是否在list中。
assertNotIn(item, list):检查item是否不在list中。
assertIsNone(x):检查x是否为None。
assertIsNotNone(x):检查x是否不为None。
assertAlmostEqual(a,b):检查浮点数a和b是否足够接近(默认容差为7个十进制位)。
assertRaises(exc, callable, *args,**kwargs):检查在调用callable(*args, **kwargs)时是否抛出exc异常。

测试套件和测试运行器

测试套件就是将多个测试用例组合在一起,一次性执行。在需要组织和管理大量测试时会很有帮助。
测试运行器则是负责执行测试套件并收集测试结果。最常用的运行器是unittest.TextTestRunner,它会打印测试结果到控制台。

import unittest# 假设有两个测试类
class TestAddition(unittest.TestCase):def test_add(self):self.assertEqual(1 + 1, 2)class TestSubtraction(unittest.TestCase):def test_subtract(self):self.assertEqual(3 - 1, 2)# 创建测试套件
suite = unittest.TestSuite()# 将测试用例添加到套件中
suite.addTest(TestAddition('test_add'))
suite.addTest(TestSubtraction('test_subtract'))# 运行测试套件
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)

如代码示例,将多个测试用例组合到一起,一次执行,全部测试。

在这里插入图片描述

结尾

测试内容基本就这里结束了,没办法写的很深入,一个是本人水平问题,一个代码这东西,总归要是要结合到项目里面自己实战,发现问题到解决问题,这样才能有收获,才能有进步,才能有收获。当然初学时的练习也不要忘了!

作业

除了已经示例过的断言,增加两三个其他的断言进行使用,测试套件和测试运行器也别忘了用上。

  1. 自定义函数,并编写测试用例。
  2. 自定义类,编写测试用例。

这篇关于Python学习笔记17:进阶篇(六)代码测试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1087024

相关文章

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(

Python虚拟环境与Conda使用指南分享

《Python虚拟环境与Conda使用指南分享》:本文主要介绍Python虚拟环境与Conda使用指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、python 虚拟环境概述1.1 什么是虚拟环境1.2 为什么需要虚拟环境二、Python 内置的虚拟环境工具

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

Python pip下载包及所有依赖到指定文件夹的步骤说明

《Pythonpip下载包及所有依赖到指定文件夹的步骤说明》为了方便开发和部署,我们常常需要将Python项目所依赖的第三方包导出到本地文件夹中,:本文主要介绍Pythonpip下载包及所有依... 目录步骤说明命令格式示例参数说明离线安装方法注意事项总结要使用pip下载包及其所有依赖到指定文件夹,请按照以

Python实现精准提取 PDF中的文本,表格与图片

《Python实现精准提取PDF中的文本,表格与图片》在实际的系统开发中,处理PDF文件不仅限于读取整页文本,还有提取文档中的表格数据,图片或特定区域的内容,下面我们来看看如何使用Python实... 目录安装 python 库提取 PDF 文本内容:获取整页文本与指定区域内容获取页面上的所有文本内容获取

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

Python包管理工具核心指令uvx举例详细解析

《Python包管理工具核心指令uvx举例详细解析》:本文主要介绍Python包管理工具核心指令uvx的相关资料,uvx是uv工具链中用于临时运行Python命令行工具的高效执行器,依托Rust实... 目录一、uvx 的定位与核心功能二、uvx 的典型应用场景三、uvx 与传统工具对比四、uvx 的技术实

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

python判断文件是否存在常用的几种方式

《python判断文件是否存在常用的几种方式》在Python中我们在读写文件之前,首先要做的事情就是判断文件是否存在,否则很容易发生错误的情况,:本文主要介绍python判断文件是否存在常用的几种... 目录1. 使用 os.path.exists()2. 使用 os.path.isfile()3. 使用