7
class MyClassTest(TestCase):
    def setUp(self):
        Someclass.objects.create()

    def test_first_test(self):
        # Here, Someclass.objects.all()[0].pk -> returns 1

    def test_second_test(self):
       # Here, Someclass.objects.all()[0].pk -> returns 2 !!! (bad !)

使用SetUp()方法,应该在每次测试之间清除和重新创建数据。那么,为什么 ids 从一个测试增加到另一个?这对我来说并不明显。

这样我就不能基于 id 进行测试(因为它们依赖于其他测试)。这就是为什么我想总是得到1结果。

请注意,我对数据本身没有任何问题,旧数据从一个测试到另一个测试都被很好地清除了。问题只是关于ID。

我在这里读到了单元测试之间的 django 对象 ids 增量,该问题与数据库有关,而不是与 Django 相关,但是 Django 中有什么技巧可以改变它吗?

4

2 回答 2

9

测试文档中有一个警告:

https://docs.djangoproject.com/en/dev/topics/testing/overview/

警告 如果您的测试依赖于数据库访问,例如创建或查询模型,请确保将您的测试类创建为 django.test.TestCase 的子类,而不是 unittest.TestCase。

使用 unittest.TestCase 避免了在事务中运行每个测试并刷新数据库的成本,但是如果您的测试与数据库交互,它们的行为将根据测试运行器执行它们的顺序而有所不同。这可能导致单元测试在单独运行时通过,但在套件中运行时失败。

你是用django.test.TestCase还是unittest.TestCase

如果您需要保持 PK 完整性,您可以尝试以下选项:

https://docs.djangoproject.com/en/dev/topics/testing/advanced/#django.test.TransactionTestCase.reset_sequences

TransactionTestCase 上的设置reset_sequences = True将确保序列始终在测试运行之前重置:

class TestsThatDependsOnPrimaryKeySequences(TransactionTestCase):
    reset_sequences = True

    def test_animal_pk(self):
        lion = Animal.objects.create(name="lion", sound="roar")
        # lion.pk is guaranteed to always be 1
        self.assertEqual(lion.pk, 1)

因为,django.test.LiveServerTestCase似乎是子类,TransactionTestCase这可能对你有用。

于 2014-10-31T00:24:55.193 回答
4

您很可能会清除数据,包括数据库中的数据。这与重新创建数据库或重新创建序列不同。如果序列仍然存在,它们将从中断的地方继续。

于 2014-10-31T00:25:48.577 回答