【问题标题】:Django tests with selenium not loading fixturesDjango 使用 selenium 测试不加载固定装置
【发布时间】:2016-04-01 07:56:08
【问题描述】:

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

我的accounts 测试未能加载users 夹具:

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。如果夹具被加载到测试数据库中,当测试通过 Selenium 运行时,这些数据应该可供测试使用。

我错过了什么?

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

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

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

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

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

【问题讨论】:

    标签: django selenium django-testing


    【解决方案1】:

    一旦我遇到了同样的问题,我注意到不知何故,Django 测试用例和 Selenium 不使用同一个数据库。为什么?我不知道!

    我认为是关于 tearDown 和 Setup ...无论如何,我认为您可以在这里解决您的问题 -> How to have Django test case and Selenium server use same database?

    【讨论】:

    • 这看起来可能有效(即使数据库本身在每次测试运行之间被破坏和创建,与内存数据库的连接也可能持续存在)。我会尝试一下,看看我的用例是否无法正常工作。
    【解决方案2】:

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

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-02
      • 1970-01-01
      • 2011-12-14
      相关资源
      最近更新 更多