1. pytest介绍
pytest 是 Python 社区中广泛使用的、成熟稳定的单元测试框架。它不仅允许开发人员编写测试代码,还提供丰富的功能和插件,使得测试变得更加简便。
pytest 的用法比较简单,通常需要做的仅仅是编写对被测函数的测试用例以及使用 pytest 进行测试的。敲黑板,划重点,批量执行测试用例、mock 或者 patch 掉不便于测试的模块或者函数是编写测试代码时经常使用的技巧。
2. 安装 pytest
在使用 pytest 之前,我们需要先安装 pytest。使用如下命令即可安装:
pip install pytest
有时候如果想使用最新版本的 pytest,可以使用如下命令:
pip install pytest --upgrade
安装完成后,可以运行如下命令,检查是否安装成功:
pytest --version
3. 编写 pytest 测试用例
我们以一个求和函数为例子,来看看 pytest 如何编写测试用例:
# sum.py
def my_sum(a, b):
return a + b
为了进行单元测试,我们需要编写与 my_sum 函数对应的测试用例。在 pytest 中,测试用例可以通过以 test_ 开头来命名,然后放在一个单独的文件或者一个单独的目录中。
假设我们把测试用例放在一个名为 test_sum.py 的文件中,该文件的内容可以为:
# test_sum.py
import sum
def test_sum():
assert sum.my_sum(1, 2) == 3
assert sum.my_sum(1, -1) == 0
assert sum.my_sum(0, 0) == 0
在 test_sum.py 文件中,我们先导入了 sum.py 文件中的 my_sum 函数,然后又定义了一个名为 test_sum 的测试函数。在该测试函数中,我们编写了针对 my_sum 函数的三个测试用例。
其中,第一行使用 assert 语句来判断 my_sum 函数在给定参数情况下的输出是否与期望值相等,如果不相等,则会输出 AssertionError。这样我们就可以很方便地测试 my_sum 函数的正确性和稳定性。
4. 运行 pytest 测试用例
有了测试用例文件,我们就可以使用 pytest 运行测试用例了。只需要在终端中切换到测试用例所在的目录中,然后运行如下命令:
pytest
执行成功后,会在终端中输出测试结果。输出结果的每一行都表示一次测试,其中点号表示测试通过,F 表示测试失败,E 表示测试错误。如果没有输出,则表示所有测试用例均已通过。
5. 使用 fixture 优化测试用例
在 pytest 中,fixture 是一个可以被测试用例使用的预设数值。如果用例不指定 fixture,pytest 默认将其定义为函数。
我们可以通过如下方式定义一个 fixture:
import pytest
@pytest.fixture
def input_data():
return {'x': 10, 'y': 20}
在我们的例子中,input_data() 将会返回一个名为 input_data 的 fixture。我们可以在测试函数中通过参数输入该数据。
# test_sum.py
import sum
import pytest
@pytest.fixture
def input_data():
return {'x': 10, 'y': 20}
def test_sum(input_data):
# foo = input_data['x'] 是测试函数可以直接使用 fixture 返回的数据
assert sum.my_sum(input_data['x'], input_data['y']) == 30
在上述例子中,我们将 test_sum 函数重构为使用 input_data fixture,我们只需在函数参数列表中添加一个参数名,pytest 会自动识别 input_data 为 fixture,并在运行测试用例前执行 input_data。
fixture 可以返回不同的数值,装饰器为 '@pytest.fixture(scope=pretest_session or pretest_function or innerfunction or class)'。
6. 总结
本文介绍了 pytest 的基本使用方法。pytest 不仅可以对单元测试进行批量测试,还可以使用 fixture 优化测试用例。pytest 的功能也不止于此,之后会详细介绍 pytest 的一些高级特性,包括参数化、mock 等。