【问题标题】:How can I specify a different config file for testing in Play 2.1如何在 Play 2.1 中指定不同的配置文件进行测试
【发布时间】:2013-03-16 06:15:31
【问题描述】:

我想为多个测试环境(生产、登台、开发)定义不同的数据库连接。阅读帖子“How do I specify a config file with sbt 0.12.2 for sbt test?”后,似乎可以在早期版本的 Play 中使用以下 SBT 设置:

val main = play.Project(appName, appVersion, appDependencies).settings(
    javaOptions in Test += "-Dconfig.file=conf/test.conf"
)

但如果我在 Build.scala 中使用此设置,则会收到以下错误:

not found: value javaOptions

所以我的问题是,如何为不同的测试环境定义不同的连接?


编辑: 一种可能的解决方法是在测试期间覆盖默认设置。这可以通过环境变量来完成。

object Config {
  var defaultConfig = Map(
    "db.default.user" -> "user",
    "db.default.pass" -> "************"
  )

  def additionalConfiguration(): Map[String, _] = sys.env.getOrElse("PLAY_TEST_SCOPE", "") match {
    case "development" => {
      defaultConfig += "db.default.url" -> "jdbc:mysql://host:3306/development"
      defaultConfig
    }
    case "staging" => {
      defaultConfig += "db.default.url" -> "jdbc:mysql://host:3306/staging"
      defaultConfig
    }
    case "production" => {
      defaultConfig += "db.default.url" -> "jdbc:mysql://host:3306/production"
      defaultConfig
    }
    case _ => {
      throw new Exception("Environment variable `PLAY_TEST_SCOPE` isn't defined")
    }
  }
}

然后使用此配置运行一个假应用程序。

FakeApplication(additionalConfiguration = Config.additionalConfiguration())

【问题讨论】:

    标签: playframework-2.1


    【解决方案1】:

    javaOptions 包含在 Keys object 中。

    确保在 Build.scala 文件中使用正确的导入:

    import Keys._
    

    【讨论】:

      【解决方案2】:

      我们可以混合上述解决方案,将配置文件作为参数传递给 sbt。
      这将有助于将测试集成到 CI 管道中

      首先,在 Build.scala 文件中

      val testOptions = "-Dconfig.file=conf/" + Option(System.getProperty("test.config")).getOrElse("application") + ".conf"
      
      val main = PlayProject(appName, appVersion, appDependencies, mainLang = SCALA).settings(
          javaOptions in Test += testOptions
      )
      

      然后,在命令行中用 integ.conf

      运行测试
      sbt -Dtest.config=integ test
      

      使用默认的application.conf

      sbt test 
      

      【讨论】:

      • 谢谢,非常有帮助。我努力了几天才能使它与 CI 一起工作,您的评论对我帮助很大。
      【解决方案3】:

      Play 2.5.x 更新

      不再需要显式导入 import Keys._,配置资源位置的 vm 参数已更改。

      javaOptions in Test += "-Dconfig.resource=<conf_name>.conf"
      

      【讨论】:

        【解决方案4】:

        您可以使用替代配置文件从控制台运行您的应用程序,无论如何您需要使用带有完整路径的-Dconfig.file,因为存在一些问题......我无法通过其他选项实现。以 unix env 为例:

        play -Dconfig.file=/home/akkie/play/some-project/conf/local_akkie_dev.conf "~run 9123"
        

        当然,为了更容易启动,您可以创建 bash 脚本来调用此行。

        编辑:请注意,您不需要在每个附加配置文件中编写整个配置,因为您可以只包含您的主在开始时配置,然后只覆盖所需的属性:

        include "application.conf"
        
        key.to.override=blah
        

        看看official doc

        【讨论】:

        • 感谢您的快速答复。我知道这个选项,但这不适用于测试。
        • 开发模式和生产模式有什么相同的设置?在开发配置和产品配置中复制粘贴不是一个好主意。
        • whayyyy,可以包含吗?这很神奇。顺便问一下,你知道我如何在我想要的任何自定义模式下运行应用程序,例如“my_developer_mode”吗?
        • 好吧,如果我需要使用不同的配置文件运行“sbt”(不是播放)怎么办? sbt -Dconfig.file=conf/application.prod.conf 不起作用。
        猜你喜欢
        • 2015-04-27
        • 1970-01-01
        • 1970-01-01
        • 2014-06-22
        • 2020-09-02
        • 2021-05-18
        • 1970-01-01
        • 2013-11-09
        • 2013-07-13
        相关资源
        最近更新 更多