Django测试中创建的模型实例为何未出现在真实数据库?
Django测试中setUp创建的记录不在真实数据库的原因及解释
嘿,这完全是Django测试框架的正常设计哦!你遇到的情况一点都不奇怪,我来给你捋清楚:
核心原因:临时测试数据库
Django的TestCase(也就是你用的这个测试类)会自动为每个测试运行创建一个独立的临时数据库,所有测试过程中的数据库操作(包括你在setUp()里创建的test_user)都只会在这个临时库中执行,测试结束后这个临时库会被自动销毁,所以你的真实数据库完全不会受到测试操作的影响。
这也是为什么你在测试代码里(包括断点调试时)能正常获取到这条记录——因为你当时访问的是临时测试数据库,而不是你平时开发用的真实数据库。
补充细节
- 你用的
TestCase还会自动开启数据库事务,每个测试方法执行完后都会回滚事务,进一步保证测试之间的独立性,避免测试数据互相干扰。 - 如果你的测试确实需要操作真实数据库(非常不推荐,容易污染生产/开发数据),可以考虑使用
SimpleTestCase(但它不支持数据库操作),或者手动修改测试的数据库配置,但这违背了测试隔离的原则,一般不建议这么做。
验证小技巧
你可以在测试代码里加一行打印数据库名称的代码,就能看到测试用的是临时库了:
from django.db import connection class UserTest(TestCase): def setUp(self): test_user = User.objects.create(name='test') # 打印当前连接的数据库名称 print(connection.settings_dict['NAME'])
运行测试后,你会发现打印出来的数据库名和你真实的数据库名不一样,这就是最好的证明。
内容的提问来源于stack exchange,提问作者Jayden Foo
相关产品推荐
相关产品推荐

