Python编程 从入门到实践——第11章 测试代码
创始人
2025-06-01 05:58:14
0

第11章 测试代码

  • 11.1 测试函数
    • 11.1.1 单元测试和测试用例
    • 11.1.2 可通过的测试
    • 11.1.3 未通过的测试
    • 11.1.4 测试未通过时怎么办
    • 11.1.5 添加新测试
  • 11.2 测试类
    • 11.2.1 各种断言方法
    • 11.2.2 一个要测试的类
    • 11.2.3 测试AnonymousSurvey类
    • 11.2.4 方法setUp()
  • 11.3 小结

11.1 测试函数

# name_function.py
def get_formatted_name(first, last):"""生成整洁的姓名"""full_name = f"{first} {last}"return full_name.title()
# names.py
from name_function import get_formatted_nameprint("Enter 'q' at any time to quit.")
while True:first = input("Please give me a first name: ")if first == 'q':breaklast = input("Please give me a last name: ")if last == 'q':breakformatted_name = get_formatted_name(first, last)print(f"\tNeatly formatted name: {formatted_name}.")

11.1.1 单元测试和测试用例

Python标准库中的模块unittest提供了代码测试工具。
单元测试用于核实函数的某个方面没有问题。
测试用例是一组单元测试,它们一道核实函数在各种情形下的行为都符合要求。
全覆盖的测试用例包含一整套单元测试,覆盖了各种可能的函数使用方式。

11.1.2 可通过的测试

要为函数编写测试用例,可先导入模块unittest和要测试的函数,再创建一个继承unittest.TestCase的类,并编写一系列方法对函数行为的不同方面进行测试。

# test_name_function.py
import unittest
from name_function import get_formatted_name
# 类必须继承unittest.TestCase
# 运行test_name_function.py时,所有以test_打头的方法都将自动运行
class NamesTestCase(unittest.TestCase):"""测试name_function.py"""def test_first_last_name(self):"""能够正确地处理像Janis Joplin这样的姓名吗"""formatted_name = get_formatted_name('janis', 'joplin')# 断言方法核实得到的结果是否与期望的结果一致self.assertEqual(formatted_name, 'Janis Joplin')# 很多测试框架都会先导入测试文件再运行。
# 导入文件时,解释器将在导入的同时执行它。
# if代码块检查特殊变量_name_,这个变量是在程序执行时设置的
# 如果这个文件作为主程序执行,变量_name_将被设置为'_main_'
# 这里,调用unittest.main()来运行测试用例
# 如果这个文件被测试框架导入,变量_name_的值将不是'_main_',因此不会调用unittest.main()
if _name_ == '_main_':unittest.main()

图结果
第一行的句点表明有一个测试用例通过了。接下来的一行指出Python运行了一个测试,消耗的时间不到0.001秒。最后的OK表明该测试用例中的所有单元测试都通过了。

11.1.3 未通过的测试

# name_function.py
def get_formatted_name(first, middle, last):"""生成整洁的姓名"""full_name = f"{first} {middle} {last}"return full_name.title()

再次运行test_name_function.py时,输出如下:
图结果

11.1.4 测试未通过时怎么办

# name_function.py
def get_formatted_name(first, last, middle=''):"""生成整洁的姓名"""if middle:full_name = f"{first} {middle} {last}"else:full_name = f"{first} {last}"return full_name.title()

再次运行test_name_function.py时,输出如下:
图结果

11.1.5 添加新测试

# test_name_function.py
import unittest
from name_function import get_formatted_nameclass NamesTestCase(unittest.TestCase):"""测试name_function.py"""def test_first_last_name(self):"""能够正确地处理像Janis Joplin这样的姓名吗"""formatted_name = get_formatted_name('janis', 'joplin')self.assertEqual(formatted_name, 'Janis Joplin')def test_first_last_middle_name(self):"""能够正确地处理像Wolfgang Amadeus Mozarta这样的姓名吗?"""formatted_name = get_formatted_name('wolfgang', 'amadeus', 'mozarta')self.assertEqual(formatted_name, 'Wolfgang Amadeus Mozarta')if _name_ == '_main_':unittest.main()

动手试一试

11.2 测试类

11.2.1 各种断言方法

表11-1

11.2.2 一个要测试的类

# survey.py
class AnonymousSurvey:"""收集匿名调查问卷的答案"""def _init_(self, question):"""存储一个问题,并为存储答案做准备"""self.question = questionself.responses = []def show_question(self):"""显示调查问卷"""print(self.question)def store_response(self, new_response):"""存储单份调查答卷"""self.responses.append(new_response)def show_results(self):"""显示收集到的所有答卷"""print("Survey results:")for response in self.responses:print(f"- {response}")
from survey import AnonymousSurveyquestion = "What language did you first learn to speak?"
my_survey = AnonymousSurvey(question)my_survey.show_question()
print("Enter 'q' at any time to quit.\n")
while True:response = input("Language: ")if response == 'q':breakmy_survey.store_response(response)print("Thank you to everyone who participate in the survey!")
my_survey.show_results()

11.2.3 测试AnonymousSurvey类

# test_survey.py
import unittest
from survey import AnonymousSurveyclass TestAnonymousSurvey(unittest.TestCase):"""针对AnonymousSurvey类的测试"""def test_store_single_response(self):"""测试单个答案会被妥善地存储"""question = "What language did you first learn to speak?"my_survey = AnonymousSurvey(question)my_survey.store_response('English')self.assertIn('English', my_survey.responses)def test_store_three_responses(self):"""测试三个答案会被妥善地存储"""question = "What language did you first learn to speak?"my_survey = AnonymousSurvey(question)responses = ['English', 'Spanish', 'Mandarin']for response in responses:my_survey.store_response(response)for response in responses:self.assertIn(response, my_survey.responses)if _name_  == '_main_':unittest.main()

11.2.4 方法setUp()

# test_survey.py
import unittest
from survey import AnonymousSurveyclass TestAnonymousSurvey(unittest.TestCase):"""针对AnonymousSurvey类的测试"""# 如果在TestCase类中包含了方法setUp(),Python将先运行它,再运行各个以test_打头的方法def setUp(self):"""创建一个调查对象和一组答案,供使用的测试方法使用"""question = "What language did you first learn to speak?"self.my_survey = AnonymousSurvey(question)self.responses = ['English', 'Spanish', 'Mandarin']def test_store_single_response(self):"""测试单个答案会被妥善地存储"""self.my_survey.store_response(self.responses[0])self.assertIn(self.responses[0], self.my_survey.responses)def test_store_three_responses(self):"""测试三个答案会被妥善地存储"""for response in self.responses:self.my_survey.store_response(response)for response in responses:self.assertIn(response, self.my_survey.responses)if _name_  == '_main_':unittest.main()

运行测试用例时,每完成一个单元测试,Python都打印一个字符:测试通过时打印一个句点,测试引发错误时打印一个E,而测试导致断言失败时则打印一个F。
动手试一试

11.3 小结

相关内容

热门资讯

【MySQL】锁 锁 文章目录锁全局锁表级锁表锁元数据锁(MDL)意向锁AUTO-INC锁...
【内网安全】 隧道搭建穿透上线... 文章目录内网穿透-Ngrok-入门-上线1、服务端配置:2、客户端连接服务端ÿ...
GCN的几种模型复现笔记 引言 本篇笔记紧接上文,主要是上一篇看写了快2w字,再去接入代码感觉有点...
数据分页展示逻辑 import java.util.Arrays;import java.util.List;impo...
Redis为什么选择单线程?R... 目录专栏导读一、Redis版本迭代二、Redis4.0之前为什么一直采用单线程?三、R...
【已解决】ERROR: Cou... 正确指令: pip install pyyaml
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
Lock 接口解读 前置知识点Synchronized synchronized 是 Java 中的关键字,...
Win7 专业版安装中文包、汉... 参考资料:http://www.metsky.com/archives/350.htm...
3 ROS1通讯编程提高(1) 3 ROS1通讯编程提高3.1 使用VS Code编译ROS13.1.1 VS Code的安装和配置...
大模型未来趋势 大模型是人工智能领域的重要发展趋势之一,未来有着广阔的应用前景和发展空间。以下是大模型未来的趋势和展...
python实战应用讲解-【n... 目录 如何在Python中计算残余的平方和 方法1:使用其Base公式 方法2:使用statsmod...
学习u-boot 需要了解的m... 一、常用函数 1. origin 函数 origin 函数的返回值就是变量来源。使用格式如下...
常用python爬虫库介绍与简... 通用 urllib -网络库(stdlib)。 requests -网络库。 grab – 网络库&...
药品批准文号查询|药融云-中国... 药品批文是国家食品药品监督管理局(NMPA)对药品的审评和批准的证明文件...
【2023-03-22】SRS... 【2023-03-22】SRS推流搭配FFmpeg实现目标检测 说明: 外侧测试使用SRS播放器测...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
初级算法-哈希表 主要记录算法和数据结构学习笔记,新的一年更上一层楼! 初级算法-哈希表...
进程间通信【Linux】 1. 进程间通信 1.1 什么是进程间通信 在 Linux 系统中,进程间通信...
【Docker】P3 Dock... Docker数据卷、宿主机与挂载数据卷的概念及作用挂载宿主机配置数据卷挂载操作示例一个容器挂载多个目...