跳转到主要内容

测试理念

我们相信全面的测试是可靠性与可维护性的基础。我们的测试套件包括:
  • 单元测试 (Unit Tests):隔离测试单个组件
  • 集成测试 (Integration Tests):测试组件间的交互
  • 端到端测试 (End-to-End Tests):测试完整的工作流

运行测试

# 运行所有测试
pytest

# 以详细模式运行
pytest -v

# 运行特定的测试文件
pytest tests/test_provider_garmin.py

# 运行匹配特定模式的测试
pytest -k "test_oauth"

# 运行并生成覆盖率报告
pytest --cov=connect --cov-report=html

测试结构

tests/
├── __init__.py
├── conftest.py                    # 共享的 fixtures
├── test_provider_garmin.py
├── test_provider_whoop.py
├── test_data_formatting.py
└── fixtures/
    ├── sample_responses.json
    └── mock_data.py

编写测试

单元测试示例

import pytest
from connect.theta.mirobody_garmin.provider_garmin import ThetaGarminProvider

@pytest.fixture
def provider():
    return ThetaGarminProvider()

@pytest.mark.asyncio
async def test_provider_info(provider):
    """测试 Provider 元数据"""
    info = provider.info
    assert info.slug == "theta_garmin"
    assert info.supported is True

集成测试示例

@pytest.mark.integration
@pytest.mark.asyncio
async def test_complete_oauth_flow():
    """测试完整的 OAuth 流程"""
    provider = ThetaGarminProvider()
    
    # 测试绑定
    request = MockRequest(user_id="test_user")
    result = await provider.link(request)
    assert "link_web_url" in result

最佳实践

  • 使用描述性名称:test_oauth_link_generates_valid_url
  • test_ 开头
  • 将相关的测试组织在类中
  • 使用 fixtures 进行通用设置
  • 保持 fixtures 简单
  • 谨慎使用 autouse=True
  • Mock 外部服务
  • 不要 Mock 正在测试的对象本身
  • 对于 HTTP 调用,建议使用 aioresponses
  • 使用具体的断言
  • 每个测试只验证一件事
  • 添加有意义的失败提示消息

持续集成 (CI)

测试会在每次推送到 GitHub 时通过 GitHub Actions 自动运行。配置详情请参阅 .github/workflows/test.yml
在实现新功能之前先编写测试(采用 TDD 开发模式)。