4

我的 Play 应用程序使用 postgres。它包括一些特定于 postgres 的演变,这些演变阻止我使用内存中的 h2 数据库进行测试。例如,以下演变在 Postgres 中很好,但在 h2 中失败(即使使用MODE=PostgreSQL):

alter table ac_host rename column base_url to baseurl;

h2 等价物是:

alter table ac_host alter column base_url rename to baseurl;

我想在我的一些测试中使用 h2,但由于 h2 不兼容的演变,尝试这样做在应用程序初始化时失败。有没有办法解决这个问题,例如根据数据库类型指定替代演变?

4

2 回答 2

3

测试纯粹主义者和蛋糕模式爱好者可能不会喜欢这个答案,但我们遇到了与您相同的问题,并且正在执行以下操作:

我们使用default数据库来运行应用程序(在生产系统上进行测试),但对于自动化测试(使用play test),我们使用单独的test数据库配置,它有自己的演变,并在 H2 而不是 PostgreSQL 上运行。

在 Play 中,您可以检查您当前是否正在运行测试模式并可以相应地切换数据库:

lazy val default = Database.forDataSource {
    val defaultSource = current.configuration.getString("db.test.url").fold("default")(_ => "test")
    new play.api.db.DB.getDataSource(defaultSource)
}

对自动化测试进行单独演进还有其他优点:您可以使用一些与其他测试系统不同的基本测试数据填充数据库。

希望有帮助。

于 2014-02-27T15:03:14.330 回答
1

很快:唯一适合您的解决方案是 iegit和几个分支。

顺便说一句,尽管 Play 支持许多数据库引擎,但并不认为相同的产品能够以如此灵活的方式投入使用。您正在向我们展示自己的原因 - 数据库差异很大,并且编写适用于不同数据库的演变通常会失败(许多引擎甚至没有像compatibility mode.

在现实生活中可以这样描述:奔驰生产汽油发动机的汽车,也生产柴油,我买了最后一个选项,但想用汽油

根据我们(一般 webdevs)的经验,我们发现在不同引擎甚至同一引擎的不同版本上工作可能会带来意想不到的错误,因此经验法则是项目中的所有开发人员都使用与生产环境相同的版本。这样可行。

于 2014-02-23T11:55:05.570 回答