scala – 在playframework假应用程序中快速测试执行
按照
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()} } } 优点:性能提升 缺点: >需要复制粘贴设置和拆除代码,因为不知道如何 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. 总的来说,设置这个很痛苦.我的问题是 配置错误[无法连接到数据库[默认]](Configuration.scala:559) 重用相同的FakeApplication时: 我认为这种方式比为每个“in”块创建一个新应用程序或将所有测试添加到一个块中更合乎逻辑. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |