Slick 3.0.0 documentation - 16 Slick TestKit
Permalink to Slick TestKit — Slick 3.0.0 documentation
Slickに対し、独自のデータベースドライバを記述する際には、きちんと動作するのか、何が現時点で実装されていないのかなどを確認するために、ユニットテスト(もしくは加えて他の独自のカスタマイズしたテスト)をきちんと記述して欲しい。簡単にテストを記述するためのサポートとして、Slickユニットテスト用のSlick Test Kitプロジェクトを別に用意している。
これを用いるためには、Slickの基本的なPostgreSQLドライバと、ビルドするために必要なものを全て含んだSlick TestKit Exampleをcloneして使って欲しい。
build.sbtは以下のように記述する。一般的な名前とバージョン設定と区別して、SlickとTestKit、junit-interface、Logback、PostgreSQL JDBC Driverへの依存性を追加する。そしてテストを行うためのオプションをいくつか記述する必要がある。
libraryDependencies ++= Seq(
"com.typesafe.slick" %% "slick" % "|release|",
"com.typesafe.slick" %% "slick-testkit" % "|release|" % "test",
"com.novocode" % "junit-interface" % "0.10" % "test",
"ch.qos.logback" % "logback-classic" % "0.9.28" % "test",
"postgresql" % "postgresql" % "9.1-901.jdbc4" % "test"
)
...
testOptions += Tests.Argument(TestFrameworks.JUnit, "-q", "-v", "-s",
"-a")
...
parallelExecution in Test := false
...
logBuffered := false
src/test/resources/logback-test.xml
に、Slickのlogbackについての設定のコピーがある。もちろん、loggingフレームワーク以外のものを使う事も出来る。
ドライバの実装はsrc/main/scala
の中にある。
TestKitテストを実行するためには、DriberTestを継承したクラスを作成する必要がある。加えて、TestKitに対してどのようにtestデータベースへ接続するのか、テーブルのリストをどのように取得するのか、テスト間におけるクリーンをどのようにして行うのかなどといった事を表すTestDBの実装が必要になる。
PostgreSQLのテストハーネスの場合(src/test/slick/driver/test/MyPostgresTest.scala
)、大抵のデフォルト実装は、そのままですぐに使える用になっている。localTables
とgetLocalSequences
のみ、カスタマイズした実装が必要になる。JDBCのgetFunctions
呼び出しをサポートしないドライバである事を明示するために、ドライバのcapabilities
を変更する。
@RunWith(classOf[Testkit])
class MyPostgresTest extends DriverTest(MyPostgresTest.tdb)
object MyPostgresTest {
def tdb = new ExternalJdbcTestDB("mypostgres") {
val driver = MyPostgresDriver
override def localTables(implicit ec: ExecutionContext): DBIO[Vector[String]] =
ResultSetAction[(String,String,String, String)](_.conn.getMetaData().getTables("", "public", null, null)).map { ts =>
ts.filter(_._4.toUpperCase == "TABLE").map(_._3).sorted
}
override def getLocalSequences(implicit session: profile.Backend#Session) = {
val tables = ResultSetInvoker[(String,String,String, String)](_.conn.getMetaData().getTables("", "public", null, null))
tables.buildColl[List].filter(_._4.toUpperCase == "SEQUENCE").map(_._3).sorted
}
override def capabilities = super.capabilities - TestDB.capabilities.jdbcMetaGetFunctions
}
}
設定のプレフィックス名(上記例ではmypostgres
)はExternalJdbcTestDB
へ渡してあげる必要がある。
def tdb =
new ExternalJdbcTestDB("mypostgres") ...
PostgreSQLのテストハーネスはExternalJdbcTestDB
をベースにしているため、test-dbs/testkit.conf
の設定をいじる必要がある。
mypostgres.enabled = true
mypostgres.user = myuser
mypostgres.password = secret
ExternalJdbcTestDB
を扱うためのオプショナルな設定が他にもいくつかある。testkit-reference.conf
には、適切なデフォルト値が設定されており、testkit.conf
をシンプルに保つのが良い。
sbt test
を実行すると、 MyPostgresTest
を探索し、TestKitのJUnit runnerを用いて実行される。これはテストハーネスを通してセットアップされたデータベースを用いており、ドライバを用いて適応可能な全てのテストが実行される事になる。