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

Django tests with selenium not loading fixtures

我正在使用 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 在定义测试数据库访问凭据的同一设置模块上。如果 fixtures 被加载到测试数据库中,那么当它们 运行 通过 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 为测试 运行ner 引入了 --keepdb 选项,它将在测试之间保持数据库实例。虽然此标志确实允许服务器在测试数据库上 运行,但我似乎仍然无法将装置加载到该数据库中。这可能是由于使用了新标志造成的,它确实显着修改了测试加载测试数据库的行为。

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

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

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

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

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

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

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

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

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

中保持清洁。

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