我从未对我测试 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"
}
从我的测试配置中可以看出,我喜欢使用内存数据库进行测试。我喜欢使用内存数据库进行测试有几个原因
- 我发现在 SQL 文件中管理测试数据更容易
- 测试完成后自动转储数据库
- 移动到另一台开发机器很容易
我有 2 套进化脚本。一组用于存储在下的 dev/prod 数据库evolutions/default/<n>.sql
,另一组用于存储在下的测试数据库evolutions/test/<n>.sql
。
在我的测试中,我使用Injecting
trait 将数据库注入测试套件并运行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 {
...
}
}
}
我不喜欢这种方法的事情:
- 我将测试数据存储在进化脚本中,它工作得很好,但似乎是错误的。
- 我需要维护 2 套进化脚本。
- 为了运行测试,我需要一个应用程序,以便我可以注入数据库。这似乎太“沉重”了。
我的方法看起来合理吗?在 Play 中处理测试是否有普遍认可的方法?