2014-10-31 97 views
3
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会从一个测试增加到另一个?这对我来说并不明显。为什么在Django的测试中对象主键增加?

这样我就不能做基于ID的测试(因为它们取决于其他测试)。 这就是为什么我总想得到1的结果。

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

我在这里读到django object ids increment between unit tests问题是关系到数据库,而不是Django,但Django中有没有什么窍门可以改变它?

回答

2

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

+0

我不知道理解。我没有自己清理数据,Django在每次测试之间为我做了这些。数据实际上已被清除,问题仅与ID有关。 – 2014-10-31 00:32:01

+1

除非您使用固定装置(它会覆盖特定的ID),否则可能会删除这些值,但数据库仍可能使用连续的ID。 – monkut 2014-10-31 00:36:11

2

有测试文档中警告:

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

警告:如果您的测试依赖于数据库访问,如创建或 查询模式,一定要创建您的测试类的 子django.test.TestCase而不是unittest.TestCase。

使用避免unittest.TestCase生成运行在 交易的每项测试,刷新数据库的成本,但如果你的测试与 数据库交互他们的行为会根据该测试 亚军执行的顺序而定。这可能导致单元测试在隔离运行 时通过,但在套件中运行时失败。

您使用的是django.test.TestCaseunittest.TestCase

如果你需要保持PK integrety它似乎有一个选项,您可以尝试:

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这可能应该适合你。

+0

我使用django.test.LiveServerTestCase(我猜它django.test.TestCase继承) – 2014-10-31 00:29:57

-1

,这也可能为你工作

class MyClassTest(TestCase): 
    @classmethod 
    def setUpTestData(cls): 
     cls.x = Someclass() 
     cls.x.save() 

    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 1 !!! (good !) 
     # Here, self.x.pk -> returns 1 !!! (good !) 
相关问题