`pytest` 是一个广泛使用的 Python 测试框架,它极大地简化了编写和运行测试用例的过程。相较于 Python 内置的 `unittest` 模块,`pytest` 提供了更多的功能和便利性,使得测试更加高效且易于维护。下面将详细介绍 `pytest` 的核心特性和使用方法。
### 1. 安装与基本用法
可以通过 `pip` 来安装 `pytest`:
```bash
pip install pytest
```
`pytest` 可以自动发现并运行测试,只要测试文件或函数遵循一定的命名规则。测试函数通常以 `test_` 开头,或者在类中以 `test` 开头的方法。例如:
```python
# test_sample.py
def test_addition():
assert 1 + 1 == 2
class TestDivision:
def test_divisible_by_two(self):
assert 4 / 2 == 2
```
运行 `pytest` 命令,它会自动找到并执行这些测试:
```bash
pytest
```
### 2. 参数化测试
`pytest` 支持参数化测试,可以为同一测试用例提供多种输入值,从而减少代码重复。通过 `@pytest.mark.parametrize` 装饰器实现:
```python
import pytest
@pytest.mark.parametrize("num1,num2,expected", [(1, 2, 3), (0, 0, 0)])
def test_addition(num1, num2, expected):
assert num1 + num2 == expected
```
### 3. 固定变量与配置
`pytest` 提供 `conftest.py` 文件来定义全局变量和配置,这些设置对整个测试集有效。例如,可以在 `conftest.py` 中定义 fixtures(固定变量):
```python
# conftest.py
import pytest
@pytest.fixture
def db_connection():
# 创建数据库连接
return db.connect('localhost')
```
然后在测试函数中使用 `db_connection` fixture:
```python
# test_database.py
def test_data_retrieval(db_connection):
cursor = db_connection.cursor()
# 执行查询
...
```
### 4. 错误和失败处理
`pytest` 自动捕获 `AssertionError` 并显示详细的失败信息。此外,还可以使用 `pytest.raises` 来检查是否抛出了预期的异常:
```python
def test_divide_by_zero():
with pytest.raises(ZeroDivisionError):
1 / 0
```
### 5. 插件系统
`pytest` 有一个庞大的插件生态系统,可以扩展其功能。例如,`pytest-cov` 可用于代码覆盖率报告,`pytest-xdist` 支持并行运行测试以提高测试速度。
### 6. 收集与筛选
`pytest` 可以通过命令行参数选择要运行的测试。例如,使用 `-k` 参数筛选测试:
```bash
pytest -k addition # 只运行包含 "addition" 的测试
```
或使用 `-m` 标签筛选:
```bash
pytest -m slow # 运行标记为 "slow" 的测试
```
### 7. 生成测试报告
`pytest` 可以生成详细的测试报告,包括 XML 输出,这在持续集成环境中很有用。使用 `--junitxml` 选项:
```bash
pytest --junitxml=test_results.xml
```
总结,`pytest` 以其易用性、灵活性和强大的功能,已经成为 Python 开发者首选的测试框架之一。通过深入理解和使用这些特性,可以更好地组织和维护测试代码,确保项目的质量和稳定性。