Django测试DB没有返回任何内容

时间:2016-07-14 15:49:35

标签: python django postgresql unit-testing

我收到与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

这使得我认为在第一次测试结束时一切都在保存,但不知何故,当第二次测试开始时,一切都被清除了。我宁愿避免在每次测试开始时重新运行所有内容,但是现在我不知道如何让测试数据库真正保留我的结果...

编辑/结果:因此,在从评论和答案中找到正确方向后,我找到了我想要的东西。 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,我得到了我想要的结果,我的数据库在每个测试用例之间保持不变。

1 个答案:

答案 0 :(得分:1)

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

如果您希望在测试之间进行通用设置,则应考虑覆盖TestCase方法setUp。这在每个测试功能之前运行。 unittest documentation对此有帮助,Django的文档也有example