用途
本技能用于在 Python 项目中使用 pytest 测试框架编写和运行测试。当用户需要编写 Python 单元测试、使用 fixtures 进行测试初始化与依赖注入、参数化测试、模拟依赖、配置 pytest、生成覆盖率报告或并行运行测试时,可使用本技能。
主要能力
- 编写并运行 Python 单元测试
- 使用 fixtures 进行测试 setup、teardown 和依赖注入
- 参数化测试,以多组输入运行
- 使用 pytest-mock 或 unittest.mock 模拟依赖
- 通过 pytest.ini、pyproject.toml 或 conftest.py 配置 pytest
- 使用 pytest-cov 生成覆盖率报告
- 使用 pytest-xdist 并行运行测试
使用方式
工作流程:
- 编写以 test_ 前缀命名的测试函数或 Test 类
- 在 conftest.py 中使用 fixtures 实现共享 setup 和依赖注入
- 使用 pytest CLI 运行测试,按需应用 markers 和过滤器
- 使用覆盖率与报告插件分析结果
基础测试
def test_addition():
assert 1 + 1 == 2
def test_string_upper():
assert "hello".upper() == "HELLO"
Fixtures
import pytest
@pytest.fixture
def sample_user():
return {"name": "Alice", "email": "alice@example.com"}
def test_user_name(sample_user):
assert sample_user["name"] == "Alice"
@pytest.fixture(autouse=True)
def reset_database(db):
db.clear()
yield
db.clear()
参数化
import pytest
@pytest.mark.parametrize("input,expected", [
("hello", 5),
("", 0),
("pytest", 6),
])
def test_string_length(input, expected):
assert len(input) == expected
Mocking
def test_api_call(mocker):
mock_get = mocker.patch("requests.get")
mock_get.return_value.json.return_value = {"status": "ok"}
result = fetch_status()
assert result == "ok"
mock_get.assert_called_once()
运行测试
# Run all tests
pytest
# Verbose with pattern filter
pytest -v -k "test_user"
# With coverage
pytest --cov=mypackage --cov-report=html
# Parallel execution
pytest -n auto
最佳实践
- 保持测试相互独立,不共享可变状态;使用 fixtures 进行 setup 和 teardown
- 使用清晰、描述性的测试名称,说明预期行为
- 避免依赖测试执行顺序;使用 conftest.py 存放共享 fixtures
- 在 CI 中运行完整测试套件;使用 --cov 获取覆盖率,使用 --maxfail=1 快速失败
- 使用 markers(@pytest.mark.slow)对测试分类并运行子集
适用场景
适用于 Python 项目的单元测试编写与执行、测试初始化与清理、多输入参数化验证、外部依赖模拟、测试配置管理、覆盖率统计以及并行测试加速等场景。
限制
资料未提供关于收费、价格、平台支持范围、性能指标或具体效果的信息,暂未提供。