在 Django 中为 Selenium 测试加载夹具时出现完整性错误

Posted

技术标签:

【中文标题】在 Django 中为 Selenium 测试加载夹具时出现完整性错误【英文标题】:Integrity error when loading fixtures for Selenium testing in Django 【发布时间】:2015-02-14 10:24:21 【问题描述】:

我想为我的硒测试加载一个夹具。在我的初始测试中使用夹具是成功的,所以我知道我能够在我的测试设置中加载夹具并在我的测试中使用它们。我尝试了几种方法。 首先,我使用转储数据生成了特定于我正在测试的模型的固定装置。下面是一个例子:

python manage.py dumpdata protocols.Step --indent=2 > functional_tests/fixtures/step.json

在我的测试中这样使用时:

class SignInTest(FunctionalTest):
    fixtures = ['admin_user.json', 'protocol.json', 'step.json',
             'protocol_element.json']

    def test_login_and_view_user_data(self):
        ...

我得到错误:

django.db.utils.IntegrityError: Problem installing fixtures: The row in table 'protocols_protocolelement' with primary key '37' has an invalid foreign key: protocols_protocolelement.element_content_type_id contains a value '41' that does not have a corresponding value in django_content_type.id.

第二次尝试使用我表中的所有测试数据,但不包括内容类型:

python manage.py dumpdata --indent=2 -e contenttypes > functional_tests/fixtures/initial_data.json

class SignInTest(FunctionalTest):
    fixtures = ['initial_data.json']
    ...

得到错误:

django.db.utils.OperationalError: Problem installing fixture '.../mike/mike/functional_tests/fixtures/initial_data.json': Could not load auth.Permission(pk=103): no such table: auth_permission

接下来,我尝试使用 natural 来显示自然键:

python manage.py dumpdata --natural -e contenttypes -e auth.Permission --indent=2 > functional_tests/fixtures/initial_data2.json

只得到错误:

django.db.utils.OperationalError: Problem installing fixture '.../mike/mike/functional_tests/fixtures/initial_data.json': Could not load auth.User(pk=1): no such table: auth_user

注意到 natural 被贬值了,我尝试了 --natural-foreign 并希望包含用户和权限模型(无论如何我的模型都需要内容类型):

python manage.py dumpdata --natural-foreign --indent=2 > functional_tests/fixtures/initial_data3.json

只得到错误:

django.db.utils.IntegrityError: Problem installing fixture '.../mike/mike/functional_tests/fixtures/initial_data3.json': Could not load contenttypes.ContentType(pk=35): UNIQUE constraint failed: django_content_type.app_label, django_content_type.model

那么,关于如何加载夹具以便我可以运行我的测试有什么想法吗?我缺少一些简单的东西吗?谢谢!

【问题讨论】:

【参考方案1】:

所有围绕 dumpdata 的练习都没有给我带来任何结果。 但我发现了这个建议: https://***.com/a/3855764/12191031 出于某种原因,reset 在我的代码中不起作用,但在每次测试之前加载固定装置并在每次测试之后刷新数据库就足够了。 所以,我的解决方案是这样的:

from django.core import management
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
from selenium import webdriver

class login_page_test(StaticLiveServerTestCase):
    
@classmethod
    def setUpClass(cls):
        cls.selenium = webdriver.Firefox()
        cls.selenium.implicitly_wait(5)
        super(login_page_test, cls).setUpClass()

    @classmethod
    def tearDownClass(cls):
        cls.selenium.quit()
        super(login_page_test, cls).tearDownClass()

    def setUp(self):
        # for every test I load fixture
        management.call_command("loaddata", "user-data.yaml", verbosity=0)
        super(login_page_test, self).setUp()

    def tearDown(self):
        # after each test I flush all DB
        management.call_command("flush", verbosity=0, interactive=False)
        super(login_page_test, self).setUp()

我很高兴)))

【讨论】:

【参考方案2】:

在阅读了有关 Django 如何维护自己的模型等的更多信息后,我的理解是 Django 缓存了内容类型、auth.Permission 等并在测试框架中使用它们(我使用的是 StaticLiveServerTestCase)。这意味着当我加载我的夹具时,它与 Django 为自己使用而存储的数据发生冲突,从而导致完整性错误。这对我有用:

python manage.py dumpdata -e contenttypes -e admin -e auth.Permission --natural-foreign --indent=2 > functional_tests/fixtures/initial_data4.json

这篇文章有一些额外的有用信息可以帮助我解决问题: Problems with contenttypes when loading a fixture in Django.

【讨论】:

以上是关于在 Django 中为 Selenium 测试加载夹具时出现完整性错误的主要内容,如果未能解决你的问题,请参考以下文章

在 Play 框架中使用 @Before 进行 Selenium 测试

如何在 Django 中为用户模型加载 sql 夹具?

在 docker 中使用 selenium 运行 django 测试

我应该如何在 Django 中为表单编写测试?

在 Selenium 中为每个元素使用多个定位器的优缺点?

一python+django+selenium 搭建简易自动化测试平台