運行測試所描述的here快速測試執行的playframework假的應用
"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」
新WithApplication()來電Helpers.running它看起來像這樣
synchronized {
try {
Play.start(fakeApp)
block
} finally {
Play.stop()
play.api.libs.ws.WS.resetClient()
}
}
,所以我不能完全效仿Helpers.running行爲(resetClient對我的代碼不可見),沒有反射。
請建議如何打破缺點或不同的方法如何完成我的問題。
您是否想爲規範設置/拆卸一次,還是想爲其中的每個測試執行一次? –
18個月後它太糟糕了,Play仍然沒有改變這種行爲。爲每個測試啓動應用程序是可笑的。 Play 3將會有DI,希望完全消除對運行應用程序的需求。 – andyczerwonka