我已经编写了一些单元测试来测试我的Django应用程序。特别是一个测试套件在其setUp()
函数中有很多代码。所述代码的目的是为数据库创建测试数据。 (是的,我知道固定装置,并选择在这种情况下不使用它们)。当我运行单元测试套件时,第一个运行的测试通过,但随后套件中的其余测试失败。所有失败的消息都是相同的:它提到错误的位置是“self.database_object.save()”,原因是“IntegrityError:列名不唯一”。所以,我最好的猜测是Django在每次测试后都没有正确拆除数据库。
今天早些时候它正在运行,但我想有些重构让我搞砸了。关于为什么Django在每次测试后没有正确拆除数据库的任何想法?
答案 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) 将其恢复到原始状态。