关于“Python”的核心知识点整理大全27

这篇具有很好参考价值的文章主要介绍了关于“Python”的核心知识点整理大全27。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

10.5 小结

第11 章

测试代码

11.1 测试函数

name_function.py

函数get_formatted_name()将名和姓合并成姓名,在名和姓之间加上一个空格,并将它们的 首字母都大写,再返回结果。为核实get_formatted_name()像期望的那样工作,我们来编写一个 使用这个函数的程序。程序names.py让用户输入名和姓,并显示整洁的全名: names.py

11.1.1 单元测试和测试用例

11.1.2 可通过的测试

test_name_ function.py

11.1.3 不能通过的测试

name_ function.py

11.1.4 测试未通过时怎么办

name_function.py

往期快速传送门👆(在文章最后):

感谢大家的支持!欢迎订阅收藏!专栏将持续更新!


关于“Python”的核心知识点整理大全27,python,掌握Python分类专栏:开启智能数据处理之旅!,python,开发语言,数据库,笔记

10.5 小结

在本章中,你学习了:如何使用文件;如何一次性读取整个文件,以及如何以每次一行的方 式读取文件的内容;如何写入文件,以及如何将文本附加到文件末尾;什么是异常以及如何处理 程序可能引发的异常;如何存储Python数据结构,以保存用户提供的信息,避免用户每次运行程 序时都需要重新提供。

在第11章中,你将学习高效的代码测试方式,这可帮助你确定代码正确无误,以及发现扩展 现有程序时可能引入的bug。

第11 章

测试代码

11.1 测试函数

要学习测试,得有要测试的代码。下面是一个简单的函数,它接受名和姓并返回整洁的姓名:

name_function.py
def get_formatted_name(first, last):
 """Generate a neatly formatted full name."""
 full_name = first + ' ' + last
 return full_name.title() 
函数get_formatted_name()将名和姓合并成姓名,在名和姓之间加上一个空格,并将它们的 首字母都大写,再返回结果。为核实get_formatted_name()像期望的那样工作,我们来编写一个 使用这个函数的程序。程序names.py让用户输入名和姓,并显示整洁的全名: names.py
from name_function import get_formatted_name
print("Enter 'q' at any time to quit.")
while True:
 first = input("\nPlease give me a first name: ")
 if first == 'q':
 break
 last = input("Please give me a last name: ")
 if last == 'q':
 break
 formatted_name = get_formatted_name(first, last)
 print("\tNeatly formatted name: " + formatted_name + '.')

这个程序从name_function.py中导入get_formatted_name()。用户可输入一系列的名和姓,并 看到格式整洁的全名:

Enter 'q' at any time to quit.
Please give me a first name: janis
Please give me a last name: joplin
 Neatly formatted name: Janis Joplin.
Please give me a first name: bob
Please give me a last name: dylan
 Neatly formatted name: Bob Dylan.
Please give me a first name: q

从上述输出可知,合并得到的姓名正确无误。现在假设我们要修改get_formatted_name(), 使其还能够处理中间名。这样做时,我们要确保不破坏这个函数处理只有名和姓的姓名的方式。 为此,我们可以在每次修改get_formatted_name()后都进行测试:运行程序names.py,并输入像 Janis Joplin这样的姓名,但这太烦琐了。所幸Python提供了一种自动测试函数输出的高效方式。 倘若我们对get_formatted_name()进行自动测试,就能始终信心满满,确信给这个函数提供我们 测试过的姓名时,它都能正确地工作。

11.1.1 单元测试和测试用例

Python标准库中的模块unittest提供了代码测试工具。单元测试用于核实函数的某个方面没 有问题;测试用例是一组单元测试,这些单元测试一起核实函数在各种情形下的行为都符合要求。 良好的测试用例考虑到了函数可能收到的各种输入,包含针对所有这些情形的测试。全覆盖式测 试用例包含一整套单元测试,涵盖了各种可能的函数使用方式。对于大型项目,要实现全覆盖可 能很难。通常,最初只要针对代码的重要行为编写测试即可,等项目被广泛使用时再考虑全覆盖。

11.1.2 可通过的测试

创建测试用例的语法需要一段时间才能习惯,但测试用例创建后,再添加针对函数的单元测 试就很简单了。要为函数编写测试用例,可先导入模块unittest以及要测试的函数,再创建一个继承unittest.TestCase的类,并编写一系列方法对函数行为的不同方面进行测试。 下面是一个只包含一个方法的测试用例,它检查函数get_formatted_name()在给定名和姓时 能否正确地工作:

test_name_ function.py
import unittest
from name_function import get_formatted_name
1 class NamesTestCase(unittest.TestCase):
 """测试name_function.py"""
 def test_first_last_name(self):
 """能够正确地处理像Janis Joplin这样的姓名吗?"""
2 formatted_name = get_formatted_name('janis', 'joplin')
3 self.assertEqual(formatted_name, 'Janis Joplin')
unittest.main()

首先,我们导入了模块unittest和要测试的函数get_formatted_ name()。在1处,我们创建 了一个名为NamesTestCase的类,用于包含一系列针对get_formatted_name()的单元测试。你可随 便给这个类命名,但最好让它看起来与要测试的函数相关,并包含字样Test。这个类必须继承 unittest.TestCase类,这样Python才知道如何运行你编写的测试。

NamesTestCase只包含一个方法,用于测试get_formatted_name()的一个方面。我们将这个方 法命名为test_first_last_name(),因为我们要核实的是只有名和姓的姓名能否被正确地格式化。 我们运行test_name_function.py时,所有以test_打头的方法都将自动运行。在这个方法中,我们 调用了要测试的函数,并存储了要测试的返回值。在这个示例中,我们使用实参'janis'和'joplin' 调用get_formatted_name(),并将结果存储到变量formatted_name中(见2)。

在3处,我们使用了unittest类最有用的功能之一:一个断言方法。断言方法用来核实得到 的结果是否与期望的结果一致。在这里,我们知道get_formatted_name()应返回这样的姓名,即 名和姓的首字母为大写,且它们之间有一个空格,因此我们期望formatted_name的值为Janis Joplin。为检查是否确实如此,我们调用unittest的方法assertEqual(),并向它传递formatted_ name和'Janis Joplin'。代码行self.assertEqual(formatted_name, 'Janis Joplin')的意思是说: “将formatted_name的值同字符串'Janis Joplin'进行比较,如果它们相等,就万事大吉,如果它 们不相等,跟我说一声!”

代码行unittest.main()让Python运行这个文件中的测试。运行test_name_function.py时,得 到的输出如下:

.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK

第1行的句点表明有一个测试通过了。接下来的一行指出Python运行了一个测试,消耗的时 间不到0.001秒。最后的OK表明该测试用例中的所有单元测试都通过了。 上述输出表明,给定包含名和姓的姓名时,函数get_formatted_name()总是能正确地处理。 修改get_formatted_name()后,可再次运行这个测试用例。如果它通过了,我们就知道在给定Janis Joplin这样的姓名时,这个函数依然能够正确地处理。

11.1.3 不能通过的测试

测试未通过时结果是什么样的呢?我们来修改get_formatted_name(),使其能够处理中间名, 但这样做时,故意让这个函数无法正确地处理像Janis Joplin这样只有名和姓的姓名。 下面是函数get_formatted_name()的新版本,它要求通过一个实参指定中间名:

name_ function.py
def get_formatted_name(first, middle, last):
"""生成整洁的姓名"""
 full_name = first + ' ' + middle + ' ' + last
 return full_name.title()

这个版本应该能够正确地处理包含中间名的姓名,但对其进行测试时,我们发现它再也不能 正确地处理只有名和姓的姓名。这次运行程序test_name_function.py时,输出如下:

1 E
======================================================================
2 ERROR: test_first_last_name (__main__.NamesTestCase)
----------------------------------------------------------------------
3 Traceback (most recent call last):
 File "test_name_function.py", line 8, in test_first_last_name
 formatted_name = get_formatted_name('janis', 'joplin')
TypeError: get_formatted_name() missing 1 required positional argument: 'last'
----------------------------------------------------------------------
4 Ran 1 test in 0.000s
5 FAILED (errors=1)

其中包含的信息很多,因为测试未通过时,需要让你知道的事情可能有很多。第1行输出只 有一个字母E(见1),它指出测试用例中有一个单元测试导致了错误。接下来,我们看到 NamesTestCase中的test_first_last_name()导致了错误(见2)。测试用例包含众多单元测试时, 知道哪个测试未通过至关重要。在3处,我们看到了一个标准的traceback,它指出函数调用 get_formatted_name('janis', 'joplin')有问题,因为它缺少一个必不可少的位置实参。 我们还看到运行了一个单元测试(见4)。最后,还看到了一条消息,它指出整个测试用例 都未通过,

因为运行该测试用例时发生了一个错误(见5)。这条消息位于输出末尾,让你一眼 就能看到——你可不希望为获悉有多少测试未通过而翻阅长长的输出。

11.1.4 测试未通过时怎么办

测试未通过时怎么办呢?如果你检查的条件没错,测试通过了意味着函数的行为是对的,而 测试未通过意味着你编写的新代码有错。因此,测试未通过时,不要修改测试,而应修复导致测 试不能通过的代码:检查刚对函数所做的修改,找出导致函数行为不符合预期的修改。 在这个示例中,get_formatted_name()以前只需要两个实参——名和姓,但现在它要求提供 名、中间名和姓。新增的中间名参数是必不可少的,这导致get_formatted_name()的行为不符合 预期。就这里而言,最佳的选择是让中间名变为可选的。这样做后,使用类似于Janis Joplin的姓 名进行测试时,测试就会通过了,同时这个函数还能接受中间名。下面来修改 get_formatted_name(),将中间名设置为可选的,然后再次运行这个测试用例。如果通过了,我 们接着确认这个函数能够妥善地处理中间名。 要将中间名设置为可选的,可在函数定义中将形参middle移到形参列表末尾,并将其默认值 指定为一个空字符串。我们还要添加一个if测试,以便根据是否提供了中间名相应地创建姓名:

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

在get_formatted_name()的这个新版本中,中间名是可选的。如果向这个函数传递了中间名 (if middle:),姓名将包含名、中间名和姓,否则姓名将只包含名和姓。现在,对于两种不同的 姓名,这个函数都应该能够正确地处理。为确定这个函数依然能够正确地处理像Janis Joplin这样 的姓名,我们再次运行test_name_function.py:

.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK 

现在,测试用例通过了。太好了,这意味着这个函数又能正确地处理像Janis Joplin这样的姓 名了,而且我们无需手工测试这个函数。这个函数很容易就修复了,因为未通过的测试让我们得 知新代码破坏了函数原来的行为。

关于“Python”的核心知识点整理大全25-CSDN博客

关于“Python”的核心知识点整理大全12-CSDN博客文章来源地址https://www.toymoban.com/news/detail-789102.html

往期快速传送门👆(在文章最后):

感谢大家的支持!欢迎订阅收藏!专栏将持续更新!

到了这里,关于关于“Python”的核心知识点整理大全27的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 关于“Python”的核心知识点整理大全40

    关于“Python”的核心知识点整理大全40

    目录 alien_invasion.py game_functions.py 14.3.3 在外星人被消灭时更新得分 settings.py game_functions.py game_functions.py alien_invasion.py 14.3.4 将消灭的每个外星人的点数都计入得分 game_functions.py 14.3.5 提高点数 settings.py settings.py 注意 14.3.6 将得分圆整 scoreboard.py 注意 14.3.7 最高得分 game_stats.py s

    2024年02月03日
    浏览(11)
  • 关于“Python”的核心知识点整理大全17

    关于“Python”的核心知识点整理大全17

    目录 ​编辑 8.3.4 结合使用函数和 while 循环 greeter.py 8.4 传递列表 greet_users.py 8.4.1 在函数中修改列表 printing_models.py 8.4.2 禁止函数修改列表 要将列表的副本传递给函数,可以像下面这样做: 往期快速传送门👆(在文章最后): 感谢大家的支持!欢迎订阅收藏!专栏将持续更

    2024年02月04日
    浏览(16)
  • 关于“Python”的核心知识点整理大全42

    关于“Python”的核心知识点整理大全42

    目录 game_functions.py game_functions.py game_functions.py alien_invasion.py 14.4 小结 第15 章 生成数据 15.1 安装 matplotlib 15.1.1 在 Linux 系统中安装 matplotlib 15.1.2 在 OS X 系统中安装 matplotlib 注意 15.1.3 在 Windows 系统中安装 matplotlib 注意 15.1.4 测试 matplotlib 注意 15.1.5 matplotlib 画廊 15.2 绘制简单的

    2024年02月03日
    浏览(63)
  • 关于“Python”的核心知识点整理大全59

    关于“Python”的核心知识点整理大全59

    目录 19.3.2 将数据关联到用户 1. 修改模型Topic models.py 2. 确定当前有哪些用户 3. 迁移数据库 注意 19.3.3 只允许用户访问自己的主题 views.py 19.3.4 保护用户的主题 views.py views.py 19.3.6 将新主题关联到当前用户 views.py 往期快速传送门👆(在文章最后): 感谢大家的支持!欢迎订阅

    2024年01月18日
    浏览(56)
  • 关于“Python”的核心知识点整理大全13

    关于“Python”的核心知识点整理大全13

    目录 6.4.3 在字典中存储字典 6.5 小结 第7章 用户输入和while循环 7.1 函数 input()的工作原理 7.1.1 编写清晰的程序 7.1.2 使用 int()来获取数值输入 7.1.3 求模运算符 7.1.4 在 Python 2.7 中获取输入 7.2 while 循环简介 7.2.1 使用 while 循环 往期快速传送门👆(在文章最后): 6.4.3 在字典中

    2024年02月04日
    浏览(46)
  • 关于“Python”的核心知识点整理大全41

    关于“Python”的核心知识点整理大全41

    目录 scoreboard.py game_functions.py game_functions.py 14.3.8 显示等级 game_stats.py scoreboard.py scoreboard.py scoreboard.py game_functions.py game_functions.py alien_invasion.py 14.3.9 显示余下的飞船数 ship.py scoreboard.py   我们将最高得分圆整到最近的10的整数倍(1),并添加了用逗号表示的千分位分隔符(见

    2024年02月04日
    浏览(10)
  • 关于“Python”的核心知识点整理大全44

    关于“Python”的核心知识点整理大全44

    目录 ​编辑 15.3.4 模拟多次随机漫步 rw_visual.py 注意 15.3.5 设置随机漫步图的样式 15.3.6 给点着色 rw_visual.py 15.3.7 重新绘制起点和终点 rw_visual.py 15.3.8 隐藏坐标轴 rw_visual.py 15.3.9 增加点数 rw_visual.py 15.3.10 调整尺寸以适合屏幕 rw_visual.py 15.4 使用 Pygal 模拟掷骰子 15.4.1 安装 Pygal 注

    2024年02月03日
    浏览(11)
  • 关于“Python”的核心知识点整理大全8

    关于“Python”的核心知识点整理大全8

    目录 ​编辑 4.5 元组 4.5.1 定义元组 dimensions.py 4.5.2 遍历元组中的所有值 4.5.3 修改元组变量 4.6 设置代码格式 4.6.1 格式设置指南 4.6.2 缩进 4.6.3 行长 4.6.4 空行 4.6.5 其他格式设置指南 4.7 小结 第5章 if语句 5.1 一个简单示例 cars.py 5.2 条件测试 5.2.1 检查是否相等 5.2.2 检查是否相等

    2024年02月05日
    浏览(12)
  • 关于“Python”的核心知识点整理大全47

    关于“Python”的核心知识点整理大全47

    目录 16.1.10 错误检查 highs_lows.py highs_lows.py 16.2 制作世界人口地图:JSON 格式 16.2.1 下载世界人口数据 16.2.2 提取相关的数据 population_data.json world_population.py 16.2.3 将字符串转换为数字值 world_population.py 2world_population.py 16.2.4 获取两个字母的国别码 countries.py country_codes.py 往期快速传

    2024年02月03日
    浏览(11)
  • 关于“Python”的核心知识点整理大全56

    关于“Python”的核心知识点整理大全56

      目录 6. 链接到页面new_topic topics.html 19.1.2 添加新条目 1. 用于添加新条目的表单 forms.py 2. URL模式new_entry urls.py 3. 视图函数new_entry() views.py 4. 模板new_entry new_entry.html 5. 链接到页面new_entry topic.html 19.1.3 编辑条目 1. URL模式edit_entry urls.py 2. 视图函数edit_entry() views.py 往期快速传送门

    2024年01月24日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包