SuperAPI AI 工具集

pytest

测试与质量

查看项目

更新于 10-16 07:52

技能介绍

用途

本技能用于在 Python 项目中使用 pytest 测试框架编写和运行测试。当用户需要编写 Python 单元测试、使用 fixtures 进行测试初始化与依赖注入、参数化测试、模拟依赖、配置 pytest、生成覆盖率报告或并行运行测试时,可使用本技能。

主要能力

  • 编写并运行 Python 单元测试
  • 使用 fixtures 进行测试 setup、teardown 和依赖注入
  • 参数化测试,以多组输入运行
  • 使用 pytest-mock 或 unittest.mock 模拟依赖
  • 通过 pytest.ini、pyproject.toml 或 conftest.py 配置 pytest
  • 使用 pytest-cov 生成覆盖率报告
  • 使用 pytest-xdist 并行运行测试

使用方式

工作流程:

  1. 编写以 test_ 前缀命名的测试函数或 Test 类
  2. 在 conftest.py 中使用 fixtures 实现共享 setup 和依赖注入
  3. 使用 pytest CLI 运行测试,按需应用 markers 和过滤器
  4. 使用覆盖率与报告插件分析结果

基础测试

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 项目的单元测试编写与执行、测试初始化与清理、多输入参数化验证、外部依赖模拟、测试配置管理、覆盖率统计以及并行测试加速等场景。

限制

资料未提供关于收费、价格、平台支持范围、性能指标或具体效果的信息,暂未提供。