|
|
# 测试文档
|
|
|
|
|
|
## 📊 测试概览
|
|
|
|
|
|
| 测试文件 | 测试数量 | 覆盖模块 | 状态 |
|
|
|
|---------|---------|---------|------|
|
|
|
| `test_config.py` | 7 | 配置管理 | ✅ 通过 |
|
|
|
| `test_limiter.py` | 6 | 限流器 | ✅ 通过 |
|
|
|
| `test_http_utils.py` | 33 | HTTP 响应工具 | ✅ 通过 |
|
|
|
| **总计** | **46** | - | **✅ 全部通过** |
|
|
|
|
|
|
---
|
|
|
|
|
|
## 🚀 运行测试
|
|
|
|
|
|
### 运行所有测试
|
|
|
|
|
|
```bash
|
|
|
uv run --extra dev pytest
|
|
|
```
|
|
|
|
|
|
### 运行特定测试文件
|
|
|
|
|
|
```bash
|
|
|
# 运行 HTTP 工具测试
|
|
|
uv run --extra dev pytest tests/test_http_utils.py
|
|
|
|
|
|
# 运行配置测试
|
|
|
uv run --extra dev pytest tests/test_config.py
|
|
|
|
|
|
# 运行限流器测试
|
|
|
uv run --extra dev pytest tests/test_limiter.py
|
|
|
```
|
|
|
|
|
|
### 运行特定测试类
|
|
|
|
|
|
```bash
|
|
|
# 运行 success() 函数测试
|
|
|
uv run --extra dev pytest tests/test_http_utils.py::TestSuccessFunction
|
|
|
|
|
|
# 运行分页构建器测试
|
|
|
uv run --extra dev pytest tests/test_http_utils.py::TestPaginationBuilder
|
|
|
```
|
|
|
|
|
|
### 运行特定测试用例
|
|
|
|
|
|
```bash
|
|
|
# 运行单个测试
|
|
|
uv run --extra dev pytest tests/test_http_utils.py::TestSuccessFunction::test_success_with_data
|
|
|
```
|
|
|
|
|
|
### 带详细输出
|
|
|
|
|
|
```bash
|
|
|
# 详细模式
|
|
|
uv run --extra dev pytest -v
|
|
|
|
|
|
# 超详细模式
|
|
|
uv run --extra dev pytest -vv
|
|
|
```
|
|
|
|
|
|
---
|
|
|
|
|
|
## 📈 测试覆盖率
|
|
|
|
|
|
### 生成覆盖率报告
|
|
|
|
|
|
```bash
|
|
|
# 运行测试并生成覆盖率报告
|
|
|
uv run --extra dev pytest --cov=iti --cov-report=html
|
|
|
```
|
|
|
|
|
|
### 查看覆盖率报告
|
|
|
|
|
|
覆盖率报告会生成在 `htmlcov/` 目录:
|
|
|
|
|
|
```bash
|
|
|
# Windows
|
|
|
start htmlcov/index.html
|
|
|
|
|
|
# macOS
|
|
|
open htmlcov/index.html
|
|
|
|
|
|
# Linux
|
|
|
xdg-open htmlcov/index.html
|
|
|
```
|
|
|
|
|
|
---
|
|
|
|
|
|
## 📝 测试文件说明
|
|
|
|
|
|
### `test_config.py` - 配置测试
|
|
|
|
|
|
**测试内容:**
|
|
|
- ✅ 开发环境配置
|
|
|
- ✅ 测试环境配置
|
|
|
- ✅ 生产环境配置
|
|
|
- ✅ 配置类定义
|
|
|
- ✅ 配置获取函数
|
|
|
- ✅ 应用创建
|
|
|
- ✅ 应用上下文
|
|
|
|
|
|
**测试类:**
|
|
|
- `TestConfig2`: 配置类测试
|
|
|
|
|
|
---
|
|
|
|
|
|
### `test_limiter.py` - 限流器测试
|
|
|
|
|
|
**测试内容:**
|
|
|
- ✅ 测试环境禁用限流
|
|
|
- ✅ 开发环境限流配置
|
|
|
- ✅ 生产环境限流配置
|
|
|
- ✅ 限流器初始化
|
|
|
- ✅ 自定义限流配置
|
|
|
- ✅ 禁用限流配置
|
|
|
|
|
|
---
|
|
|
|
|
|
### `test_http_utils.py` - HTTP 工具测试
|
|
|
|
|
|
**测试内容:**
|
|
|
- ✅ `success()` 函数(6 个测试)
|
|
|
- ✅ `fail()` 函数(5 个测试)
|
|
|
- ✅ `pagination_builder()` 函数(6 个测试)
|
|
|
- ✅ `page()` 函数(7 个测试)
|
|
|
- ✅ Schema 定义(2 个测试)
|
|
|
- ✅ Flask 集成(4 个测试)
|
|
|
- ✅ 边界情况(5 个测试)
|
|
|
|
|
|
**测试类:**
|
|
|
- `TestSuccessFunction`: success() 函数测试
|
|
|
- `TestFailFunction`: fail() 函数测试
|
|
|
- `TestPaginationBuilder`: pagination_builder() 测试
|
|
|
- `TestPageFunction`: page() 函数测试
|
|
|
- `TestSchemaDefinitions`: Schema 定义测试
|
|
|
- `TestIntegrationWithFlaskApp`: Flask 集成测试
|
|
|
- `TestEdgeCases`: 边界情况测试
|
|
|
|
|
|
**详细测试列表:**
|
|
|
|
|
|
#### success() 函数测试
|
|
|
1. ✅ `test_success_default` - 默认参数
|
|
|
2. ✅ `test_success_with_data` - 带数据
|
|
|
3. ✅ `test_success_with_custom_msg` - 自定义消息
|
|
|
4. ✅ `test_success_with_custom_code` - 自定义状态码
|
|
|
5. ✅ `test_success_with_list` - 列表数据
|
|
|
6. ✅ `test_success_with_none_data` - None 数据
|
|
|
|
|
|
#### fail() 函数测试
|
|
|
1. ✅ `test_fail_default` - 默认参数
|
|
|
2. ✅ `test_fail_with_custom_msg` - 自定义消息
|
|
|
3. ✅ `test_fail_with_custom_code` - 自定义状态码
|
|
|
4. ✅ `test_fail_with_data` - 带额外数据
|
|
|
5. ✅ `test_fail_returns_dict` - 返回字典
|
|
|
|
|
|
#### pagination_builder() 测试
|
|
|
1. ✅ `test_manual_mode_basic` - 手动模式基础
|
|
|
2. ✅ `test_manual_mode_auto_calculate_pages` - 自动计算页数
|
|
|
3. ✅ `test_manual_mode_with_explicit_pages` - 显式指定页数
|
|
|
4. ✅ `test_manual_mode_zero_total` - 总数为 0
|
|
|
5. ✅ `test_manual_mode_urls_are_none_outside_request` - 请求上下文外 URL
|
|
|
6. ✅ `test_auto_mode_with_mock_pagination` - 自动模式
|
|
|
|
|
|
#### page() 函数测试
|
|
|
1. ✅ `test_page_with_list_and_dict` - 列表 + 字典
|
|
|
2. ✅ `test_page_with_custom_msg` - 自定义消息
|
|
|
3. ✅ `test_page_with_custom_code` - 自定义状态码
|
|
|
4. ✅ `test_page_with_mock_pagination_object` - Pagination 对象
|
|
|
5. ✅ `test_page_with_items_and_pagination_object` - 数据 + Pagination
|
|
|
6. ✅ `test_page_empty_items` - 空数据列表
|
|
|
7. ✅ `test_page_with_large_total` - 大数据量
|
|
|
|
|
|
#### Flask 集成测试
|
|
|
1. ✅ `test_success_in_route` - success() 在路由中
|
|
|
2. ✅ `test_fail_in_route` - fail() 在路由中
|
|
|
3. ✅ `test_page_in_route` - page() 在路由中
|
|
|
4. ✅ `test_index_with_schema` - Schema 验证
|
|
|
|
|
|
---
|
|
|
|
|
|
## ✍️ 编写测试
|
|
|
|
|
|
### 测试规范
|
|
|
|
|
|
1. **文件命名**: `test_*.py`
|
|
|
2. **类命名**: `Test*`(可选)
|
|
|
3. **函数命名**: `test_*`
|
|
|
4. **使用 pytest**: 使用 `pytest` 而非 `unittest`
|
|
|
5. **使用 fixtures**: 复用测试设置
|
|
|
|
|
|
### 示例:添加新测试
|
|
|
|
|
|
在 `tests/test_http_utils.py` 中添加:
|
|
|
|
|
|
```python
|
|
|
import pytest
|
|
|
from iti.applications.common.utils import success
|
|
|
|
|
|
class TestMyNewFeature:
|
|
|
"""测试新功能"""
|
|
|
|
|
|
def test_my_feature(self):
|
|
|
"""测试我的功能"""
|
|
|
result = success({'key': 'value'})
|
|
|
assert result['code'] == 200
|
|
|
assert result['data']['key'] == 'value'
|
|
|
```
|
|
|
|
|
|
### 使用 Fixtures
|
|
|
|
|
|
```python
|
|
|
@pytest.fixture
|
|
|
def app():
|
|
|
"""创建测试应用"""
|
|
|
from iti.applications import create_app
|
|
|
return create_app('test')
|
|
|
|
|
|
@pytest.fixture
|
|
|
def client(app):
|
|
|
"""创建测试客户端"""
|
|
|
return app.test_client()
|
|
|
|
|
|
def test_with_fixture(client):
|
|
|
"""使用 fixture 测试"""
|
|
|
response = client.get('/')
|
|
|
assert response.status_code == 200
|
|
|
```
|
|
|
|
|
|
---
|
|
|
|
|
|
## 🐛 调试测试
|
|
|
|
|
|
### 查看详细输出
|
|
|
|
|
|
```bash
|
|
|
# 显示 print() 输出
|
|
|
uv run --extra dev pytest -s
|
|
|
|
|
|
# 显示局部变量
|
|
|
uv run --extra dev pytest -l
|
|
|
|
|
|
# 进入调试器
|
|
|
uv run --extra dev pytest --pdb
|
|
|
```
|
|
|
|
|
|
### 仅运行失败的测试
|
|
|
|
|
|
```bash
|
|
|
# 首次运行记录结果
|
|
|
uv run --extra dev pytest
|
|
|
|
|
|
# 仅运行上次失败的测试
|
|
|
uv run --extra dev pytest --lf
|
|
|
|
|
|
# 先运行失败的,再运行其他的
|
|
|
uv run --extra dev pytest --ff
|
|
|
```
|
|
|
|
|
|
---
|
|
|
|
|
|
## 📊 持续集成
|
|
|
|
|
|
### GitHub Actions 示例
|
|
|
|
|
|
```yaml
|
|
|
name: Tests
|
|
|
|
|
|
on: [push, pull_request]
|
|
|
|
|
|
jobs:
|
|
|
test:
|
|
|
runs-on: ubuntu-latest
|
|
|
steps:
|
|
|
- uses: actions/checkout@v2
|
|
|
- name: Install uv
|
|
|
run: curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
|
- name: Run tests
|
|
|
run: uv run --extra dev pytest
|
|
|
- name: Generate coverage
|
|
|
run: uv run --extra dev pytest --cov=iti --cov-report=html
|
|
|
```
|
|
|
|
|
|
---
|
|
|
|
|
|
## 📚 参考资料
|
|
|
|
|
|
- [Pytest 官方文档](https://docs.pytest.org/)
|
|
|
- [Flask Testing 文档](https://flask.palletsprojects.com/en/latest/testing/)
|
|
|
- [Coverage.py 文档](https://coverage.readthedocs.io/)
|
|
|
|
|
|
---
|
|
|
|
|
|
**最后更新:** 2025-10-14
|
|
|
**维护者:** iTi-Flask Team
|
|
|
|