Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django测试,使用selenium未加载夹具_Django_Selenium_Django Testing - Fatal编程技术网

Django测试,使用selenium未加载夹具

Django测试,使用selenium未加载夹具,django,selenium,django-testing,Django,Selenium,Django Testing,我正在使用Selenium为Django网站设置功能测试。我有一个fixture文件(users/fixture/users.json),正在另一个应用程序(accounts)的功能测试中使用它。在运行测试时,我还运行我的开发服务器来接受来自Selenium browser automation的请求;我在同一个设置模块上运行/manage.py test和/manage.py runserver,以便两者都具有相同数据库的凭据 我的帐户测试无法加载用户夹具: from django.test

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

我的
帐户
测试无法加载
用户
夹具:

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\uu
测试数据库名称,因此必须确保测试服务器和Django测试按名称使用相同的数据库,如下所示:

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

第二个问题:解释Django在测试运行之间销毁测试数据库。这将导致开发服务器失败,因为它需要数据库。Django 1.8为测试运行程序引入了
--keepdb
选项,该选项将在测试之间保留数据库实例。虽然这个标志允许服务器在测试数据库上运行,但我似乎仍然无法将fixture加载到该数据库中。这可能是由于使用了新标志造成的,该标志确实显著地修改了测试的行为,即它们如何加载测试数据库。

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


我想是关于拆卸和安装的。。。无论如何,我认为你可以在这里解决你的问题->

用硒测试Django可能会很敏感。总而言之,要让这样的测试正常工作,您必须处理三个主要问题:

1) Selenium需要一个正在运行的Django服务器来从服务器上跳出请求

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

3) TestCase测试在事务中运行。由于运行的Django服务器无法查看测试用例的事务,因此Selenium将完全看不到/无法访问您加载的任何装置(源代码:)

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

要解决第三个问题,请使用
TransactionTestCase
而不是
TestCase
TransactionTestCase
旨在让开发人员在测试过程中更好地控制事务行为,因此它不会自动运行事务内部的所有内容(这反过来会让正在运行的服务器实例访问fixture)。尽管这并不完全是我们在本例中所要做的,但结果是测试会自动工作并进行清理

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


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

这看起来可能会起作用(即使数据库本身在每次测试运行之间被破坏和创建,到内存中数据库的连接也可能会保持)。我会尝试一下,看看是否我不能让我的用例工作。