Python Pytest 教程展示了如何使用 pytest 模块测试 Python 应用。
python pytest
Pytest 是用于测试 Python 应用的 Python 库。 它是鼻子测试和单元测试的替代方法。
pytest 安装
使用以下命令安装 Pytest:
这将安装pytest
库。
pytest 测试发现约定
如果未指定任何参数,则在testpaths
(如果已配置)或当前目录中的位置搜索测试文件。 另外,命令行参数可以在目录,文件名或节点 ID 的任何组合中使用。
pytest 在所选目录中查找test_*.py
或*_test.py
文件。 在选定的文件中,pytest 在类之外查找带前缀的测试函数,并在带前缀的测试类中查找带前缀的测试方法(无__init__()
方法)。
运行 pytest
pytest 不带任何参数,将查看当前工作目录(或其他一些预配置的目录)以及测试文件的所有子目录,并运行找到的测试代码。
运行当前目录中的所有测试文件。
我们可以通过指定名称作为参数来运行特定的测试文件。
可以通过在::
字符后提供其名称来运行特定功能。
标记可用于对测试进行分组。 然后使用pytest -m
运行一组标记的测试。
另外,我们可以使用表达式来运行与测试函数和类的名称匹配的测试。
Python pytest 简单示例
在第一个示例中,我们将使用 pytest 测试两个简单的数学算法。
algo.py
我们有一个带有自定义max()
和min()
功能的模块。
min_max_test.py
测试文件min_max_test.py
的名称中包含一个测试词。
此外,测试功能test_min()
具有测试字。 我们使用assert
关键字来测试算法的值。
这是输出。 有两个测试,并且都成功通过了。 pytest -v min_max_test.py
显示了更详细的输出。
Pytest 跳过
使用跳过装饰器,我们可以跳过指定的测试。 跳过测试有多种原因。 例如,数据库/在线服务目前不可用,或者我们跳过了 Windows 上针对 Linux 的特定测试。
skipping.py
在示例中,test_min()
被跳过。
在测试文件名后面的输出中,s 代表跳过的和。 通过。
pytest 标记
我们可以使用标记将测试组织为单元。
marking.py
我们有两组由标记 a 和 b 标识的测试。 这些单元由pytest -m a marking.py
和pytest -m b marking.py
运行。
Pytest 参数化测试
通过参数化测试,我们可以向断言中添加多个值。 我们使用@pytest.mark.parametrize
标记。
parametrized.py
在示例中,我们使用多个输入数据测试这两个功能。
我们将两个值传递给测试函数:数据和期望值。 在我们的例子中,我们用三个数据元组测试min()
函数。
Pytest 输出告知有六次运行。
pytest 夹具
测试需要在一组已知对象的背景下进行。 这组对象称为测试夹具。
algo.py
对于此示例,我们向algo.py
模块添加了一个选择排序算法。
fixtures.py
我们用夹具测试选择排序。
我们的测试装置仅返回一些测试数据。 请注意,我们通过其名称引用此灯具:data
。
在test_sel_sort()
函数中,我们将数据夹具作为函数参数传递。
这是输出。
Pytest 布局
Python 测试可以多种方式组织。 测试可以集成在 Python 包中,也可以放在包外。
综合测试
接下来,我们展示如何在 Python 包中运行测试。
我们有这种包装布局。 测试与软件包一起位于tests
子目录中。
setup.py
这是setup.py
。
utils/algo.py
这是algo.py
文件。
utils/srel.py
我们还有另一个模块,其中包含一个测试单词是否为回文的功能。
tests/algo_test.py
这些是utils.algo
模块的测试。 注意,我们使用完整的模块名称。
tests/srel_test.py
这是对is_palindrome()
功能的测试。
utils/__init__.py
utils/tests/__init__.py
两个__init__.py
文件均为空。
我们使用pytest --pyargs utils
命令运行测试。
外部测试
下一个示例显示了应用源布局,其中测试未集成在包内。
在这种布局中,我们在源代码树之外进行测试。 请注意,不需要__init__.py
文件。
我们设置PYTHONPATH
并运行 pytest。
在本教程中,我们介绍了 Python pytest 库。
您可能也对以下相关教程感兴趣:Python 教程,Python Jinja 教程。