2015-12-27 52 views
2

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

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的测试automatically prefixtest_数据库名称,所以你必须确保你的测试服务器和你的Django测试由名称使用相同的数据库,就像这样:

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

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

回答

1

Django的使用Selenium测试可以是敏感的。回顾一下,你需要处理三个主要问题才能使这样的测试起作用:

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

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

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

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

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

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

感谢劳拉指出我在这个正确的方向。

1

一旦我遇到同样的问题,我发现Django Test Case和Selenium不会使用同一个数据库。为什么?我没有任何线索!

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

+0

看起来好像它可能工作(即使数据库本身在每次测试运行之间被破坏并创建,与内存数据库的连接仍可能持续存在)。我会试试看看我是否无法使用我的用例。 – Adam