测试理念
我们相信全面的测试是可靠性与可维护性的基础。我们的测试套件包括:
- 单元测试 (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 开发模式)。