python单元测试框架pytest的使用示例

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 等。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

后端开发标签