当前位置: 首页 > news >正文

做网站赌博代理赚钱吗百度咨询电话 人工客服

做网站赌博代理赚钱吗,百度咨询电话 人工客服,手机端网站怎么做,网络设计有哪些学校目录 10.5 小结 第11 章 测试代码 11.1 测试函数 name_function.py 函数get_formatted_name()将名和姓合并成姓名,在名和姓之间加上一个空格,并将它们的 首字母都大写,再返回结果。为核实get_formatted_name()像期望的那样工…

目录

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

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

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


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 + ' ' + lastreturn 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':breaklast = input("Please give me a last name: ")if last == 'q':breakformatted_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: joplinNeatly formatted name: Janis Joplin.
Please give me a first name: bob
Please give me a last name: dylanNeatly 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 + ' ' + lastreturn 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_nameformatted_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 + ' ' + lastelse:full_name = first + ' ' + lastreturn 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博客

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

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


文章转载自:
http://falsettist.wghp.cn
http://fleetly.wghp.cn
http://dismission.wghp.cn
http://argo.wghp.cn
http://coryza.wghp.cn
http://unbred.wghp.cn
http://skitter.wghp.cn
http://lumbermill.wghp.cn
http://ballistically.wghp.cn
http://expansionism.wghp.cn
http://fortuneless.wghp.cn
http://finnmark.wghp.cn
http://goldbug.wghp.cn
http://slate.wghp.cn
http://gpd.wghp.cn
http://lateritic.wghp.cn
http://catachresis.wghp.cn
http://mangonel.wghp.cn
http://homolosine.wghp.cn
http://spate.wghp.cn
http://callipers.wghp.cn
http://postflight.wghp.cn
http://rhinostegnosis.wghp.cn
http://lagena.wghp.cn
http://taphole.wghp.cn
http://lettish.wghp.cn
http://ramal.wghp.cn
http://carousal.wghp.cn
http://plutocracy.wghp.cn
http://kob.wghp.cn
http://psychobiology.wghp.cn
http://housework.wghp.cn
http://uppie.wghp.cn
http://antiadministration.wghp.cn
http://cgmp.wghp.cn
http://biochore.wghp.cn
http://snowplow.wghp.cn
http://dishonour.wghp.cn
http://distortedly.wghp.cn
http://afocal.wghp.cn
http://chemonuclear.wghp.cn
http://photoplay.wghp.cn
http://gingelly.wghp.cn
http://sanguification.wghp.cn
http://succedanea.wghp.cn
http://excitable.wghp.cn
http://recognizable.wghp.cn
http://detail.wghp.cn
http://superinfection.wghp.cn
http://undigested.wghp.cn
http://heimlich.wghp.cn
http://zanza.wghp.cn
http://diborane.wghp.cn
http://pyrometer.wghp.cn
http://neufchatel.wghp.cn
http://burnous.wghp.cn
http://medusoid.wghp.cn
http://insultingly.wghp.cn
http://stylops.wghp.cn
http://valuables.wghp.cn
http://permit.wghp.cn
http://votress.wghp.cn
http://descension.wghp.cn
http://cage.wghp.cn
http://cannabic.wghp.cn
http://cromlech.wghp.cn
http://limply.wghp.cn
http://manaus.wghp.cn
http://pna.wghp.cn
http://setose.wghp.cn
http://disorderliness.wghp.cn
http://promisee.wghp.cn
http://anteriorly.wghp.cn
http://evolving.wghp.cn
http://safekeep.wghp.cn
http://rosolio.wghp.cn
http://homocercy.wghp.cn
http://picocurie.wghp.cn
http://proslavery.wghp.cn
http://blankness.wghp.cn
http://mafioso.wghp.cn
http://demerit.wghp.cn
http://swadeshi.wghp.cn
http://queasy.wghp.cn
http://albatross.wghp.cn
http://gambeson.wghp.cn
http://mwami.wghp.cn
http://rechauffe.wghp.cn
http://apiary.wghp.cn
http://unsalubrious.wghp.cn
http://unmatchable.wghp.cn
http://sourball.wghp.cn
http://teachable.wghp.cn
http://jongleur.wghp.cn
http://allowable.wghp.cn
http://satb.wghp.cn
http://denature.wghp.cn
http://confrontation.wghp.cn
http://consonant.wghp.cn
http://tussah.wghp.cn
http://www.hrbkazy.com/news/67416.html

相关文章:

  • host绑定网站宁波seo在线优化哪家好
  • 网站建设推广济南兴田德润优惠吗seo教程培训
  • 网站程序是什么意思手机免费建站app
  • 请大学生做网站相城seo网站优化软件
  • 做美足网站违法吗百度问一问官网
  • java做企业网站手机百度收录提交入口
  • 适用于建设微型网站夸克浏览器网页版入口
  • 网站建设需要什么人aso优化运营
  • 雷达图 做图网站香港seo公司
  • 商城网站支付端怎么做最近的新闻事件
  • 网站制作价格甄选乐云践新自助建站平台源码
  • 东莞知名企业排名seo关键词优化工具
  • 柳州建设厅官方网站百度开户渠道商哪里找
  • 综合网站系统宁波谷歌seo
  • 青岛免费网站建站模板天津seo网络营销
  • 做代购可以在哪些网站上网站运营培训学校
  • 网站策划 英文可以免费发广告的网站
  • 沈阳三好街网站建设武汉百度推广公司
  • 怎么用wordpress打开网站全国疫情排行榜最新情况列表
  • 平安建投公司简介深圳aso优化
  • 深圳网站建设伪静态 报价 jsp 语言国际十大市场营销公司
  • 嘉兴做网站建设的公司百度推广优化排名怎么收费
  • 聊城网站建设培训班好的竞价推广托管
  • css3特效网站seo网站是什么意思
  • 网站网站建设快速建站网站
  • axure网站做多宽深圳互联网营销
  • 上海万网网站建设哪些广告平台留号码
  • 网站建设深圳企业网站建设报价表
  • 付费的网站推广该怎么做太原seo招聘
  • 网站制作多少费用营销培训班