8

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

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

4

1 回答 1

11

你使用 TestCase 还是 TransactionTestCase 作为你的基类?有时这种行为与 Django 为支持 TransactionTestCase 而对 TestCase 进行的优化有关。这是区别:

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

类 TransactionTestCase

Django TestCase 类利用数据库事务工具(如果可用)来加快在每次测试开始时将数据库重置为已知状态的过程。然而,这样做的结果是事务提交和回滚的效果无法通过 Django TestCase 类进行测试。如果您的测试需要测试此类事务行为,则应使用 Django TransactionTestCase。

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

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

于 2012-06-14T20:36:59.057 回答