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进行JSON和Excel文件转换处理指南

《Python进行JSON和Excel文件转换处理指南》在数据交换与系统集成中,JSON与Excel是两种极为常见的数据格式,本文将介绍如何使用Python实现将JSON转换为格式化的Excel文件,... 目录将 jsON 导入为格式化 Excel将 Excel 导出为结构化 JSON处理嵌套 JSON:

Python操作PDF文档的主流库使用指南

《Python操作PDF文档的主流库使用指南》PDF因其跨平台、格式固定的特性成为文档交换的标准,然而,由于其复杂的内部结构,程序化操作PDF一直是个挑战,本文主要为大家整理了Python操作PD... 目录一、 基础操作1.PyPDF2 (及其继任者 pypdf)2.PyMuPDF / fitz3.Fre

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

python中列表应用和扩展性实用详解

《python中列表应用和扩展性实用详解》文章介绍了Python列表的核心特性:有序数据集合,用[]定义,元素类型可不同,支持迭代、循环、切片,可执行增删改查、排序、推导式及嵌套操作,是常用的数据处理... 目录1、列表定义2、格式3、列表是可迭代对象4、列表的常见操作总结1、列表定义是处理一组有序项目的

python运用requests模拟浏览器发送请求过程

《python运用requests模拟浏览器发送请求过程》模拟浏览器请求可选用requests处理静态内容,selenium应对动态页面,playwright支持高级自动化,设置代理和超时参数,根据需... 目录使用requests库模拟浏览器请求使用selenium自动化浏览器操作使用playwright

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

Python极速搭建局域网文件共享服务器完整指南

《Python极速搭建局域网文件共享服务器完整指南》在办公室或家庭局域网中快速共享文件时,许多人会选择第三方工具或云存储服务,但这些方案往往存在隐私泄露风险或需要复杂配置,下面我们就来看看如何使用Py... 目录一、android基础版:HTTP文件共享的魔法命令1. 一行代码启动HTTP服务器2. 关键参

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

Python获取浏览器Cookies的四种方式小结

《Python获取浏览器Cookies的四种方式小结》在进行Web应用程序测试和开发时,获取浏览器Cookies是一项重要任务,本文我们介绍四种用Python获取浏览器Cookies的方式,具有一定的... 目录什么是 Cookie?1.使用Selenium库获取浏览器Cookies2.使用浏览器开发者工具

Python实现批量提取BLF文件时间戳

《Python实现批量提取BLF文件时间戳》BLF(BinaryLoggingFormat)作为Vector公司推出的CAN总线数据记录格式,被广泛用于存储车辆通信数据,本文将使用Python轻松提取... 目录一、为什么需要批量处理 BLF 文件二、核心代码解析:从文件遍历到数据导出1. 环境准备与依赖库