django - 如何为 LiveServerTestCase 加载夹具
问题描述
我正在尝试使用 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,但我猜代码是一样的。
解决方案
事实证明,我毕竟是正确加载固定装置的方式。问题出在我的灯具本身,使用硬编码的主(和外)键。在我的情况下,在加载夹具之前创建了两个用户,因此当夹具尝试使用相同的主键加载时,发生了 UNIQUE 约束冲突。解决方案是按照此 SO answer--natural-primary
中的建议使用and--natural-foreign
标志重新生成我的固定装置。
推荐阅读
- c++ - 如何为其他进程释放 STD 结构使用的一些堆空间?
- python - 最大化相邻作物的功能;花园优化问题
- javascript - 模块设计模式封装
- r - 如何使用伯恩斯坦多项式将平滑曲线拟合到 R 中的数据?
- redhat - 无法从 Red Hat 运行队列示例
- java - Java 从搜索词中获取第一个 YouTube 结果
- postgresql - 如何解释和访问 tsvector?
- laravel - 部署 laravel 应用时目录中的限制。lang 目录的 open_basedir 限制
- foreach - 如何计算 CMake 文件中的功率指数
- amazon-web-services - 我可以在 Sagemaker 笔记本上运行 TensorFlow 2.0 吗?