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

相关内容

热门资讯

电视安卓系统哪个品牌好,哪家品... 你有没有想过,家里的电视是不是该升级换代了呢?现在市面上电视品牌琳琅满目,各种操作系统也是让人眼花缭...
安卓会员管理系统怎么用,提升服... 你有没有想过,手机里那些你爱不释手的APP,背后其实有个强大的会员管理系统在默默支持呢?没错,就是那...
安卓系统软件使用技巧,解锁软件... 你有没有发现,用安卓手机的时候,总有一些小技巧能让你玩得更溜?别小看了这些小细节,它们可是能让你的手...
安卓系统提示音替换 你知道吗?手机里那个时不时响起的提示音,有时候真的能让人心情大好,有时候又让人抓狂不已。今天,就让我...
安卓开机不了系统更新 手机突然开不了机,系统更新还卡在那里,这可真是让人头疼的问题啊!你是不是也遇到了这种情况?别急,今天...
安卓系统中微信视频,安卓系统下... 你有没有发现,现在用手机聊天,视频通话简直成了标配!尤其是咱们安卓系统的小伙伴们,微信视频功能更是用...
安卓系统是服务器,服务器端的智... 你知道吗?在科技的世界里,安卓系统可是个超级明星呢!它不仅仅是个手机操作系统,竟然还能成为服务器的得...
pc电脑安卓系统下载软件,轻松... 你有没有想过,你的PC电脑上安装了安卓系统,是不是瞬间觉得世界都大不一样了呢?没错,就是那种“一机在...
电影院购票系统安卓,便捷观影新... 你有没有想过,在繁忙的生活中,一部好电影就像是一剂强心针,能瞬间让你放松心情?而我今天要和你分享的,...
安卓系统可以写程序? 你有没有想过,安卓系统竟然也能写程序呢?没错,你没听错!这个我们日常使用的智能手机操作系统,竟然有着...
安卓系统架构书籍推荐,权威书籍... 你有没有想过,想要深入了解安卓系统架构,却不知道从何下手?别急,今天我就要给你推荐几本超级实用的书籍...
安卓系统看到的炸弹,技术解析与... 安卓系统看到的炸弹——揭秘手机中的隐形威胁在数字化时代,智能手机已经成为我们生活中不可或缺的一部分。...
鸿蒙系统有安卓文件,畅享多平台... 你知道吗?最近在科技圈里,有个大新闻可是闹得沸沸扬扬的,那就是鸿蒙系统竟然有了安卓文件!是不是觉得有...
宝马安卓车机系统切换,驾驭未来... 你有没有发现,现在的汽车越来越智能了?尤其是那些豪华品牌,比如宝马,它们的内饰里那个大屏幕,简直就像...
p30退回安卓系统 你有没有听说最近P30的用户们都在忙活一件大事?没错,就是他们的手机要退回安卓系统啦!这可不是一个简...
oppoa57安卓原生系统,原... 你有没有发现,最近OPPO A57这款手机在安卓原生系统上的表现真是让人眼前一亮呢?今天,就让我带你...
安卓系统输入法联想,安卓系统输... 你有没有发现,手机上的输入法真的是个神奇的小助手呢?尤其是安卓系统的输入法,简直就是智能生活的点睛之...
怎么进入安卓刷机系统,安卓刷机... 亲爱的手机控们,你是否曾对安卓手机的刷机系统充满好奇?想要解锁手机潜能,体验全新的系统魅力?别急,今...
安卓系统程序有病毒 你知道吗?在这个数字化时代,手机已经成了我们生活中不可或缺的好伙伴。但是,你知道吗?即使是安卓系统,...
奥迪中控安卓系统下载,畅享智能... 你有没有发现,现在汽车的中控系统越来越智能了?尤其是奥迪这种豪华品牌,他们的中控系统简直就是科技与艺...