为什么在Django的测试中对象主键增加?
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中有没有什么窍门可以改变它?
您很可能会清除数据,包括数据库中的数据。这与重新创建数据库或重新创建序列不同。如果序列仍然存在,它们会在他们离开的地方继续。
有测试文档中警告:
https://docs.djangoproject.com/en/dev/topics/testing/overview/
警告:如果您的测试依赖于数据库访问,如创建或 查询模式,一定要创建您的测试类的 子django.test.TestCase而不是unittest.TestCase。
使用避免unittest.TestCase生成运行在 交易的每项测试,刷新数据库的成本,但如果你的测试与 数据库交互他们的行为会根据该测试 亚军执行的顺序而定。这可能导致单元测试在隔离运行 时通过,但在套件中运行时失败。
您使用的是django.test.TestCase
或unittest.TestCase
?
如果你需要保持PK integrety它似乎有一个选项,您可以尝试:
在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
这可能应该适合你。
我使用django.test.LiveServerTestCase(我猜它django.test.TestCase继承) – 2014-10-31 00:29:57
,这也可能为你工作
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 !)
我不知道理解。我没有自己清理数据,Django在每次测试之间为我做了这些。数据实际上已被清除,问题仅与ID有关。 – 2014-10-31 00:32:01
除非您使用固定装置(它会覆盖特定的ID),否则可能会删除这些值,但数据库仍可能使用连续的ID。 – monkut 2014-10-31 00:36:11