【问题标题】:Django test DB returning nothingDjango 测试数据库不返回任何内容
【发布时间】: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


【解决方案1】:

其实根据Django tutorial,每次测试之间数据库都会回滚。 (请参阅链接部分的底部。)

如果您希望在测试之间有一个共同的设置,您应该考虑覆盖TestCase 方法setUp。这是在每个测试功能之前运行的。 unittest documentation 应该对此有所帮助,并且 Django 在其文档中也有一个 example

【讨论】:

  • 知道为什么他们会有一个 arg --keepdb 吗?如果数据库在每次测试之间都被销毁,这似乎毫无用处,你会留下一个几乎是空的数据库。
  • @Dr.Cyanide 即使在测试开始之前,数据库也不是完全空的。在运行第一个测试以在数据库中设置表之前,必须应用所有迁移。所以看起来--keepdb 的好处是它意味着你不必每次都重新运行迁移。但我绝对不是这方面的专家,所以也许其他人知道的更多。
猜你喜欢
  • 2016-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-11
  • 1970-01-01
  • 2020-08-19
  • 2021-10-08
  • 1970-01-01
相关资源
最近更新 更多