Django测试硒没有加载灯具

时间:2015-12-27 02:16:55

标签: django selenium django-testing

我正在使用Selenium为Django网站设置功能测试。我有一个fixture文件(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选项,它将在测试之间保持数据库实例。虽然这个标志确实允许服务器在测试数据库上运行,但我仍然无法将夹具加载到该数据库中。这可能是由于使用了新标志引起的,新标志在加载测试数据库方面显着改变了测试行为。

2 个答案:

答案 0 :(得分:1)

一旦我遇到同样的问题,我注意到,不知何故,Django Test Case和Selenium都没有使用相同的数据库。为什么?我不知道了!

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

答案 1 :(得分:1)

使用Selenium进行Django测试可能会非常棘手。回顾一下,要让这样的测试起作用,你需要处理三个主要问题:

1)Selenium需要一个正在运行的Django服务器才能退出请求。

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

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

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

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

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

感谢Lara指出我正确的方向。