默认情况下,当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
的实例。
答案 0 :(得分:44)
与往常一样,解决方案很简单:使用django.test.TestCase
而不是unittest.TestCase
。它适用于Django的所有主要版本!
答案 1 :(得分:1)
您可以使用tearDown
方法。它将在您的测试运行后调用。你可以删除那里的所有Blahs。
答案 2 :(得分: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中的测试方法很少。
您可以通过将测试方法分组到一个或多个TestCase中来选择适用于您的测试的模型。你有完全和完全的控制权。
答案 3 :(得分:0)
要清除非默认数据库,请在类中添加multi_db = True
例如
class MyTestCase(django.test.TestCase)
multi_db = True
def test_one(self):
self.assertTrue(True)
答案 4 :(得分:0)
使它们具有两个不同的功能均不是测试功能。最后从一个测试函数调用依赖函数。