Django单元测试数据库没有被拆除?

时间:2012-06-14 20:03:51

标签: python django unit-testing

我已经编写了一些单元测试来测试我的Django应用程序。特别是一个测试套件在其setUp()函数中有很多代码。所述代码的目的是为数据库创建测试数据。 (是的,我知道固定装置,并选择在这种情况下不使用它们)。当我运行单元测试套件时,第一个运行的测试通过,但随后套件中的其余测试失败。所有失败的消息都是相同的:它提到错误的位置是“self.database_object.save()”,原因是“IntegrityError:列名不唯一”。所以,我最好的猜测是Django在每次测试后都没有正确拆除数据库。

今天早些时候它正在运行,但我想有些重构让我搞砸了。关于为什么Django在每次测试后没有正确拆除数据库的任何想法?

1 个答案:

答案 0 :(得分:9)

您是否为基类使用TestCase或TransactionTestCase?有时这种行为与Django为TestCase进行的优化有关,而有利于TransactionTestCase。区别在于:

https://docs.djangoproject.com/en/dev/topics/testing/?from=olddocs#django.test.TransactionTestCase

  

class TransactionTestCase

     

Django TestCase类使用数据库   交易设施,如果有的话,加快过程   在每次测试开始时将数据库重置为已知状态。   然而,其结果是交易的影响   Django TestCase类无法测试提交和回滚。如果   你的测试需要测试这种交易行为   使用Django TransactionTestCase。

     

除了方式之外,TransactionTestCase和TestCase是相同的   其中数据库重置为已知状态和能力   测试代码以测试提交和回滚的效果。一个   TransactionTestCase在测试运行之前重置数据库   截断所有表并重新加载初始数据。一个   TransactionTestCase可以调用commit和rollback并观察   这些调用对数据库的影响。

     

另一方面,TestCase不会截断表并重新加载   测试开始时的初始数据。相反,它包含了测试   在数据库事务结束时回滚的数据库事务中的代码   测试即可。它还可以防止被测代码发出任何提交或   对数据库进行回滚操作,确保回滚到   测试结束将数据库恢复到其初始状态。在   为了保证所有TestCase代码都以干净的方式启动   数据库,Django测试运行器首先运行所有TestCase测试   任何其他可能在没有的情况下改变数据库的测试(例如doctests)   将其恢复到原始状态。