5

我正在尝试让集成测试在 Play Framework 2.1.1 中工作

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

我希望这个过程是:

  1. 使用 FakeApplication 启动 TestServer。使用替代的集成测试配置文件
  2. 运行集成测试(可以按包过滤或不在这里)
  3. 停止测试服务器

我相信最好的方法是在 Build.scala 文件中。

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

非常感谢任何帮助!

4

2 回答 2

6

我介绍了一种暂时有效的方法。我希望看到 Play 在 sbt 中引入单独的“测试”与“集成测试”范围的概念。

我可以进入 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 package) - test/integration (test.integration pacakage)

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

播放仅测试 test.unit.*Spec

这将执行所有单元测试。

为了运行我的集成测试,我运行:

播放仅测试 test.integration.*Spec

而已。这暂时适用于我,直到 Play 将集成测试添加为生命周期步骤。

于 2013-05-02T14:56:55.587 回答
1

此博客文章中共享了此问题的答案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),    
  ITest / scalaSource := baseDirectory.value / "it",
  [the rest of your configuration comes here])
.enablePlugins(PlayScala)

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

使用以下命令从 sbt 启动您的 IT:

[yourProject] $ it:test
于 2021-03-07T02:21:40.937 回答