You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 02:27:01