目录
在编写函数或类时,可以为其编写一个测试代码。通过测试,可确定代码面对各种输入是否都能按要求工作。测试成功会让你艰辛,无论有多少人使用你的程序,它都能正确地工作。在程序中添加新代码时,也可以对其进行测试,确认它们不会破坏程序既有的行为。
1 安装 pytest
# 在安装 pytest 库前,最好先更新一下 pip 库
python -m pip install --upgrade pip
# 安装 pytest 库
python -m pip install pytest
2 测试函数
2.1 被测函数
在编写测试函数前,必须的有被测试的代码。所以,下面先编写了一个简单的函数,它接受两个参数——名和姓,并返回格式规范的姓名:
def get_formatted_name(first, last):
full_name = f'{first} {last}'
return full_name.title()
2.2 单元测试和测试用例的概念
软件测试方法多种多样。一种最简单的测试时单元测试(unit test),用于核实函数的某个方面没有问题。测试用例(test case)是一组单元测试,这些单元测试一起核实函数在各种情况下的行为都符合要求。全覆盖(full coverage)测试用例包含一整套单元测试,涵盖了各种可能的函数使用方式。对于达性项目来说。要进行全覆盖测试可能很难。通常,最初只要针对代码的重要行为编写测试即可,等项目被广泛使用后在考虑全覆盖测试。
2.3 可通过的测试
使用 pytest 进行测试会让单元测试编写起来非常简单。我们将编写一个测试函数,它会调用要测试的函数,并做出有关返回值的断言。如果断言正确,表示测试通过;否则表示测试未通过。
编写测试文件时要注意,测试文件的名称必须以 test_ 开头。当 pytest 运行测试时,它将查找以 test_ 开头的文件,并运行其中的所有测试。
下面针对上面的函数 get_formatted_name() 编写一个测试,文件名为 test_name_function.py
# 引入 get_formatted_name 函数,name_function 为其所在的文件名
from name_function import get_formatted_name
# 定义一个单元测试函数,必须以 test_ 开头
def test_first_last_name():
formatted_name = get_formatted_name('janis', 'joplin')
assert formatted_name == 'Janis Joplin'
'''
这个测试函数名的长度比较长的原因有二:
1)测试函数必须以 test_ 开头。在测试过程中,pytest 会找出并运行所有以 test_ 开头
的函数
2)测试函数名应该比典型的函数名更长、更具描述性。你自己不会调用测试函数,而是由
pytest 替你查找并运行它们。因此,测试函数名应足够长,让你在测试报告中看到它们时,能清楚地
知道它们测试的是什么。
在调用被测试的函数 get_formatted_name() 时,向它传递了实参 ‘janis' 和 'joplin',并
将函数的返回值赋值给变量 formatted_name
最后,使用 assert(断言,用来声称满足特定的条件)语句,声称 formatted_name 的值为
’Janis Joplin‘
'''
'''
============================= test session starts =============================
collecting ... collected 1 item
test_name_function.py::test_first_last_name PASSED [100%]
============================== 1 passed in 0.01s ==============================
'''
'''
(本程序的运行环境为 Windows 10 + Pycharm)
运行该测试函数,将会得到上面的输出,接下来就对这个输出进行解读。
首先,test session starts 表示下面为 pytest 测试部分的信息
collecting ... collected 1 item 表示 pytest 找到了一个测试
test_name_function.py::test_first_last_name PASSED [100%]
指出了运行的是哪个测试文件的测试函数,函数名后面的 PASSED 表示该测试通过了,而 100% 指出运
行了所有的测试。
1 passed in 0.01s 指出有一个测试通过了,运行该测试花费的时间为 0.01 妙。
上述输出表明,在给定包含名和姓的姓名时,get_formatted_name() 函数总能正确地处理。
'''
2.4 未通过的测试
那么,测试未通过时会输出什么呢?现在修改一下上面的 get_formatted_name(),让其能处理中间名,但同时故意让该函数无法正确地处理像 Janis Joplin 这样只有名和姓的姓名。
def get_formatted_name(first, middle, last):
full_name = f'{first} {middle} {last}'
return full


609

被折叠的 条评论
为什么被折叠?



