ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

测试函数——python编程从入门到实践

2019-07-11 23:02:04  阅读:295  来源: 互联网

标签:py last name get python 编程 formatted 测试函数 first


测试函数

  学习测试,得有测试的代码。下面是一个简单的函数:

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()像期望的那样工作,编写一个使用这个函数的程序:

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 + ".")

  运行:

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()进行自动化测试,就可信心满满,确信函数提供测试过的姓名时,都能正确工作。

1 单元测试和测试用例

  Python标准库中的模块unittest提供了代码测试工具。单元测试——合适函数某个方面没有问题;测试用例——一组单元测试,这些单元测试一起核实函数在各种情况下的行为都符合要求。良好的测试用例考虑到函数可能收到的各种输入,包含针对所有这些测试情形的测试。。。全覆盖式测试用例包含一整套单元测试,涵盖了各种可能的函数使用方式。

2 可通过的测试

  编写测试用例,可先导入模块unittest以及要测试的函数,再创建一个继承unittest.TestCase的类,并编写一系列方法对函数行为的不同方面进行测试。

  下面时一个只包含一个方法的测试用例,检查函数get_formatted_name()在给定名和姓时能否正确工作:

test_name_function.py

import unittest
from name_function import get_formatted_name


class 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运行这个文件中的测试

  运行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,运行结果:

Ran 1 test in 0.003s

FAILED (errors=1)

Error
Traceback (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 1

Assertion failed

Assertion failed

Assertion failed

  运行结果中给出了详细的错误信息。

4 测试未通过时怎么办

  由测试代码运行得到的错误信息可知get_formatted_name()少一个实参,修改get_formatted_name():

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()

  再次运行test_name_function.py:

Ran 1 test in 0.002s

OK

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类中可以使用很长的方法名,这些方法名必须是描述性的,这样才能明白测试未通过时的输出。

标签:py,last,name,get,python,编程,formatted,测试函数,first
来源: https://www.cnblogs.com/shirley-yang/p/11173321.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有