23

默认情况下,当 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

4

5 回答 5

59

django.test.TestCase不使用unittest.TestCase。它适用于所有主要版本的 Django!

于 2009-01-12T19:59:19.337 回答
1

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

于 2010-12-14T11:11:26.347 回答
1

使它们在两个不同的功能中都不是测试功能。最后从一个测试函数调用依赖函数。

于 2019-02-21T14:25:49.553 回答
0

为什么不执行以下操作?这可以完成您所需要的,而无需对您的代码进行重大更改。

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)

编辑. “在 TestCase 上重置”功能可让您完全控制。

  • 当您拥有互不干扰的测试用例时,单个 TestCase 中的许多测试方法都很好。

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

您可以通过将测试方法分组到一个或多个 TestCases 中来选择适用于您的测试的模型。您拥有完全的控制权。

于 2009-01-12T10:54:59.687 回答
0

要清除非默认数据库,multi_db = True请在类中添加

例如

class MyTestCase(django.test.TestCase)
    multi_db = True

    def test_one(self):
        self.assertTrue(True)
于 2019-01-07T07:04:13.457 回答