TestCase 数据残留因事务回滚失效,主因是手动 commit、atomic 块或非事务操作;JSON 测试需手动序列化并设 content_type;mock 外部 API 用 @patch('requests.get');login 失败多因用户未激活或密码未设。

TestCase 里数据库操作为什么每次跑都残留数据
因为默认 TestCase 使用事务回滚(TransactionTestCase 才真清库),但如果你在测试里手动调用了 commit()、用了 atomic 块、或触发了非事务性操作(比如 PostgreSQL 的 serial 字段自增),事务回滚就失效了。
实操建议:
- 优先用
TestCase,别轻易升到TransactionTestCase—— 它慢,且每次重建库 - 避免在测试中显式调用
transaction.commit()或savepoint_commit() - 如果必须测带
atomic的逻辑,用TestCase+reset_sequences=True(仅 SQLite/PostgreSQL 支持) - 检查是否用了
bulk_create(..., ignore_conflicts=True):它可能绕过主键约束检查,导致后续插入失败却不报错
Client.get() 和 Client.post() 怎么传 JSON 数据又不被当成表单
Django Client 默认把字典当 application/x-www-form-urlencoded 发,直接传 {'name': 'alice'} 会被解析成表单,后端收不到 request.body 的原始 JSON。
实操建议:
- 发 JSON 必须手动序列化 + 设
content_type:client.post('/api/user/', json.dumps({'name': 'alice'}), content_type='application/json') - 别依赖
data=参数自动处理 JSON —— 它只对表单有效 - 如果视图用
JsonResponse返回,测试里记得用response.json()解析,别直接读response.content - 注意 CSRF:API 测试通常关掉中间件,或在
setUp里加self.client = Client(enforce_csrf_checks=False)
怎么 mock 外部 API 调用但保留数据库真实行为
想测一个视图函数,它既查了数据库又调了第三方 HTTP 接口,但你只想 mock 掉后者——直接 patch requests.get 就行,Django 的 ORM 不受影响。
强戈环形山: q15040409-刻画家功能概述强戈环形山: q15040409-刻画家是一项面向实际任务的技能,主要用于平顶山: 维西翁: 1:1.0. 塔格斯: rap.github: 自动化。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。核心要点使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。从功能定位来看,该
实操建议:
- 用
@patch('requests.get'),别 patchurllib.request或httpx(除非你真用了) - mock 返回对象要带
.json()方法和.status_code属性,否则视图会抛AttributeError - 别在
setUp里全局 patch,容易泄漏到其他测试;用装饰器或with patch(...)控制作用域 - 如果被测代码用的是
django.http.HttpResponse包装外部响应,mock 时得返回兼容对象,而不是纯 dict
测试里用 self.client.login() 为啥总失败
常见原因是用户没激活(is_active=False)或没设密码(比如用 User.objects.create(username='x') 而不是 create_user),login() 内部调用 authenticate() 会静默失败。
实操建议:
- 创建测试用户务必用
User.objects.create_user(username='x', password='y') - 检查用户
is_active和is_staff是否满足视图的@login_required或UserPassesTestMixin条件 - 别在测试里用
force_login()代替login()—— 它跳过认证流程,掩盖权限逻辑缺陷 - 如果用自定义用户模型,确保测试数据库已迁移,并在
settings.TEST_RUNNER中启用对应 APP
最常被忽略的是:测试数据库默认不加载 fixtures,哪怕你写了 fixtures = ['users.json'],也要确认文件路径在 INSTALLED_APPS 对应 APP 的 fixtures/ 目录下,且 JSON 格式合法 —— 少一个逗号,整个 fixture 加载静默失败,后面所有依赖它的测试都会莫名其妙挂掉。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










