Django测试期间查看数据库问题:测试数据库始终为空
搞定Django测试数据库为空的问题
嗨,我来帮你捋捋为啥配置了测试数据库但跑完测试后是空的,这几个常见原因和解决办法你可以挨个排查:
1. Django测试的默认事务回滚在搞鬼
Django自带的TestCase类为了保证每个测试的独立性,默认会在每个测试方法执行前开启事务,测试结束后自动回滚。也就是说,你在test_add_members里创建的pp_castrillon这类数据,测试一结束就被撤销了,所以你打开test_db.sqlite3看不到任何数据——这其实是正常的设计哦。
如果你只是想确认测试中数据确实生成了,不用盯着数据库看,直接在测试方法里加断言就行:
self.assertEqual(Grup.objects.count(), 1) # 假设你预期创建了1条数据
要是你非要让数据留在数据库里方便调试,有两个办法:
- 改用
TransactionTestCase类:它会在每个测试后截断表(而不是回滚),不过--keepdb只会保留表结构,数据还是会被清掉; - 临时在测试最后手动提交事务(只适合调试,别用到正式测试里):
from django.db import transaction transaction.commit()
2. 先确认测试数据库配置真的生效了
有时候你改了配置,但Django根本没读到。可以在测试方法里加一行打印,看看当前用的是不是你指定的测试库:
from django.db import connections print(connections['default'].settings_dict['NAME'])
运行测试后看输出,如果不是test_db.sqlite3,那大概率是你改的配置文件不对,或者有其他地方(比如环境变量、其他配置模块)覆盖了DATABASES的设置。
3. 检查你的测试代码本身
说不定是test_add_members里的代码根本没把数据存进数据库:
- 是不是创建模型实例后忘了调用
save()?比如你写了pp_castrillon = Grup(...)但没加pp_castrillon.save(),用Grup.objects.create(...)才会自动保存; - 有没有条件判断跳过了数据创建的逻辑?
- 是不是模型的
save()方法被重写了,导致数据没正确入库?
可以在测试里加个打印看看:
print("当前Grup数据:", Grup.objects.all())
如果输出是空的,那就是测试代码的问题啦。
4. 别误解--keepdb的作用
--keepdb只是让Django不要每次测试都删除重建测试数据库的表结构,节省时间,但它不会保留之前测试的数据。每次测试还是会在干净的表结构上跑,数据该回滚还是会回滚,该截断还是会截断。
内容的提问来源于stack exchange,提问作者Roberto Fernandez Diaz
相关产品推荐
相关产品推荐

