Python有自带的单元测试框架unittest,那为什么还要学习pytest呢?先了解下pytest 相较于 unittest 有哪些优点:
- 语法简洁:pytest 使用基于assert的简洁语法,而 unittest 使用较为传统的断言方法,如 assertEqual 等。
- 易于上手:pytest 的简洁性使得它更易于上手和学习,测试用例编写更加直观。
- 参数化测试:pytest 支持使用装饰器来实现参数化测试,可以根据不同的参数运行同一个测试用例多次,而 unittest 实现类似功能相对复杂。
- 插件系统:pytest 拥有丰富的插件生态系统,可以通过插件来扩展和定制测试过程,而 unittest 的插件较少。
- 兼容性:pytest 可以运行 unittest 和 nose 编写的测试用例,具有很好的兼容性。
- 测试报告:pytest 支持生成详细的测试报告,并且有多种格式可选,如 HTML、JUnit XML 等。
- fixtures:pytest 提供了强大的 fixtures 机制,可以方便地为测试提供初始化和清理资源。
- 灵活性:pytest 支持多种运行方式,包括命令行模式和模块级导入等,提供了更多的灵活性。
- 集成:pytest 可以很好地与持续集成系统(如 Jenkins)集成,支持多种集成方式。
- 测试用例的 skip 和 xfail 处理:pytest 允许你跳过某些测试用例或标记预期失败的测试用例。
安装
要安装pytest,可以使用Python的包管理工具pip。以下是安装pytest的步骤:
-
安装pytest:使用pip工具来安装pytest。在命令行中运行以下命令来安装pytest:
pip install -U pytest
-
验证安装:安装完成后,可以运行以下命令来验证pytest是否成功安装:
pytest --version
如果安装成功,该命令将打印pytest的版本信息。
简单示例
以下是一个简单的pytest示例,假设我们有一个简单的函数add
,用于将两个数字相加:
# my_module.py
def add(a, b):
return a + b
现在我们来编写一个对这个函数进行测试的pytest测试用例:
# test_my_module.py
from my_module import add
def test_add():
assert add(2, 3) == 5
assert add(1, 9) == 10
在这个示例中,我们定义了一个名为test_add
的测试函数,其中包含了两个断言来测试add
函数的功能。要运行这个测试用例,只需在命令行中使用pytest命令即可:
pytest test_my_module.py
运行后,pytest将执行测试用例并输出结果。在这个简单示例中,如果一切正常,将看到测试通过的消息。
$ pytest test_my_module.py
===================================== test session starts ======================================
platform win32 -- Python 3.11.9, pytest-8.2.1, pluggy-1.5.0
rootdir: C:\Users\bill\PycharmProjects\test
plugins: anyio-4.3.0, Faker-25.0.1, xdist-3.6.1
collected 1 item
test_my_module.py . [100%]
======================================= 1 passed in 0.18s =======================================
在pytest中,也可以将多个测试用例组织到一个类中。这样做有助于更好地组织和管理测试用例,下面是一个示例:
class TestMathFunctions:
def test_addition(self):
assert 1 + 2 == 3
def test_subtraction(self):
assert 4 - 2 == 2
自动发现规则
默认的测试发现规则包括以下几点:
-
文件和文件夹命名规则: pytest会自动发现以test_开头或者以_test结尾的文件或者文件夹,并将其作为测试文件。
# 例如: