学习目标
- 如何使用模块unittest中的工具为函数和类编写测试
- 如何编写继承unittest.TestCase的类,以及如何编写测试方法,以核实函数和类的行为符合预期
- 如何使用setUp()来根据类高效地创建实例并设置其属性,以便在类的所有测试方法中都可以使用它们
1. 测试函数
要学习测试,得要有测试的代码。下面是简单的函数,它接收名和姓并返回整洁的姓名。
name_function.py
def get_formatted_name(first, last):
"""生成整洁的姓名"""
full_name = first + ' ' + last
return full_name.title()
函数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 + ".")
模拟用户输入名和姓,可以看到全名,以下是程序的运行结果:
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:q
从上述输出可知,合并的全名正确。现在假如我们需要修改函数,使其还能够处理中间名。同时不破坏只有名和姓的处理方式。为此,我们需要修改函数后都进行测试:运行程序names.py,输入Janis Joplin这样的姓名,但这样太繁琐了。所幸python提供了一种自动化测试函数的高效方式。倘若我们对函数进行自动化测试,就能始终信心满满,确信函数能够正确的工作。
1.1 单元测试和测试用例
python标准库中的模块unittest提供了代码测试工具。单元测试用于核实函数的某个方面没有问题;测试用例是一组单元测试。全覆盖式测试用例包括一整套单元测试,涵盖了各种可能的函数使用方式。通常,最初只要对代码的重要行为编写测试即可。
1.2 可通过的测试
以下是一个只包含一个方法的测试用例,它检查函数能否正确工作。
test_name_function.py
import unittest
from name_function import get_formatted_name
class NameTestCase(unittest.TestCase):
"""测试name_function.py"""
def test_firs