如何为LiveServerTestCase加载灯具

时间:2019-08-13 14:44:43

标签: django selenium unit-testing selenium-webdriver functional-testing

我正在尝试使用Selenium在Django中编写测试用例。我想使用现有的固定装置,因此我的测试数据库(SQLite3)具有每个测试的测试数据。

我有一些模型测试用例(仅使用TestCase类)如下;

from django.test import TestCase
from django.test import LiveServerTestCases
from missions.models import Mission, MissionDataRecord


class MissionModelTests(TestCase):
    fixtures = ['myproject_common/fixtures/auth_initial_load.json', 'worklog/fixtures/worklogs_initial_load',
                'missions_initial_load.json']

    def test_object_name_is_mission_title(self):
        mission = Mission.objects.get(id=1)
        self.assertEqual(mission.title, str(mission))

    def test_object_name_is_mission_title_again(self):
        mission = Mission.objects.get(id=1)
        self.assertEqual(mission.title, str(mission))

以这种方式运行时,它可以按预期工作(我获得了两次测试通过)。但是,对于Selenium测试,我需要使用LiveServerTestCase而不是TestCase。

上面的简单示例是模型测试,但是出于说明性目的,我遇到了Selenium,如果我将“ TestCase”简单地替换为“ LiveServerTestCase”,则第一个测试通过,但是第二个测试失败,错误

  

django.db.utils.IntegrityError:安装固定装置时出现问题   '[...] / fixtures / auth_initial_load.json':无法加载   auth.User(pk = 1):唯一约束失败:auth_user.username

此错误发生在/django/test/testcases.py的_fixture_setup中。这似乎表明我的装置(特别是auth_initial_load装置)正在尝试再次从现有数据的顶部开始加载。但是,不应从Django文档中进行读取,因为每个测试都应该在自己的事务中运行(我相信这意味着为每个事务加载了固定装置)。

这是怎么回事,更重要的是,如何将LiveServerTestCase与现有的固定装置一起使用(类似于我目前使用TestCase的方式)?实际上,我需要使用StaticLiveServerTestCase,但是我想代码会是相同的。

1 个答案:

答案 0 :(得分:0)

事实证明,我毕竟是正确加载灯具的方式。问题出在我的灯具本身上,使用了硬编码的主(和外)键。在我的情况下,在加载夹具之前创建了两个用户,因此当夹具尝试使用相同的主键加载时,发生了UNIQUE约束冲突。解决方案是使用this SO answer中建议的--natural-primary--natural-foreign标志重新生成我的灯具。