Django测试,使用selenium未加载夹具
我正在使用Selenium为Django网站设置功能测试。我有一个fixture文件(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
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为我指明了正确的方向。这看起来可能会起作用(即使数据库本身在每次测试运行之间被破坏和创建,到内存中数据库的连接也可能会保持)。我会尝试一下,看看是否我不能让我的用例工作。