如何为 LiveServerTestCase 加载夹具

Posted

技术标签:

【中文标题】如何为 LiveServerTestCase 加载夹具【英文标题】:How to load fixtures for a LiveServerTestCase 【发布时间】:2019-12-20 03:43:07 【问题描述】:

我正在尝试使用 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】:

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

【讨论】:

以上是关于如何为 LiveServerTestCase 加载夹具的主要内容,如果未能解决你的问题,请参考以下文章

如何为 iPad 加载不同的笔尖?

如何为单个雄辩的对象急切加载关系?

如何为 Flash 视频加载字幕文本?

NextJS:如何为生产构建添加屏幕加载?

如何为 .NET 应用程序域重新加载程序集?

如何为所有 IPAD 设备加载特定的字体