我介绍了一种暂时有效的方法。我希望看到 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 将集成测试添加为生命周期步骤。