我有一个Django(V1.4,使用PostgreSQL),我已经写了一堆的工作单元测试的项目。 这些使用FactoryBoy产生大部分的数据。
我现在开始写使用一些集成测试LiveServerTestCase硒。 我刚刚意识到,我的测试和现场测试服务器使用不同的数据库。 这意味着,通过工厂在我的测试中创建的数据不可用硒。
我不知道的进步的最好方式。 我想我可以用灯具供应,将工作数据,虽然这是走到这一步使用一个工厂,而不是痛苦。
有没有一种方法,我可以继续使用工厂产生,会为我的Selenium测试工作的数据? 真的,我想我的测试和LiveServerTestCase使用同一个数据库。
您是否尝试过使用SQLite作为测试您的后端数据库?
在其中现场服务器运行的线程,并且其中所述测试的情况下运行的线程:当使用一个内存SQLite数据库运行测试,相同的数据库连接将通过并联两个线程共享。
从Django文档
如果你不使用任何超出常规的ORM,你可以从测试的加速中受益。
我发现为什么这发生在我身上,还有一些可能的解决方法,包括伊利亚Baryshev的回答以上。
如果您的测试从Django的下降TestCase
,如果你的数据库支持事务,那么每个测试在自己的事务中运行,并且没有人以外(没有其他线程,外部进程,或其他测试)可以通过测试看到在数据库中创建的对象。
LiveServerTestCase
使用线程,所以会存在这个问题。 所以设计者们犯了它继承TransactionTestCase
而不是TestCase
,它禁用这些交易,这样的变化是全局可见。
发生了什么事我是,我加了一些混入到我的测试类,并在其中一人拔出TestCase
。 这不会导致错误,但它静静地取代基类的LiveServerTestCase
与TestCase
,而这又使得交易,引起你描述的问题。
伊利亚的SQLite使用的内存数据库的解决方法,因为工作的Django包含的代码如何使用SQLite时检测:memory:
实际上共享线程之间相同的连接数据库,所以你看在你测试的对象LiveServerThread
,因为它们是相同的事务中。 然而,这带有一些注意事项:
重要的是要防止并发数据库查询,通过由两个线程共享这一连接是很重要的,因为这可能也会随机导致测试失败。 所以,你需要确保两个线程不会同时访问数据库。 具体而言,这意味着,在某些情况下(例如,只需点击一个链接或提交表单后),您可能需要检查响应是由硒接收的下一个页面与进一步测试执行出发之前加载。 为此,例如,通过使硒等到HTML标签的响应发现(需要硒> 2.13)...
https://docs.djangoproject.com/en/1.4/topics/testing/#live-test-server
在我的情况下,一旦我们的标识符, autocommit
正在关闭时开始测试,并追查原因(因为我们已经进入了TestCase
,我们不应该做的代码),我们能够解决的继承层次结构,以避免拉扯TestCase
,然后在同一个数据库是从两个直播服务器线程和测试可见。
这也适用于Postgres的数据库,所以它会提供velotron的解决方案。