Play框架中的集成测试

时间:2013-05-01 12:56:19

标签: scala testing playframework integration sbt

我正在尝试让集成测试在Play Framework 2.1.1中运行

我的目标是能够在单元测试后运行集成测试,以测试底层数据库的组件级功能。底层数据库将具有存储过程,因此我必须做的不仅仅是您可以在伪造应用程序中配置的“inMemoryDatabase”。

我希望这个过程是:

  1. 使用FakeApplication启动TestServer。使用备用集成测试配置文件
  2. 运行集成测试(可以按包过滤或不在此过滤)
  3. 停止TestServer
  4. 我认为最好的方法是在Build.scala文件中。

    我需要有关如何设置Build.scala文件的帮助,以及如何加载替代集成测试配置文件(项目/ it.conf现在)

    非常感谢任何帮助!

2 个答案:

答案 0 :(得分:5)

我已经介绍了一种暂时适用的方法。我想看看Play在sbt中引入了单独的“Test”与“IntegrationTest”范围的概念。

我可以进入Play,看看他们如何在sbt中构建他们的项目和设置,并尝试让IntegrationTest范围工作。现在,我花了太多时间试图让它运作起来。

我所做的是创建一个Specs Around Scope类,使我能够强制执行TestServer的单例实例。任何使用该类的东西都会尝试启动测试服务器,如果它已经运行,它将不会重新启动。

似乎Play和SBT在确保服务器在测试结束时关闭时做得很好,到目前为止一直有效。

以下是示例代码。仍希望得到更多反馈。

class WithTestServer(val app: FakeApplication = FakeApplication(),
        val port: Int = Helpers.testServerPort) extends Around with Scope {
      implicit def implicitApp = app
      implicit def implicitPort: Port = port

      synchronized {
        if ( !WithTestServer.isRunning ) {
          WithTestServer.start(app, port)
        }
      }

      // Implements around an example
      override def around[T: AsResult](t: => T): org.specs2.execute.Result = {
        println("Running test with test server===================")
        AsResult(t)
      }
    }

    object WithTestServer {

      var singletonTestServer: TestServer = null

      var isRunning = false

      def start(app: FakeApplication = FakeApplication(), port: Int = Helpers.testServerPort) = {
          implicit def implicitApp = app
          implicit def implicitPort: Port = port
          singletonTestServer = TestServer(port, app)
          singletonTestServer.start()
          isRunning = true
      }

    }

为了更进一步,我只需在play / test文件夹中设置两个文件夹(包): - test / unit(test.unit包) - 测试/集成(test.integration pacakage)

现在,当我从Jenkins服务器运行时,我可以运行:

  

play test-only test.unit。* Spec

这将执行所有单元测试。

要运行我的集成测试,我运行:

  

play test-only test.integration。* Spec

就是这样。这对我来说暂时适用,直到Play将集成测试添加为生命周期步骤。

答案 1 :(得分:0)

此问题的答案在这篇博文中分享https://blog.knoldus.com/integration-test-configuration-in-play-framework/

基本上,在 build.sbt 中:

// define a new configuration
lazy val ITest = config("it") extend(Test)

/// and add it to your project:

lazy val yourProject = (project in file("yourProject"))
.configs(ITest)
.settings(
inConfig(ITest)(Defaults.testSettings),
scalaSource in ITest := baseDirectory.value / "/it",
[the rest of your configuration comes here])
.enablePlugins(PlayScala)

刚刚在 2.8.3 中对此进行了测试,效果很好。

使用 sbt 启动您的 IT:

[yourProject] $ it:test