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 小结

相关内容

热门资讯

迷你退出安卓系统了吗,转型新篇... 最近有没有发现你的手机上那个可爱的迷你退出图标突然不见了?别急,让我来给你揭秘迷你退出安卓系统了吗的...
华为优先使用安卓系统,打造自主... 你知道吗?最近科技圈里有个大动作,那就是华为宣布优先使用安卓系统。这可不是一个简单的决定,它背后可是...
安卓系统隐藏了设置,隐藏设置功... 你知道吗?安卓系统这个大宝藏里,竟然隐藏着一些不为人知的设置!是不是听起来就有点小激动呢?别急,今天...
反渣恋爱系统安卓,收获真爱 你有没有听说过那个神奇的“反渣恋爱系统安卓”呢?最近,这款应用在网络上可是火得一塌糊涂,不少单身狗都...
安卓出厂系统能升级,探索无限可... 你知道吗?现在这个时代,手机更新换代的速度简直就像坐上了火箭!而说到手机,安卓系统可是占据了半壁江山...
老安卓刷机系统,从入门到精通 你有没有想过,你的老安卓手机其实还有大大的潜力呢?没错,就是那个陪伴你多年的老安卓,它可不是只能用来...
安卓粉ios系统app,兼容性... 你有没有发现,身边的朋友圈里,安卓粉和iOS系统粉总是争论不休?今天,咱们就来聊聊这个话题,看看安卓...
安卓系统语言下载,探索安卓系统... 你有没有想过,你的安卓手机是不是该换换口味了?没错,就是语言!想象如果你能轻松切换到自己喜欢的语言,...
安卓共有多少种系统,究竟有多少... 你有没有想过,安卓这个我们每天不离手的操作系统,竟然有那么多不同的版本呢?没错,安卓系统就像一个大家...
安卓系统怎么播放swf,And... 你有没有遇到过这种情况:手里拿着一部安卓手机,想看一个SWF格式的动画,结果发现怎么也打不开?别急,...
pos机安卓系统跟win系统,... 你有没有想过,那些在我们生活中默默无闻的POS机,竟然也有自己的操作系统呢?没错,就是安卓系统和Wi...
俄罗斯封禁安卓系统,本土化替代... 俄罗斯封禁安卓系统的背后:技术、经济与社会的影响在数字化浪潮席卷全球的今天,智能手机已成为我们生活中...
安卓系统总是弹出权限,安卓系统... 手机里的安卓系统是不是总爱和你玩捉迷藏?每次打开一个应用,它就跳出来问你要不要给它开权限,真是让人又...
安卓系统测血氧,便捷健康生活新... 你知道吗?现在科技的发展真是让人惊叹不已!手机,这个我们日常生活中不可或缺的小玩意儿,竟然也能变身成...
蓝光助手安卓系统的,深度解析与... 你有没有发现,现在手机屏幕越来越大,看视频、刷抖音,简直爽到飞起!但是,你知道吗?长时间盯着屏幕,尤...
安卓系统如何隐藏提示,Andr... 你是不是也和我一样,在使用安卓手机的时候,总是被那些弹出来的提示信息打扰到?别急,今天就来教你怎么巧...
安卓6.0系统如何分区,And... 你有没有想过,你的安卓手机里那些神秘的分区到底是怎么来的?别急,今天就来给你揭秘安卓6.0系统如何分...
安卓系统图片怎么涂鸦,指尖上的... 你有没有想过,在安卓系统的手机上,那些单调的图片也能变得生动有趣呢?没错,就是涂鸦!今天,就让我来带...
安卓系统40g,40GB存储空... 你有没有发现,最近你的安卓手机突然变得有点“胖”了呢?没错,就是那个传说中的40G!别急,别慌,今天...
安卓5.0系统怎么重置,轻松实... 手机用久了是不是感觉卡得要命?别急,今天就来教你怎么给安卓5.0系统来个彻底的重置,让它焕发新生!一...