播放+流畅+进化测试建议

时间:2019-01-04 17:50:13

标签: playframework playframework-evolutions

我从未对测试Play应用程序的方式感到百分百满意。我已经确定了已经使用了一段时间的方法,但是感觉有点,而且我缺少一些简单的东西。

我使用SQLite,并且有一个名为default的数据库配置,该配置在测试conf文件中被覆盖:

application.conf

slick.dbs.default {
  profile = "slick.jdbc.SQLiteProfile$"
  db.driver = "org.sqlite.JDBC"
  db.url = "jdbc:sqlite:defaultDB.sqlite"
}

application.test.conf

include "application.conf"

play = {
  evolutions.enabled = false
}

slick.dbs.default {
  profile = "slick.jdbc.SQLiteProfile$"
  db.driver = "org.sqlite.JDBC"
  db.url = "jdbc:sqlite:memory;DB_CLOSE_DELAY=-1"
}

从测试配置中可以看到,我喜欢使用内存数据库进行测试。我出于某些原因喜欢使用内存中的数据库进行测试

  1. 我发现管理SQL文件中的测试数据更容易
  2. 测试完成后,数据库将自动转储
  3. 转移到另一台开发机很容易

我有2套演进脚本。一个存储在evolutions/default/<n>.sql下的开发/生产数据库,另一个存储在evolutions/test/<n>.sql下的测试数据库。

在测试中,我使用Injecting特性将数据库注入测试套件并运行test演变,如下所示:

[TestName] Spec.scala

class MySpec extends PlaySpec with BeforeAndAfterAll with GuiceOneAppPerSuite with Injecting  {
  import ThisClassLoaderEvolutionsReader.evolutions

  override def beforeAll(): Unit = {
    super.beforeAll()

    val db = inject[DBApi].database("default")
    Evolutions.applyEvolutions(db, SimpleEvolutionsReader.forDefault(evolutions("test") :_*))
  }

  override def afterAll(): Unit = {
    super.afterAll()

    val db = inject[DBApi].database("default")
    Evolutions.cleanupEvolutions(db)
  }

  "My Test" should {
    "do something useful" in {
      ...
    }
  }

}

我不喜欢这种方法:

  1. 我将测试数据存储在Evolution脚本中,效果很好,但似乎有误。
  2. 我需要维护两组进化脚本。
  3. 为了运行测试,我需要一个应用程序,以便可以注入数据库。这似乎太“沉重”。

我的方法似乎明智吗?是否有在Play上处理测试的公认方法?

1 个答案:

答案 0 :(得分:0)

我为这个确切的问题而苦苦挣扎-实际上,我什至无法完成上述工作。我很想知道答案是否正确。