Советы по тестированию Play + Slick + Evolutions - PullRequest
0 голосов
/ 04 января 2019

Я никогда не был на 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"
}

Как видно из моей тестовой конфигурации, мне нравится использовать базу данных в памяти для тестирования. Мне нравится использовать базы данных в памяти для тестирования по нескольким причинам

  1. Мне проще управлять тестовыми данными в файлах SQL
  2. База данных автоматически выгружается после завершения тестов
  3. Легко перейти на другую машину разработчика

У меня есть 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 {
      ...
    }
  }

}

Что мне не нравится в этом подходе:

  1. Я храню свои тестовые данные в сценариях эволюции, они работают довольно хорошо, но, похоже, неправильно.
  2. Мне нужно сохранить 2 набора сценариев эволюции.
  3. Для запуска тестов мне нужно приложение, чтобы я мог внедрить базу данных. Это кажется слишком «тяжелым».

Мой подход кажется разумным? Существует ли общепринятый метод обработки тестов в Play?

1 Ответ

0 голосов
/ 25 июля 2019

Я борюсь с этой конкретной проблемой - на самом деле я даже не могу заставить работать вышеупомянутое. Я хотел бы знать "правильный" ответ.

...