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_Integration Testing - Fatal编程技术网

如何让Django测试用例和Selenium服务器使用相同的数据库?

如何让Django测试用例和Selenium服务器使用相同的数据库?,django,selenium,integration-testing,Django,Selenium,Integration Testing,我有一个Django(v1.4,使用Postgresql)项目,我已经为它编写了一系列工作单元测试。它们用于生成大部分数据 我现在开始使用Selenium编写一些集成测试。我刚刚意识到我的测试和实时测试服务器使用不同的数据库。这意味着工厂在我的测试中创建的数据对Selenium不可用 我不确定进步的最佳方式。我想我可以使用fixture来提供可以工作的数据,尽管这是一个痛苦,因为我已经用工厂代替了 有没有一种方法可以让我继续使用工厂来生成用于硒测试的数据?确实,我希望我的测试和LiveServe

我有一个Django(v1.4,使用Postgresql)项目,我已经为它编写了一系列工作单元测试。它们用于生成大部分数据

我现在开始使用Selenium编写一些集成测试。我刚刚意识到我的测试和实时测试服务器使用不同的数据库。这意味着工厂在我的测试中创建的数据对Selenium不可用

我不确定进步的最佳方式。我想我可以使用fixture来提供可以工作的数据,尽管这是一个痛苦,因为我已经用工厂代替了


有没有一种方法可以让我继续使用工厂来生成用于硒测试的数据?确实,我希望我的测试和LiveServerTestCase使用相同的数据库。

您是否尝试过使用sqlite作为测试的数据库后端

当使用内存中的SQLite数据库运行测试时,相同的 数据库连接将由两个并行线程共享: 运行实时服务器的线程和 测试用例正在运行


如果您没有使用常规ORM之外的任何东西,那么您也可能会从测试加速中受益。

我找到了发生这种情况的原因,以及一些可能的解决方法,包括上面Ilya Baryshev的答案

如果您的测试是从Django的
TestCase
派生的,并且您的数据库支持事务,那么每个测试都在其自己的事务中运行,并且外部的任何人(没有其他线程、外部进程或其他测试)都无法看到您的测试在数据库中创建的对象

LiveServerTestCase
使用线程,因此它会遇到这个问题。因此,设计者让它继承自
TransactionTestCase
,而不是
TestCase
,后者禁用这些事务,因此更改是全局可见的

发生在我身上的事情是,我在测试类中添加了一些mixin,其中一个拉入了
TestCase
。这不会导致错误,但它会将
LiveServerTestCase
的基类静默地替换为
TestCase
,从而再次启用事务,从而导致您描述的问题

Ilya的SQLite内存数据库解决方案之所以有效,是因为Django包含在使用SQLite
:memory:
数据库时进行检测的代码,该数据库实际上在线程之间共享相同的连接,因此您可以在
LiveServerThread
中看到测试的对象,因为它们在相同的事务中。但是,这需要注意以下几点:

防止两个线程通过此共享连接同时进行数据库查询非常重要,因为这有时可能会随机导致测试失败。因此您需要确保两个线程不会同时访问数据库。特别是,这意味着在某些情况下(例如,在单击链接或提交表单之后),您可能需要检查Selenium是否收到响应,并且在继续执行进一步的测试之前是否加载了下一页。为此,例如,让Selenium等待直到在响应中找到HTML标记(要求Selenium>2.13)

在我的例子中,一旦我们发现测试开始时,
autocommit
被关闭,并跟踪原因(因为我们输入了不该输入的
TestCase
代码),我们就能够修复继承层次结构,以避免拉入
TestCase
,然后,从live server线程和测试中都可以看到相同的数据库


这也适用于Postgres数据库,因此它将为velotron提供一个解决方案。

哦,好主意-下次我考虑做这些测试时,我会尝试一下,并将报告回来!我的应用程序需要Postgres,我希望我能使用SQLite解决方案。多痛苦啊。恼人的是,问题(TestCase的使用)发生得如此隐秘。感谢回到这里。很抱歉重新启动此功能,但是,我是否正确地理解了
TransactionTestCase
是禁用事务的基类?好像是另一条路?就是那条路
TransactionTestCase
用于使用事务的测试,因此不能在事务内部运行,因为您不能在SQL中嵌套事务,所以它禁用自己的事务。