Slick 3.0.0 documentation - 16 Slick TestKit

Permalink to Slick TestKit — Slick 3.0.0 documentation

Slick TestKitについて 

Slickに対し、独自のデータベースドライバを記述する際には、きちんと動作するのか、何が現時点で実装されていないのかなどを確認するために、ユニットテスト(もしくは加えて他の独自のカスタマイズしたテスト)をきちんと記述して欲しい。簡単にテストを記述するためのサポートとして、Slickユニットテスト用のSlick Test Kitプロジェクトを別に用意している。

これを用いるためには、Slickの基本的なPostgreSQLドライバと、ビルドするために必要なものを全て含んだSlick TestKit Exampleをcloneして使って欲しい。

Scaffolding 

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フレームワーク以外のものを使う事も出来る。

Driver 

ドライバの実装はsrc/main/scalaの中にある。

Test Harness 

TestKitテストを実行するためには、DriberTestを継承したクラスを作成する必要がある。加えて、TestKitに対してどのようにtestデータベースへ接続するのか、テーブルのリストをどのように取得するのか、テスト間におけるクリーンをどのようにして行うのかなどといった事を表すTestDBの実装が必要になる。

PostgreSQLのテストハーネスの場合(src/test/slick/driver/test/MyPostgresTest.scala)、大抵のデフォルト実装は、そのままですぐに使える用になっている。localTablesgetLocalSequencesのみ、カスタマイズした実装が必要になる。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") ...

Database Configuration 

PostgreSQLのテストハーネスはExternalJdbcTestDBをベースにしているため、test-dbs/testkit.confの設定をいじる必要がある。

mypostgres.enabled = true
mypostgres.user = myuser
mypostgres.password = secret

ExternalJdbcTestDBを扱うためのオプショナルな設定が他にもいくつかある。testkit-reference.confには、適切なデフォルト値が設定されており、testkit.confをシンプルに保つのが良い。

Testing 

sbt test を実行すると、 MyPostgresTest を探索し、TestKitのJUnit runnerを用いて実行される。これはテストハーネスを通してセットアップされたデータベースを用いており、ドライバを用いて適応可能な全てのテストが実行される事になる。

Fork me on GitHub