Files
disknext/tests/QUICK_REFERENCE.md
于小丘 f93cb3eedb 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.
2025-12-19 19:48:05 +08:00

5.4 KiB
Raw Blame History

测试快速参考

常用命令

# 运行所有测试
pytest

# 运行特定文件
pytest tests/unit/models/test_user.py

# 运行特定测试
pytest tests/unit/models/test_user.py::test_user_create

# 带详细输出
pytest -v

# 带覆盖率
pytest --cov

# 生成 HTML 覆盖率报告
pytest --cov --cov-report=html

# 并行运行(需要 pytest-xdist
pytest -n auto

# 只运行失败的测试
pytest --lf

# 显示所有输出(包括 print
pytest -s

# 停在第一个失败
pytest -x

使用测试脚本

# 检查环境
python tests/check_imports.py

# 运行所有测试
python run_tests.py

# 运行特定模块
python run_tests.py models
python run_tests.py utils
python run_tests.py service

# 带覆盖率
python run_tests.py --cov

常用 Fixtures

数据库

async def test_example(db_session: AsyncSession):
    """使用数据库会话"""
    pass

测试用户

async def test_with_user(db_session: AsyncSession, test_user: dict):
    """使用测试用户"""
    user_id = test_user["id"]
    username = test_user["username"]
    password = test_user["password"]
    token = test_user["token"]

认证请求头

def test_api(auth_headers: dict):
    """使用认证请求头"""
    headers = auth_headers  # {"Authorization": "Bearer ..."}

编写新测试模板

"""
模块名称的单元测试
"""
import pytest
from sqlmodel.ext.asyncio.session import AsyncSession

from models.your_model import YourModel


@pytest.mark.asyncio
async def test_feature_description(db_session: AsyncSession):
    """测试功能的简短描述"""
    # 准备: 创建测试数据
    instance = YourModel(field="value")
    instance = await instance.save(db_session)

    # 执行: 调用被测试的方法
    result = await YourModel.get(
        db_session,
        YourModel.id == instance.id
    )

    # 验证: 断言结果符合预期
    assert result is not None
    assert result.field == "value"

常见断言

# 相等
assert value == expected

# 不相等
assert value != expected

# 真假
assert condition is True
assert condition is False

# 包含
assert item in collection
assert item not in collection

# 类型检查
assert isinstance(value, int)

# 异常检查
import pytest
with pytest.raises(ValueError):
    function_that_raises()

# 近似相等(浮点数)
assert abs(value - expected) < 0.001

# 多个条件
assert all([
    condition1,
    condition2,
    condition3,
])

数据库操作示例

# 创建
user = User(username="test", password="pass")
user = await user.save(db_session)

# 查询
user = await User.get(
    db_session,
    User.username == "test"
)

# 更新
update_data = UserBase(username="new_name")
user = await user.update(db_session, update_data)

# 删除
await User.delete(db_session, user)

# 批量创建
users = [User(...), User(...)]
await User.add(db_session, users)

# 加载关系
user = await User.get(
    db_session,
    User.id == user_id,
    load=User.group  # 加载关系
)

测试组织

tests/
├── conftest.py              # 共享 fixtures
├── unit/                    # 单元测试
│   ├── models/              # 模型测试
│   ├── utils/               # 工具测试
│   └── service/             # 服务测试
└── integration/             # 集成测试(待添加)

调试技巧

# 显示 print 输出
pytest -s

# 进入 pdb 调试器
pytest --pdb

# 在第一个失败处停止
pytest -x --pdb

# 显示详细错误信息
pytest -vv

# 显示最慢的 10 个测试
pytest --durations=10

标记测试

# 标记为慢速测试
@pytest.mark.slow
def test_slow_operation():
    pass

# 跳过测试
@pytest.mark.skip(reason="暂未实现")
def test_future_feature():
    pass

# 条件跳过
@pytest.mark.skipif(condition, reason="...")
def test_conditional():
    pass

# 预期失败
@pytest.mark.xfail
def test_known_bug():
    pass

运行特定标记:

pytest -m slow        # 只运行慢速测试
pytest -m "not slow"  # 排除慢速测试

覆盖率报告

# 终端输出
pytest --cov

# HTML 报告(推荐)
pytest --cov --cov-report=html
# 打开 htmlcov/index.html

# XML 报告CI/CD
pytest --cov --cov-report=xml

# 只看未覆盖的行
pytest --cov --cov-report=term-missing

性能提示

# 并行运行(快 2-4 倍)
pytest -n auto

# 只运行上次失败的
pytest --lf

# 先运行失败的
pytest --ff

# 禁用输出捕获(略快)
pytest --capture=no

常见问题排查

导入错误

# 检查导入
python tests/check_imports.py

# 确保从项目根目录运行
cd c:\Users\Administrator\Documents\Code\Server
pytest

数据库错误

所有测试使用内存数据库,不需要外部数据库。如果遇到错误:

# 检查 conftest.py 是否正确配置
# 检查是否使用了正确的 fixture
async def test_example(db_session: AsyncSession):
    pass

Fixture 未找到

# 确保 conftest.py 在正确位置
# 确保 fixture 名称拼写正确
# 检查 fixture 的 scope

资源