Add unit tests for models and services
- Implemented unit tests for Object model including folder and file creation, properties, and path retrieval. - Added unit tests for Setting model covering creation, unique constraints, and type enumeration. - Created unit tests for User model focusing on user creation, uniqueness, and group relationships. - Developed unit tests for Login service to validate login functionality, including 2FA and token generation. - Added utility tests for JWT creation and verification, ensuring token integrity and expiration handling. - Implemented password utility tests for password generation, hashing, and TOTP verification.
This commit is contained in:
225
tests/integration/QUICK_REFERENCE.md
Normal file
225
tests/integration/QUICK_REFERENCE.md
Normal file
@@ -0,0 +1,225 @@
|
||||
# 集成测试快速参考
|
||||
|
||||
## 快速命令
|
||||
|
||||
```bash
|
||||
# 运行所有测试
|
||||
pytest tests/integration/ -v
|
||||
|
||||
# 运行特定类别
|
||||
pytest tests/integration/api/ -v # 所有 API 测试
|
||||
pytest tests/integration/middleware/ -v # 所有中间件测试
|
||||
|
||||
# 运行单个文件
|
||||
pytest tests/integration/api/test_user.py -v
|
||||
|
||||
# 运行单个测试
|
||||
pytest tests/integration/api/test_user.py::test_user_login_success -v
|
||||
|
||||
# 生成覆盖率
|
||||
pytest tests/integration/ --cov --cov-report=html
|
||||
|
||||
# 并行运行
|
||||
pytest tests/integration/ -n auto
|
||||
|
||||
# 显示详细输出
|
||||
pytest tests/integration/ -vv -s
|
||||
```
|
||||
|
||||
## 测试文件速查
|
||||
|
||||
| 文件 | 测试内容 | 端点前缀 |
|
||||
|------|---------|---------|
|
||||
| `test_site.py` | 站点配置 | `/api/site/*` |
|
||||
| `test_user.py` | 用户操作 | `/api/user/*` |
|
||||
| `test_admin.py` | 管理员功能 | `/api/admin/*` |
|
||||
| `test_directory.py` | 目录操作 | `/api/directory/*` |
|
||||
| `test_object.py` | 对象操作 | `/api/object/*` |
|
||||
| `test_auth.py` | 认证中间件 | - |
|
||||
|
||||
## 常用 Fixtures
|
||||
|
||||
```python
|
||||
# HTTP 客户端
|
||||
async_client: AsyncClient
|
||||
|
||||
# 认证
|
||||
auth_headers: dict[str, str] # 普通用户
|
||||
admin_headers: dict[str, str] # 管理员
|
||||
|
||||
# 数据库
|
||||
initialized_db: AsyncSession # 预填充的测试数据库
|
||||
test_session: AsyncSession # 空的测试会话
|
||||
|
||||
# 用户信息
|
||||
test_user_info: dict # {"username": "testuser", "password": "testpass123"}
|
||||
admin_user_info: dict # {"username": "admin", "password": "adminpass123"}
|
||||
|
||||
# 测试数据
|
||||
test_directory_structure: dict # {"root_id": UUID, "docs_id": UUID, ...}
|
||||
|
||||
# Tokens
|
||||
test_user_token: str # 有效的用户 token
|
||||
admin_user_token: str # 有效的管理员 token
|
||||
expired_token: str # 过期的 token
|
||||
```
|
||||
|
||||
## 测试模板
|
||||
|
||||
### 基础 API 测试
|
||||
```python
|
||||
import pytest
|
||||
from httpx import AsyncClient
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_endpoint_name(
|
||||
async_client: AsyncClient,
|
||||
auth_headers: dict[str, str]
|
||||
):
|
||||
"""测试描述"""
|
||||
response = await async_client.get(
|
||||
"/api/path",
|
||||
headers=auth_headers
|
||||
)
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert "expected_field" in data
|
||||
```
|
||||
|
||||
### 需要测试数据的测试
|
||||
```python
|
||||
@pytest.mark.asyncio
|
||||
async def test_with_data(
|
||||
async_client: AsyncClient,
|
||||
auth_headers: dict[str, str],
|
||||
test_directory_structure: dict[str, UUID]
|
||||
):
|
||||
"""使用预创建的测试数据"""
|
||||
folder_id = test_directory_structure["docs_id"]
|
||||
# 测试逻辑...
|
||||
```
|
||||
|
||||
### 认证测试
|
||||
```python
|
||||
@pytest.mark.asyncio
|
||||
async def test_requires_auth(async_client: AsyncClient):
|
||||
"""测试需要认证"""
|
||||
response = await async_client.get("/api/protected")
|
||||
assert response.status_code == 401
|
||||
```
|
||||
|
||||
### 权限测试
|
||||
```python
|
||||
@pytest.mark.asyncio
|
||||
async def test_requires_admin(
|
||||
async_client: AsyncClient,
|
||||
auth_headers: dict[str, str]
|
||||
):
|
||||
"""测试需要管理员权限"""
|
||||
response = await async_client.get(
|
||||
"/api/admin/endpoint",
|
||||
headers=auth_headers
|
||||
)
|
||||
assert response.status_code == 403
|
||||
```
|
||||
|
||||
## 测试数据
|
||||
|
||||
### 默认用户
|
||||
- **testuser** / testpass123 (普通用户)
|
||||
- **admin** / adminpass123 (管理员)
|
||||
- **banneduser** / banned123 (封禁用户)
|
||||
|
||||
### 目录结构
|
||||
```
|
||||
testuser/
|
||||
├── docs/
|
||||
│ ├── images/
|
||||
│ └── readme.md (1KB)
|
||||
```
|
||||
|
||||
## 常见断言
|
||||
|
||||
```python
|
||||
# 状态码
|
||||
assert response.status_code == 200
|
||||
assert response.status_code == 401 # 未认证
|
||||
assert response.status_code == 403 # 权限不足
|
||||
assert response.status_code == 404 # 不存在
|
||||
assert response.status_code == 409 # 冲突
|
||||
|
||||
# 响应数据
|
||||
data = response.json()
|
||||
assert "field" in data
|
||||
assert data["field"] == expected_value
|
||||
assert isinstance(data["list"], list)
|
||||
|
||||
# 列表长度
|
||||
assert len(data["items"]) > 0
|
||||
assert len(data["items"]) <= page_size
|
||||
|
||||
# 嵌套数据
|
||||
assert "nested" in data
|
||||
assert "field" in data["nested"]
|
||||
```
|
||||
|
||||
## 调试技巧
|
||||
|
||||
```bash
|
||||
# 显示完整输出
|
||||
pytest tests/integration/api/test_user.py -vv -s
|
||||
|
||||
# 只运行失败的测试
|
||||
pytest tests/integration/ --lf
|
||||
|
||||
# 遇到第一个失败就停止
|
||||
pytest tests/integration/ -x
|
||||
|
||||
# 显示最慢的 10 个测试
|
||||
pytest tests/integration/ --durations=10
|
||||
|
||||
# 使用 pdb 调试
|
||||
pytest tests/integration/ --pdb
|
||||
```
|
||||
|
||||
## 故障排查
|
||||
|
||||
### 问题: 测试全部失败
|
||||
```bash
|
||||
# 检查依赖
|
||||
pip install -e .
|
||||
|
||||
# 检查 Python 路径
|
||||
python -c "import sys; print(sys.path)"
|
||||
```
|
||||
|
||||
### 问题: JWT 相关错误
|
||||
```python
|
||||
# 检查 JWT 密钥是否设置
|
||||
from utils.JWT import JWT
|
||||
print(JWT.SECRET_KEY)
|
||||
```
|
||||
|
||||
### 问题: 数据库错误
|
||||
```python
|
||||
# 确保所有模型都已导入
|
||||
from models import *
|
||||
```
|
||||
|
||||
## 性能基准
|
||||
|
||||
预期测试时间(参考):
|
||||
- 单个测试: < 1s
|
||||
- 整个文件: < 10s
|
||||
- 所有集成测试: < 1min
|
||||
|
||||
如果超过这些时间,检查:
|
||||
1. 数据库连接
|
||||
2. 异步配置
|
||||
3. Fixtures 作用域
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [README.md](README.md) - 详细的测试文档
|
||||
- [conftest.py](conftest.py) - Fixtures 定义
|
||||
- [../../INTEGRATION_TESTS_SUMMARY.md](../../INTEGRATION_TESTS_SUMMARY.md) - 实现总结
|
||||
Reference in New Issue
Block a user