【发布时间】:2020-09-04 13:22:35
【问题描述】:
最近我将使用 Python 2.7 和 Django 1.11 制作的 django 应用程序更新为 Python 3 和 Django 3.1。
我有几个使用 django.test.TestCase 的测试用例。其中一些测试是假设数据库将在测试执行之间完全重置,除其他外,预计模型的最后一个 id 也会被重置,例如,如果我在测试中创建一个对象并且将其保存到数据库中,对象将始终从 1 开始接收相同的 id。
这在 Django 1.11 上的行为与此完全相同,我能够使用 --keepdb 标志来避免每次都重新创建数据库。
但是,在我升级到 Python 3 和 Django 3.1 之后,我注意到情况不再如此。我注意到在测试执行后所有对象都从数据库中删除,但是在下一次测试执行中,新对象是从上次使用的 pk 开始使用 pk 创建的,所以我不能再指望创建的对象将具有可预测的PK。这会导致一个非常烦人的行为,如果我在重新创建数据库后运行测试,测试将通过,但如果我再次运行测试,保持数据库,它将不会通过,因为 pks 会有所不同。
如果我在运行测试时删除 --keepdb 标志,则 pk 会全部重置,但这会使测试执行速度变慢,因为我的数据库结构需要几分钟才能创建。
是否有一个选项可以在每次测试执行时重置 pks?在 1.11 之后的版本中,Django 上的这种行为实际上是否发生了变化?
【问题讨论】: