加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 在playframework假应用程序中快速测试执行

发布时间:2020-12-16 08:53:52 所属栏目:安全 来源:网络整理
导读:按照 here所述运行测试 "Spec" should { "example" in new WithApplication { ... }} 对我来说慢得令人无法接受.这是因为新的WithApplication在每个示例中都在启动和停止框架.不要误解我的意思,框架本身加载速度非常快,但如果数据库配置好了(惊喜!),情况会
按照 here所述运行测试

"Spec" should {
  "example" in new WithApplication {
    ...
  }
}

对我来说慢得令人无法接受.这是因为新的WithApplication在每个示例中都在启动和停止框架.不要误解我的意思,框架本身加载速度非常快,但如果数据库配置好了(惊喜!),情况会变得很糟糕.

以下是一些测量:

"The database layer" should {

  "test1" in  {
    1 must be equalTo(1)
  }
  ...
  "test20" in {
    1 must be equalTo(1)
  }
}

执行时间:2秒.在每个示例中使用WithApplication的相同测试消耗9秒

由于this answer,我能够取得更好的成绩

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()}
}

}

优点:性能提升

缺点:

>需要复制粘贴设置和拆除代码,因为不知道如何
重用它(通过重用我的意思是“类MySpec扩展
使用NoWasteOfTime规范“
> new WithApplication()调用Helpers.running,如下所示

synchronized {
  try {
    Play.start(fakeApp)
    block
  } finally {
    Play.stop()
    play.api.libs.ws.WS.resetClient()
  }
}

所以我不能完全模仿Helpers.running行为(对我的代码不可见resetClient)没有反射.

请建议如何打破利弊或不同方法如何完成我的问题.

解决方法

我不知道它是否是最好的解决方案但是在这个帖子中:
Execute code before and after specification

您可以阅读可重用代码的解决方案.我很少修改它实现它.对我来说,beforeAll步骤没有运行并添加了顺序修饰符.

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()
}

我认为使用Step(…)^ fragment ^ Step(…)可以更好地映射,但它并没有为我运行beforeAll. “Global setup / teardown”中的用户指南(http://bit.ly/11I9kFM)表示使用懒惰的val.

总的来说,设置这个很痛苦.我的问题是
线程“Thread-145”中的异常java.net.SocketException:连接重置
要么

配置错误[无法连接到数据库[默认]](Configuration.scala:559)

重用相同的FakeApplication时:
SQLException:尝试从已关闭的池中获取连接.

我认为这种方式比为每个“in”块创建一个新应用程序或将所有测试添加到一个块中更合乎逻辑.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读