运行Django TestCase时setUp创建的对象不存在,setUp是内置方法吗?
Django测试用例相关问题解答
1. 测试创建的对象无法在admin中找到的原因
- Django 运行测试时会自动创建独立的临时测试数据库,和你日常开发使用的数据库完全隔离,admin默认连接的是开发库,自然看不到测试过程产生的数据。
- 你使用的
TestCase类默认开启了事务包裹:每个测试方法运行前会开启事务,运行结束后直接回滚事务,所有测试过程中产生的数据不会持久化写入磁盘。 - 测试运行完成后,临时测试数据库会被自动销毁,因此你也找不到对应的测试库表,这是正常的测试隔离机制,不是故障。
如果确实需要保留测试数据调试,可以继承django.test.TransactionTestCase并设置serialized_rollback = False,或者运行测试时添加--keepdb参数保留测试库结构,但常规测试场景下不需要修改默认逻辑。
2. setUp方法相关问题
setUp不是Python内置函数,是Python标准库unittest框架约定的钩子方法,Django的TestCase继承自unittest.TestCase,遵循相同的规则:每一个测试方法执行前,测试框架都会自动调用一次setUp方法,不需要你手动调用。- 你可以使用自定义函数名封装测试对象创建逻辑,但框架不会自动调用自定义函数,你需要在每个测试方法中手动调用该函数才能生成测试数据,否则测试会因为缺少前置数据失败。示例如下:
class TestContact(TestCase): # 自定义的测试数据初始化函数 def create_test_contact(self): return Contact.objects.create( full_name = "John Van", email = "jon@gmail.com", phone = 9845666777, subject = "My query", message = "test message" ) def test_contact_count(self): # 必须手动调用自定义函数才会生成测试数据 self.create_test_contact() self.assertEqual(Contact.objects.count(),1)
内容的提问来源于stack exchange,提问作者Reactoo
相关产品推荐
相关产品推荐

