python-pytest-ops

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Python pytest Patterns

Python pytest 测试模式

Modern pytest patterns for effective testing.
用于高效测试的现代pytest模式。

Basic Test Structure

基础测试结构

python
import pytest

def test_basic():
    """Simple assertion test."""
    assert 1 + 1 == 2

def test_with_description():
    """Descriptive name and docstring."""
    result = calculate_total([1, 2, 3])
    assert result == 6, "Sum should equal 6"
python
import pytest

def test_basic():
    """Simple assertion test."""
    assert 1 + 1 == 2

def test_with_description():
    """Descriptive name and docstring."""
    result = calculate_total([1, 2, 3])
    assert result == 6, "Sum should equal 6"

Fixtures

Fixture

python
import pytest

@pytest.fixture
def sample_user():
    """Create test user."""
    return {"id": 1, "name": "Test User"}

@pytest.fixture
def db_connection():
    """Fixture with setup and teardown."""
    conn = create_connection()
    yield conn
    conn.close()

def test_user(sample_user):
    """Fixtures injected by name."""
    assert sample_user["name"] == "Test User"
python
import pytest

@pytest.fixture
def sample_user():
    """Create test user."""
    return {"id": 1, "name": "Test User"}

@pytest.fixture
def db_connection():
    """Fixture with setup and teardown."""
    conn = create_connection()
    yield conn
    conn.close()

def test_user(sample_user):
    """Fixtures injected by name."""
    assert sample_user["name"] == "Test User"

Fixture Scopes

Fixture 作用域

python
@pytest.fixture(scope="function")  # Default - per test
@pytest.fixture(scope="class")     # Per test class
@pytest.fixture(scope="module")    # Per test file
@pytest.fixture(scope="session")   # Entire test run
python
@pytest.fixture(scope="function")  # Default - per test
@pytest.fixture(scope="class")     # Per test class
@pytest.fixture(scope="module")    # Per test file
@pytest.fixture(scope="session")   # Entire test run

Parametrize

参数化测试

python
@pytest.mark.parametrize("input,expected", [
    (1, 2),
    (2, 4),
    (3, 6),
])
def test_double(input, expected):
    assert double(input) == expected
python
@pytest.mark.parametrize("input,expected", [
    (1, 2),
    (2, 4),
    (3, 6),
])
def test_double(input, expected):
    assert double(input) == expected

Multiple parameters

Multiple parameters

@pytest.mark.parametrize("x", [1, 2]) @pytest.mark.parametrize("y", [10, 20]) def test_multiply(x, y): # 4 test combinations assert x * y > 0
undefined
@pytest.mark.parametrize("x", [1, 2]) @pytest.mark.parametrize("y", [10, 20]) def test_multiply(x, y): # 4 test combinations assert x * y > 0
undefined

Exception Testing

异常测试

python
def test_raises():
    with pytest.raises(ValueError) as exc_info:
        raise ValueError("Invalid input")
    assert "Invalid" in str(exc_info.value)

def test_raises_match():
    with pytest.raises(ValueError, match=r".*[Ii]nvalid.*"):
        raise ValueError("Invalid input")
python
def test_raises():
    with pytest.raises(ValueError) as exc_info:
        raise ValueError("Invalid input")
    assert "Invalid" in str(exc_info.value)

def test_raises_match():
    with pytest.raises(ValueError, match=r".*[Ii]nvalid.*"):
        raise ValueError("Invalid input")

Markers

标记器

python
@pytest.mark.skip(reason="Not implemented yet")
def test_future_feature():
    pass

@pytest.mark.skipif(sys.platform == "win32", reason="Unix only")
def test_unix_feature():
    pass

@pytest.mark.xfail(reason="Known bug")
def test_buggy():
    assert broken_function() == expected

@pytest.mark.slow
def test_performance():
    """Custom marker - register in pytest.ini."""
    pass
python
@pytest.mark.skip(reason="Not implemented yet")
def test_future_feature():
    pass

@pytest.mark.skipif(sys.platform == "win32", reason="Unix only")
def test_unix_feature():
    pass

@pytest.mark.xfail(reason="Known bug")
def test_buggy():
    assert broken_function() == expected

@pytest.mark.slow
def test_performance():
    """Custom marker - register in pytest.ini."""
    pass

Mocking

模拟测试

python
from unittest.mock import Mock, patch, MagicMock

def test_with_mock():
    mock_api = Mock()
    mock_api.get.return_value = {"status": "ok"}
    result = mock_api.get("/endpoint")
    assert result["status"] == "ok"

@patch("module.external_api")
def test_with_patch(mock_api):
    mock_api.return_value = {"data": []}
    result = function_using_api()
    mock_api.assert_called_once()
python
from unittest.mock import Mock, patch, MagicMock

def test_with_mock():
    mock_api = Mock()
    mock_api.get.return_value = {"status": "ok"}
    result = mock_api.get("/endpoint")
    assert result["status"] == "ok"

@patch("module.external_api")
def test_with_patch(mock_api):
    mock_api.return_value = {"data": []}
    result = function_using_api()
    mock_api.assert_called_once()

pytest-mock (Recommended)

pytest-mock(推荐用法)

python
def test_with_mocker(mocker):
    mock_api = mocker.patch("module.api_call")
    mock_api.return_value = {"success": True}
    result = process_data()
    assert result["success"]
python
def test_with_mocker(mocker):
    mock_api = mocker.patch("module.api_call")
    mock_api.return_value = {"success": True}
    result = process_data()
    assert result["success"]

conftest.py

conftest.py 配置

python
undefined
python
undefined

tests/conftest.py - Shared fixtures

tests/conftest.py - Shared fixtures

import pytest
@pytest.fixture(scope="session") def app(): """Application fixture available to all tests.""" return create_app(testing=True)
@pytest.fixture def client(app): """Test client fixture.""" return app.test_client()
undefined
import pytest
@pytest.fixture(scope="session") def app(): """Application fixture available to all tests.""" return create_app(testing=True)
@pytest.fixture def client(app): """Test client fixture.""" return app.test_client()
undefined

Quick Reference

快速参考

CommandDescription
pytest
Run all tests
pytest -v
Verbose output
pytest -x
Stop on first failure
pytest -k "test_name"
Run matching tests
pytest -m slow
Run marked tests
pytest --lf
Rerun last failed
pytest --cov=src
Coverage report
pytest -n auto
Parallel (pytest-xdist)
命令描述
pytest
运行所有测试
pytest -v
详细输出
pytest -x
首次失败后停止
pytest -k "test_name"
运行匹配名称的测试
pytest -m slow
运行标记为slow的测试
pytest --lf
重新运行上次失败的测试
pytest --cov=src
生成覆盖率报告
pytest -n auto
并行运行测试(需pytest-xdist)

Additional Resources

额外资源

  • ./references/fixtures-advanced.md
    - Factory fixtures, autouse, conftest patterns
  • ./references/mocking-patterns.md
    - Mock, patch, MagicMock, side_effect
  • ./references/async-testing.md
    - pytest-asyncio patterns
  • ./references/coverage-strategies.md
    - pytest-cov, branch coverage, reports
  • ./references/integration-testing.md
    - Database fixtures, API testing, testcontainers
  • ./references/property-testing.md
    - Hypothesis framework, strategies, shrinking
  • ./references/test-architecture.md
    - Test pyramid, organization, isolation strategies
  • ./references/fixtures-advanced.md
    - 工厂Fixture、自动使用、conftest模式
  • ./references/mocking-patterns.md
    - Mock、patch、MagicMock、side_effect
  • ./references/async-testing.md
    - pytest-asyncio 模式
  • ./references/coverage-strategies.md
    - pytest-cov、分支覆盖率、报告
  • ./references/integration-testing.md
    - 数据库Fixture、API测试、testcontainers
  • ./references/property-testing.md
    - Hypothesis框架、策略、简化
  • ./references/test-architecture.md
    - 测试金字塔、组织、隔离策略

Scripts

脚本

  • ./scripts/run-tests.sh
    - Run tests with recommended options
  • ./scripts/generate-conftest.sh
    - Generate conftest.py boilerplate
  • ./scripts/run-tests.sh
    - 使用推荐选项运行测试
  • ./scripts/generate-conftest.sh
    - 生成conftest.py 模板代码

Assets

资源文件

  • ./assets/pytest.ini.template
    - Recommended pytest configuration
  • ./assets/conftest.py.template
    - Common fixture patterns

  • ./assets/pytest.ini.template
    - 推荐的pytest配置
  • ./assets/conftest.py.template
    - 常见Fixture模式

See Also

另请参阅

Related Skills:
  • python-typing-ops
    - Type-safe test code
  • python-async-ops
    - Async test patterns (pytest-asyncio)
Testing specific frameworks:
  • python-fastapi-ops
    - TestClient, API testing
  • python-database-ops
    - Database fixtures, transactions
相关技能:
  • python-typing-ops
    - 类型安全的测试代码
  • python-async-ops
    - 异步测试模式(pytest-asyncio)
特定框架测试:
  • python-fastapi-ops
    - TestClient、API测试
  • python-database-ops
    - 数据库Fixture、事务