Jer*_*iho 8 scala playframework specs2 playframework-2.2
按此处所述运行测试
"Spec" should {
"example" in new WithApplication {
...
}
}
Run Code Online (Sandbox Code Playgroud)
对我来说慢得令人无法接受.这是因为新的WithApplication在每个示例中都在启动和停止框架.不要误解我的意思,框架本身加载速度非常快,但如果数据库配置好了(惊喜!),情况会变得很糟糕.
以下是一些测量:
"The database layer" should {
"test1" in {
1 must be equalTo(1)
}
...
"test20" in {
1 must be equalTo(1)
}
}
Run Code Online (Sandbox Code Playgroud)
执行时间:2秒.在每个示例中使用WithApplication的相同测试消耗9秒
由于这个答案,我能够取得更好的结果
import play.api.Play
import play.api.test.FakeApplication
import org.specs2.mutable.Specification
import scalikejdbc._
class MySpec extends Specification {
var fake: FakeApplication = _
step {fake = FakeApplication(...)}
step {Play.start(fake)}
"The database layer" should {
"some db test" in {
DB localTx { implicit session =>
...
}
}
"another db test" in {
DB localTx { implicit session =>
...
}
}
step {Play.stop()}
}
Run Code Online (Sandbox Code Playgroud)
}
优点:性能提升
缺点:
需要复制粘贴设置和拆卸代码,因为不知道如何重用它(通过重用我的意思是"类MySpec扩展规范与NoWasteOfTime "
新的WithApplication()调用Helpers.running,看起来像这样
synchronized {
try {
Play.start(fakeApp)
block
} finally {
Play.stop()
play.api.libs.ws.WS.resetClient()
}
}
Run Code Online (Sandbox Code Playgroud)
所以我不能完全模仿Helpers.running行为(对我的代码不可见resetClient)没有反射.
请建议如何打破利弊或不同方法如何完成我的问题.
小智 9
我不知道它是否是最好的解决方案,但是在这个线程中: 在规范之前和之后执行代码
您可以阅读可重用代码的解决方案.我很少修改它实现它.对我来说,beforeAll步骤没有运行并添加了sequential修饰符.
import org.specs2.mutable._
import org.specs2.specification._
class PlayAppSpec extends Specification with BeforeAllAfterAll{
sequential
lazy val app : FakeApplication = {
FakeApplication()
}
def beforeAll(){
Play.start(app)
}
def afterAll(){
Play.stop()
}
}
import org.specs2.specification.Step
trait BeforeAllAfterAll extends Specification {
// see http://bit.ly/11I9kFM (specs2 User Guide)
override def map(fragments: =>Fragments) = {
beforeAll()
fragments ^ Step(afterAll)
}
def beforeAll()
def afterAll()
}
Run Code Online (Sandbox Code Playgroud)
我认为map会更好,Step(...) ^ fragments ^ Step(...)但它没有为我运行beforeAll."Global setup/teardown"中的用户指南(http://bit.ly/11I9kFM)说使用懒惰的val.
总的来说,设置这个很痛苦.我的问题是
Exception in thread "Thread-145" java.net.SocketException: Connection reset
或
Configuration error[Cannot connect to database [default]] (Configuration.scala:559)
重用相同的FakeApplication时:
SQLException: Attempting to obtain a connection from a pool that has already been shutdown.
我认为这种方式比为每个"in"块创建一个新应用程序或将所有测试添加到一个块中更合乎逻辑.