2013-04-08 52 views
5

使用播放框架2.1开发/生产和H2,我试图找到有两个不同的数据库配置的最佳方式:使用MySQL在测试

  • 之一来运行我的应用程序基于MySQL的
  • 一个基于H2

来测试我的应用程序,同时它是很容易做到的一个或另一个,我碰到以下问题,当我尝试做两个:

  1. 我不能有相同的数据库演变,因为有一些mysql特定的命令,即使在mysql模式下也不能与H2一起工作:这意味着两套进化和两个独立的数据库名称
  2. 我不确定如何覆盖主要的application.conf文件由另一个保留在测试模式下测试。我所尝试的(从命令行传递文件名或覆盖键)似乎被保留为prod模式。

我的问题:任何人都可以推荐一个很好的方法来做到这一点(MySQL所有的时间,只有H2在测试中),而不会过度复杂运行应用程序?谷歌没有帮助我。

感谢您的帮助。

+0

P.S.刚刚发现:http://play.lighthouseapp.com/projects/82401/tickets/981-overriding-configuration-for-tests状态'wontfix' – biesior 2013-04-15 14:05:49

+0

谢谢。这解释了它。 – 2013-04-15 18:23:39

回答

2

使用不同的数据库引擎可能是最差的情况,因为你自己写:在一些功能上的差异,保留字等原因,你需要有时写得很具体选定数据库引擎的自定义报表。使用相同的引擎更好地使用两个独立的数据库

不幸的是,我不知道该配置首要问题,因此,如果用于覆盖CONFIGS默认方式失败......在application.conf覆盖ID - 这样你就可以发表评论整块快...)

+0

+1代表“*最糟糕的情况*” – 2013-04-08 21:44:07

+2

这大概是H2的MySQL兼容模式。 – 2013-06-24 09:45:57

+0

ORM可能会否定DB引擎的差异,在一定程度上 – 2015-06-17 22:41:39

1

下面是如何内存数据库用于测试:

public class ApplicationTest extends WithApplication { 
    @Before 
    public void setup() { 
     start(fakeApplication(inMemoryDatabase("default-test"), fakeGlobal())); 
    } 

    /// skipped .... 
} 

内存数据库()将默认使用H2的驱动程序。 你可以在source code

5

找到更多的细节你可能会发现有用的一些技巧。

首先,MySQL的/*! */符号允许你添加代码的MySQL会服从,但其他数据块会忽略,例如:

create table Users (
    id bigint not null auto_increment, 
    name varchar(40) 
) /*! engine=InnoDB */ 

这不是灵丹妙药,但它会让你纸了一些MySQL和H2的语法之间的区别。这是一个MySQL-ism,所以它不会帮助其他数据库,但是由于大多数其他数据库不像MySQL那样古怪,您可能不需要它 - 我们将数据库从MySQL迁移到PostgreSQL,而不是支持/*! */表示法,但PostgreSQL与H2相似,我们不需要它。

如果你想为dev和prod使用不同的配置,你可能最好有prod的额外配置。原因是你可能会用play run启动你的d​​ev服务器,并用play stage; target/start启动你的prod服务器。 target/start可以采用-Dconfig.resource参数。例如,创建一个额外的配置文件prod.conf的督促,看起来像:

include "application.conf" 

# Extra config for prod - this will override the dev values in application.conf 
db.default.driver=... 
db.default.url=... 
... 

,并创建一个start_prod脚本,看起来像:

#!/bin/sh 

# Optional - you might want to do this as part of the build/deploy process instead 
#play stage 
target/start -Dconfig.resource=prod.conf 

从理论上讲,你可以轮做它的其他方式,并有application.conf包含prod conf,并创建一个dev.conf文件,但是您可能需要一个脚本来启动prod(您可能最终需要额外的JVM /内存/ GC参数,或将其添加到rc.d , 管他呢)。

+0

非常有帮助,谢谢 – LiorH 2013-06-05 16:23:22