在每次测试方法之前清理Django中的数据库

2024-09-27 20:17:31 发布

您现在位置:Python中文网/ 问答频道 /正文

默认情况下,当Django在sqlite后端运行时,它会为测试创建一个新的内存数据库。这意味着对于从unittest.TestCase派生的每个类,我都会得到一个新的数据库。是否可以对其进行更改,以便在运行每个测试方法之前将其清除?

示例:我正在测试一个管理器类,该类在Django持久对象之上提供额外的抽象。代码看起来更不像那样

class TestForManager(unittest.TestCase):
  def testAddingBlah(self):
    manager = Manager()
    self.assertEquals(manager.getBlahs(), 0)
    manager.addBlah(...)
    self.assertEquals(manager.getBlahs(), 1)

  def testAddingBlahInDifferentWay(self):
    manager = Manager()
    self.assertEquals(manager.getBlahs(), 0)
    manager.addBlahInDifferentWay(...)
    self.assertEquals(manager.getBlahs(), 1)

现在,第二个测试的第一个断言失败了,因为数据库的状态在测试调用之间保持不变,并且数据库中已经有一个Blah实例。


Tags: django内存self数据库示例管理器sqlitedef
3条回答

和往常一样,解决方法很简单:使用django.test.TestCase而不是unittest.TestCase。它适用于Django的所有主要版本!

您可以使用tearDown方法。测试运行后将调用它。你可以删除那里所有的废话。

为什么不这样做呢?这可以在不显著更改代码的情况下实现所需的功能。

class TestOneForManager(unittest.TestCase):
  def testAddingBlah(self):
    manager = Manager()
    self.assertEquals(manager.getBlahs(), 0)
    manager.addBlah(...)
    self.assertEquals(manager.getBlahs(), 1)

class TestTwoForManager(unittest.TestCase):
  def testAddingBlahInDifferentWay(self):
    manager = Manager()
    self.assertEquals(manager.getBlahs(), 0)
    manager.addBlahInDifferentWay(...)
    self.assertEquals(manager.getBlahs(), 1)

编辑。“reset on TestCase”特性为您提供了完全的控制。

  • 当测试用例不相互干扰时,单个测试用例中的许多测试方法都是好的。

  • 当测试用例相互干扰时,单个测试用例中很少有测试方法是好的。

通过将测试方法分组到一个或多个测试用例中,可以选择应用于测试的模型。你完全可以控制。

相关问题 更多 >

    热门问题