如何使用单独的配置文件在 CI 中使用 Play 和 sbt 进行测试?

How to use a separate configuration file for tests in CI, using Play and sbt?

对于一个基于 Play with sbt 的项目,我希望使用不同的配置文件为测试 运行 提供多种风格。动机是能够 运行 针对本地或远程数据库进行测试。

已经有一个为一般测试指定的自定义配置文件 运行s(在 build.sbt 中):

javaOptions in Test += "-Dconfig.file=conf/application.test.conf"    

现在我想要另一个命令,其中相同的测试 运行 针对某些配置文件 conf/application.test-ci.conf

到目前为止尝试过的方法

添加命令别名

addCommandAlias("test-ci", ";test -Dconfig.file=conf/application.test-ci.conf")

这失败并显示缺少分号的错误消息 (;),表明 sbt 将生成的命令行解释为多个命令,但我不明白为什么。

延长Test

lazy val CITest = config("ci") extend Test

lazy val config = (project in file(".")).enablePlugins(PlayScala)
.configs(CITest)
.settings(inConfig(CITest)(Defaults.testTasks): _*)
.settings(
  javaOptions in CITest += "-Dconfig.file=conf/application.test-ci.conf"
)

javaOptions in CITest -= "-Dconfig.file=conf/application.test.conf"

我不完全明白这是在做什么,但它似乎总是选择另一个测试配置文件。

如何指定多个测试设置以获取不同的配置文件?

首先尝试通过 set 命令应用设置,然后像这样 test 执行后续任务

addCommandAlias(
  "test-ci", 
  """;set Test/javaOptions ++= Seq("-Dconfig.file=conf/application.test.con"); test"""
)

注意 ; 如何将 settest 分开。

另一种方法是根据环境修改设置。通常在 CI 上设置了一些环境变量,如 CIBUILD,因此您可以有条件地修改 javaOptions(无需任何自定义配置):

Test/javaOptions ++= {
  if (sys.env.get("CI").isEmpty) Seq.empty
  else Seq("-Dconfig.file=conf/application.test-ci.conf")
} 

注意:Test/javaOptionsjavaOptions in Test 的新语法(自 sbt 1 起)