4

我从未对我测试 Play 应用程序的方式感到 100% 满意。我已经确定了一种我已经使用了一段时间的方法,但感觉有点老套,而且我错过了一些简单的东西。

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

应用程序.conf

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

应用程序.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 套进化脚本。一组用于存储在下的 dev/prod 数据库evolutions/default/<n>.sql,另一组用于存储在下的测试数据库evolutions/test/<n>.sql

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

[测试名称]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. 我将测试数据存储在进化脚本中,它工作得很好,但似乎是错误的。
  2. 我需要维护 2 套进化脚本。
  3. 为了运行测试,我需要一个应用程序,以便我可以注入数据库。这似乎太“沉重”了。

我的方法看起来合理吗?在 Play 中处理测试是否有普遍认可的方法?

4

0 回答 0