首页技术文章正文

测试函数——PYTHON编程从入门到实践【黑马python培训】

更新时间:2022年11月16日 15时43分08秒 来源:黑马程序员论坛

黑马中级程序员课程

学习测试,得有测试的代码。下面是一个简单的函数:
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()像期望的那样工作,编写一个使用这个函数的程序:
[url=][/url]
names.py
from name_function import get_formatted_nameprint("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 + ".")[url=][/url]

  运行:
[url=][/url]
Enter 'q' at any time to quit.Please give me a first name: janisPlease give me a last name: joplin    Neatly formatted name: Janis Joplin.Please give me a first name: bobPlease give me a last name: dylan    Neatly formatted name: Bob Dylan.Please give me a first name: q[url=][/url]

  从输出可知,合并得到的姓名正确无误。现在假设要修改get_formatted_name(),使其还能够处理中间名。确保不破化这个函数处理只有名和姓的方式,为此可在每次修改get_formatted_name()后都进行测试:运行names.py,并输入像Janis Joplin这样的姓名。但python提供了一种自动化测试函数输出的高效方式,对get_formatted_name()进行自动化测试,就可信心满满,确信函数提供测试过的姓名时,都能正确工作。
1 单元测试和测试用例
  Python标准库中的模块unittest提供了代码测试工具。单元测试——合适函数某个方面没有问题;测试用例——一组单元测试,这些单元测试一起核实函数在各种情况下的行为都符合要求。良好的测试用例考虑到函数可能收到的各种输入,包含针对所有这些测试情形的测试。。。全覆盖式测试用例包含一整套单元测试,涵盖了各种可能的函数使用方式。
2 可通过的测试
  编写测试用例,可先导入模块unittest以及要测试的函数,再创建一个继承unittest.TestCase的类,并编写一系列方法对函数行为的不同方面进行测试。
  下面时一个只包含一个方法的测试用例,检查函数get_formatted_name()在给定名和姓时能否正确工作:
[url=][/url]
test_name_function.py
import unittestfrom name_function import get_formatted_nameclass NamesTestCase(unittest.TestCase):  # 创建包含针对 get_formatted_name() 的单元测试的类;最好包含字样Test;必须继承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')  # unittest类中的一个断言方法,判断是否相等if __name__ == '__main__':  # 在pycharm中运行时需要这行代码,IDLE运行则不需要    unittest.main()  # 让python运行这个文件中的测试[url=][/url]

  运行test_name_function.py时,所有以test打头的方法都将自动运行。
3 不能通过的测试
  修改get_formatted_name(),使其能够处理中间名,但这样做时,故意让函数无法处理只有名和姓的名字。
  get_formatted_name()的新版本,通过一个实参指定中间名:
name_function.py
def get_formatted_name(first, middle, last):    """Generate a neatly formatted full name."""    full_name = first + ' ' + middle + ' ' + last    return full_name.title()

  此时运行test_name_function.py,运行结果:
[url=][/url]
Ran 1 test in 0.003sFAILED (errors=1)ErrorTraceback (most recent call last):  File "C:\Program Files\Python 3.7\lib\unittest\case.py", line 59, in testPartExecutor    yield  File "C:\Program Files\Python 3.7\lib\unittest\case.py", line 615, in run    testMethod()  File "C:\Users\yxf\Desktop\python_pycharm\test_names_function.py", line 10, in test_first_last_name    formatted_name = get_formatted_name('janis', 'joplin')TypeError: get_formatted_name() missing 1 required positional argument: 'last'Process finished with exit code 1Assertion failedAssertion failedAssertion failed[url=][/url]

  运行结果中给出了详细的错误信息。
4 测试未通过时怎么办
  由测试代码运行得到的错误信息可知get_formatted_name()少一个实参,修改get_formatted_name():
[url=][/url]
def get_formatted_name(first, last, middle=''):    """Generate a neatly formatted full name."""    if middle:        full_name = first + ' ' + middle + ' ' + last    else:        full_name = first + ' ' + last    return full_name.title()[url=][/url]

  再次运行test_name_function.py:
Ran 1 test in 0.002sOK
5 添加新测试
  再编写一个测试用例,用于测试包含中间名字的测试,即在NamesTestCase类中再添加一个方法:
    def test_first_last_middle_name(self):        """能够正确地处理像Wolfgang Amadeus Mozart这样的名字吗?"""        formatted_name = get_formatted_name('wolfgang', 'mozart', 'amadeus')        self.assertEqual(formatted_name, 'Wolfgang Amadeus Mozart')
  ***调用函数时,可选实参,即本段代码中中间名在最后。
  方法名必须以test_打头,这样它才会在运行test_name_function.py时自动运行。
  在TestCase类中可以使用很长的方法名,这些方法名必须是描述性的,这样才能明白测试未通过时的输出。

推荐了解热门学科

java培训 Python人工智能 Web前端培训 PHP培训
区块链培训 影视制作培训 C++培训 产品经理培训
UI设计培训 新媒体培训 产品经理培训 Linux运维
大数据培训 智能机器人软件开发




传智播客是一家致力于培养高素质软件开发人才的科技公司“黑马程序员”是传智播客旗下高端IT教育品牌。自“黑马程序员”成立以来,教学研发团队一直致力于打造精品课程资源,不断在产、学、研3个层面创新自己的执教理念与教学方针,并集中“黑马程序员”的优势力量,针对性地出版了计算机系列教材50多册,制作教学视频数+套,发表各类技术文章数百篇。

传智播客从未停止思考

传智播客副总裁毕向东在2019IT培训行业变革大会提到,“传智播客意识到企业的用人需求已经从初级程序员升级到中高级程序员,具备多领域、多行业项目经验的人才成为企业用人的首选。”

中级程序员和初级程序员的差别在哪里?
项目经验。毕向东表示,“中级程序员和初级程序员最大的差别在于中级程序员比初级程序员多了三四年的工作经验,从而多出了更多的项目经验。“为此,传智播客研究院引进曾在知名IT企业如阿里、IBM就职的高级技术专家,集中研发面向中高级程序员的课程,用以满足企业用人需求,尽快补全IT行业所需的人才缺口。

何为中高级程序员课程?

传智播客进行了定义。中高级程序员课程,是在当前主流的初级程序员课程的基础上,增加多领域多行业的含金量项目,从技术的广度和深度上进行拓展“我们希望用5年的时间,打造上百个高含金量的项目,覆盖主流的32个行业。”传智播客课程研发总监于洋表示。




黑马程序员热门视频教程【点击播放】

Python入门教程完整版(懂中文就能学会) 零起点打开Java世界的大门
C++| 匠心之作 从0到1入门学编程 PHP|零基础入门开发者编程核心技术
Web前端入门教程_Web前端html+css+JavaScript 软件测试入门到精通


分享到:
在线咨询 我要报名
和我们在线交谈!