SuperAPI AI 工具集

pytest-django-patterns

测试与质量

查看项目

更新于 10-16 01:56

技能介绍

pytest-django 测试模式技能,用于在 Django 项目中编写测试、创建测试工厂并遵循 TDD 工作流。

用途 该技能面向需要为 Django 应用编写自动化测试的场景,强调先写失败测试再实现功能的 TDD 流程,并提供 pytest-django 的常用模式与 Django 专有测试方法。

TDD 工作流(RED-GREEN-REFACTOR) 遵循固定循环:RED 先写描述期望行为的失败测试;GREEN 写最少代码让测试通过;REFACTOR 在测试保持绿色的前提下清理代码;REPEAT 重复。关键规则:实现功能或修复缺陷时,必须先写测试再改生产代码。

基础 pytest-django 模式 数据库访问:任何触碰数据库的测试使用 @pytest.mark.django_db;可对整个模块设 pytestmark = pytest.mark.django_db;每个测试后事务自动回滚。 测试数据 fixtures:模型使用 Factory Boy,setup 使用 pytest fixtures。工厂用 factory.Sequence() 处理唯一字段,factory.Faker() 生成真实感假数据,factory.SubFactory() 处理外键,@factory.post_generation 处理多对多关系。fixtures 用于客户端、认证状态或共享资源;client fixture 为 Django 测试客户端,可创建 auth_client fixture 通过 client.force_login(user) 发送已认证请求,并在 conftest.py 中定义以跨测试文件复用。

测试组织 测试结构镜像应用结构,例如 tests/ 下按 apps/posts/ 放置 test_models.py、test_views.py、test_forms.py,并包含 factories.py 与 conftest.py。相关测试归入类中,类名用 TestComponentName(如 TestPostListView),测试方法名描述性命名 test_<action>_<expected_outcome>,用 @pytest.mark.parametrize 覆盖多场景。

测试内容 视图:状态码(200、404、302);认证与匿名行为;授权(用户只能访问自己的数据);上下文数据;副作用(数据库变更、邮件发送、任务入队);HTMX 检查 HTTP_HX_REQUEST 头是否返回局部模板。 表单:校验(有效通过、无效报错);边界情况(空字段、最大长度、唯一约束);clean 方法;保存行为。 模型:方法(str、自定义方法);Manager/QuerySet 自定义过滤;约束;信号钩子。 Celery 任务:mock 外部调用(HTTP 请求、邮件等);只测逻辑,不测真实异步执行;幂等性。

Django 专有测试模式 测试 HTMX 响应:向 client 请求传 HTTP_HX_REQUEST="true",断言 response.templates 包含局部模板名。 测试权限:创建已认证与匿名客户端 fixtures,测试未授权访问的重定向/403 与授权访问的成功。 测试 QuerySet:用工厂创建数据、执行查询、断言正确对象被返回或排除,并验证 select_related()/prefetch_related() 加载关联对象。 测试带模型实例的表单:通过 form = MyForm(data=new_data, instance=existing_obj) 传入实例,验证 form.save() 是更新而非新建。

常见模式 parametrize 多场景;用 mocker.patch() mock 外部服务避免真实 HTTP、邮件或文件操作;检查数据库变更(创建后断言 exists(),删除后断言 count(),更新后用 refresh_from_db());测试错误处理(无效表单数据产生正确错误、失败操作返回错误响应、用户看到合适错误消息)。

运行测试 uv run pytest(全部测试)、uv run pytest -x(首个失败即停)、uv run pytest --lf(仅跑上次失败)、uv run pytest -x --lf(停首个且仅上次失败)、uv run pytest -k "test_name"(按模式匹配)、uv run pytest tests/apps/posts/(指定目录)、uv run pytest --cov=apps(带覆盖率报告)。

常见坑 忘记 @pytest.mark.django_db 会导致 "Database access not allowed" 错误;不使用工厂而手动创建实例冗长脆弱;测试实现细节而非行为与结果;跳过 TDD 导致测试跟随实现、遗漏边界;过度 mock(应 mock 外部依赖而非自己的代码);测试框架代码(不应测 Django ORM、表单校验,而应测自己的逻辑)。

配置要求 pyproject.toml 中设置 [tool.pytest.ini_options],包含 DJANGO_SETTINGS_MODULE = "config.settings.test"、python_files = ["test_*.py"]、addopts = ["--reuse-db", "-ra"]。conftest.py 中定义共享 fixtures(auth_client、常用工厂等)。

与其他技能的集成 systematic-debugging:修复缺陷时先写失败测试复现;django-models:测试自定义 Manager、QuerySet 与模型方法;django-forms:测试表单校验、clean 方法与保存行为;celery-patterns:用 mock 外部依赖测试任务逻辑。

限制 该技能聚焦 pytest-django 测试模式本身,未提供收费、价格、平台或效果等信息;具体项目配置与依赖版本以实际项目为准。