【发布时间】:2016-07-14 15:49:35
【问题描述】:
我遇到了与 when does the database is being destroy in django tests? 完全相同的问题,我的测试数据库似乎在每种方法之间被删除了。我知道每次重新运行 python3 manage.py test 时都会将其清除,但不应在测试过程中将其删除。
我正在运行 Python 3.4.3、Postgresql 9.5.3、Django 1.9
from django.test import TestCase
class myTestCases(TestCase):
def test_1_load_regions(self):
MyMethods._updateRegions()
self.assertEqual(True, len(Region.objects.all()) >= minRegionsExpected)
print("Regions: %s Languages: %s"%(len(Region.objects.all()), len(Language.objects.all())))
def test_2_load_languages(self):
# Generated by _updateRegions, just check that a few languages exist
print("Regions: %s Languages: %s"%(len(Region.objects.all()), len(Language.objects.all())))
self.assertEqual(True, len(Language.objects.all()) >= minLanguagesExpected)
我得到这样的输出:
Regions: 11 Languages: 19
.Regions: 0 Languages: 0
F
这让我觉得第一次测试结束时一切都在保存,但不知何故,当第二次测试开始时,一切都被清除了。我宁愿避免在每次测试开始时重新运行所有内容,但现在我很困惑如何让测试数据库真正保持我的结果......
编辑/结果:因此,在从 cmets 和答案中朝着正确的方向探索之后,我找到了我想要的东西。 https://docs.djangoproject.com/en/1.9/topics/testing/overview/
警告
如果您的测试依赖于数据库访问,例如创建或查询模型,请务必将您的测试类创建为 django.test.TestCase 的子类,而不是 unittest.TestCase.
使用 unittest.TestCase 避免了在事务中运行每个测试并刷新数据库的成本,但是如果您的测试与数据库交互,它们的行为将根据测试运行器执行的顺序而有所不同他们。这可能导致单元测试在单独运行时通过,但在套件中运行时失败。
我使用 test_1、test_2、test_3 作为我的名字来确保操作的顺序,所以这不是问题。通过从 django.test.TestCase 切换到 unittest.TestCase 我得到了我想要的结果,我的数据库在每个测试用例之间保持不变。
【问题讨论】:
-
呃,应该是的。这就是测试的工作方式。
-
是的,当您运行测试时,会创建一个新的空数据库。它不会从您的“主”数据库中携带数据。
-
@Justin 我知道它与我的主数据库不同,但它应该保留在 test_1 和 test_2 之间的测试数据库中,对吧?否则即使拥有一个数据库又有什么意义,更不用说在测试后不删除数据库的命令行选项了?
-
哦,对不起,我误解了你的问题。
-
@DanielRoseman 不,这不是假设测试的工作方式。否则 --keepdb 选项将不存在,因为它总是保存一个空数据库,这与创建一个全新的数据库相比没有任何好处。
标签: python django postgresql unit-testing