Я никогда не был на 100% доволен тем, как я тестирую приложения 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"
}
Как видно из моей тестовой конфигурации, мне нравится использовать базу данных в памяти для тестирования. Мне нравится использовать базы данных в памяти для тестирования по нескольким причинам
- Мне проще управлять тестовыми данными в файлах SQL
- База данных автоматически выгружается после завершения тестов
- Легко перейти на другую машину разработчика
У меня есть 2 набора сценариев эволюции. Один для базы данных dev / prod, хранящейся в evolutions/default/<n>.sql
, и другой набор для тестовой базы данных, хранящейся в evolutions/test/<n>.sql
.
В своих тестах я использую черту Injecting
для внедрения базы данных в набор тестов и запускаю 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?