gpt4 book ai didi

使用 Selenium 的 Django 测试未加载固定装置

转载 作者:行者123 更新时间:2023-12-01 13:47:49 25 4
gpt4 key购买 nike

我正在使用 Selenium 为 Django 网站设置功能测试。我有一个夹具文件 (users/fixtures/users.json) 并在另一个应用程序 (accounts) 的功能测试中使用它。在运行测试时,我还运行我的开发服务器来接受来自 Selenium 浏览器自动化的请求;我在同一个设置模块上运行 ./manage.py test./manage.py runserver 以便两者都具有同一个数据库的凭据。

我的 accounts 测试无法加载 users fixture:

from django.test import TestCase


class AccountCreationTestCase(TestCase):
fixtures = ['users']

# Tests depending on user login follow.
# These tests are run via Selenium for browser automation.

当我通过命令行手动将夹具加载到测试数据库中时,这些测试会成功,否则它们会失败,所以我知道它们正在使用数据库中存在的夹具数据,而且我也知道他们未能加载测试夹具。

回顾一下:我在定义测试数据库访问凭据的同一设置模块上运行 ./manage.py test./manage.py runserver。如果 fixture 被加载到测试数据库中,则当测试通过 Selenium 运行时,该数据应该可供测试使用。

我错过了什么?

编辑 1:对于上下文,我使用的是 Django 1.8。此外,我正在使用 Selenium 来自动化 PhantomJS,以便测试可以更快地运行。

编辑 2:我刚刚更彻底地阅读了 Django 文档,发现了我遇到的两个问题。

第一期:Django 测试 automatically prefix test_ 的数据库名称,因此您必须确保您的测试服务器和 Django 测试使用相同的名称数据库,如下所示:

DATABASES = {
'NAME': "test_db_name",
'TEST': {
'NAME': "test_db_name"
}
}

第二期:Django docs解释 Django 在测试运行之间破坏测试数据库。这将导致开发服务器失败,因为它需要存在数据库。 Django 1.8 为测试运行器引入了 --keepdb 选项,它将在测试之间保持数据库实例。虽然此标志确实允许服务器在测试数据库上运行,但我似乎仍然无法将装置加载到该数据库中。这可能是由于使用了新标志造成的,它确实在加载测试数据库的方式方面显着修改了测试行为。

最佳答案

使用 Selenium 进行 Django 测试可能很棘手。回顾一下,要使这样的测试正常工作,您必须处理三个主要问题:

1) Selenium 需要一个正在运行的 Django 服务器来反弹请求。

2) 您正在运行的 Django 服务器应该连接到测试数据库。

3) TestCase 测试在事务中运行。由于正在运行的 Django 服务器无法查看测试用例的事务,因此您加载的任何固定装置对于 Selenium 来说都是完全不可见/不可访问的(来源:Lara's link, qris's answer)。

解决方法:要解决前两个问题,您需要一个特定于测试的设置文件。在其中,您需要定义一个指向您的测试数据库的默认数据库,并且您需要提供测试数据库的设置以便名称匹配(参见我的问题中的示例)。当您计划运行测试时,您需要使用测试设置文件运行 Django 开发服务器和测试。

要解决第三个问题,请使用TransactionTestCase 而不是TestCaseTransactionTestCase 旨在让开发人员在测试期间更好地控制事务行为,因此它不会自动运行事务内的所有内容(这反过来又使正在运行的服务器实例可以访问固定装置)。尽管这并不是我们在这种情况下尝试做的事情,但结果是测试会自动运行并自动清理。

注意:您可能应该考虑将黑盒和白盒测试彼此分开。这使您的 Django 测试保持“普通”,因此 future 的开发人员不必浪费太多时间来弄清楚为什么 Django 文档似乎并不适用于所有情况。它还将功能测试与单元测试分离,这在您团队中的开发人员无法在他们的机器上访问 Selenium(或 Selenium 的兼容版本)或者您只想运行单元测试的情况下非常有用或功能测试,但不能同时进行。您需要手动设置测试环境以满足您的需求,但我相信从长远来看,这将使测试代码保持清洁。

感谢 Lara 为我指明了正确的方向。

关于使用 Selenium 的 Django 测试未加载固定装置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34477051/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com