?name_function.py
def get_formatted_name(first,last):
"""生成整洁的姓名。"""
full_name = f"{first} {last}"
return full_name.title()
?用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("\nPlease give me a last name: ")
if last == 'q':
break
formatted_name = get_formatted_name(first,last)
print(f"\tNeatly formatted name:{formatted_name}")
单元测试和测试用例
? ? ? ? Python 标准库中的模块unittest提供了代码测试工具。单元测试用于核实函数的某个方面没有问题。测试用例是一组单元测试,它们一道核实函数在各种情形下的行为都符合要求。良好的测试用例考虑到了函数可能收到的各种输入,包含针对所有这些情形的测试。全覆盖的测试用例包含一整套单元测试,涵盖了各种可能的函数使用方式。
? ? ? ? 要为函数编写测试用例,可先导入模块unittest和要测试的函数,再创建一个继承unittest,TestCase的类,并编写一系列方法对函数行为的不同方面进行测试。
import unittest
from name_function import get_formatted_name
class NamesTestCase(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')
if __name__ == '__main__':
unittest.main()
? ? ? ??首先,导入了模块unittest和要测试的函数get_formatted_name()。创建了一个名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。 ? ? ? ?使用了?unittest类最有用的功能之一:断言方法。断言方法核实得到的结果是否与期望的结果一致。在这里,我们知道?get_formatted_name()应返回名和姓首字母大写且之间有一个空格的姓名,因此期望?formatted_name的值为Janis?Joplin。为检查是否确实如此,我们语用unittest的方法assertEqual(),并向它传递formatted_name和'Janis?Joplin'。代码行
self.assertEqual(formatted_name,?'Janis?Joplin')
的意思是:“将formatted_name的值与字符串‘Janis?Joplin'比较。如果它们相等,那么万事大吉;如果它们不相等,就告诉我一声!” ? ? ? ? 我们将直接运行这个文件,但需要指出的是,很多测试框架都会先导入测试文件再运行。导人文件时,解释器将在导入的同时执行它。if代码块检查特殊变量__name__,这个变量是在程序执行时设置的。如果这个文件作为主程序执行,变量__name__将被设置为’__main__。在这里,调用unittest.main()来运行测试用例。如果这个文件被测试框架导入,变量__name__的值将不是‘__main__’,因此不会调用unittest.main()。
? ? ? ? 测试结果如下:
Ran 1 test in 0.003s
OK
未完待续
|