Slick 1.0.0 documentation - 06 Slick TestKit

“Permalink to Slick TestKit — Slick 1.0.0 documentation

Slick TestKit 

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

これを用いるためには,Slickの基本的なPostgreSQLドライバーと,それをビルドするために必要なものを全て含んだSlick TestKit Exampleをクローンして,それをテストして欲しい.

Scaffolding 

build.sbtは以下のように記述する.一般的な名前とバージョン設定と区別して,SlickとTestKit,junit-interface,Logback,PostgreSQL JDBC Driverへの依存性を追加する.そしてテストを行うためのオプションをいくつか記述する必要がある.

libraryDependencies ++= Seq(
  "com.typesafe.slick" %% "slick" % "1.0.0",
  "com.typesafe.slick" %% "slick-testkit" % "1.0.0" % "test",
  "com.novocode" % "junit-interface" % "0.10-M1" % "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/scala/scala/slick/driver/test/MyPostgreTestの中にある)の場合は,大抵のデフォルトとなる実装はボックスの外で利用される.

@RunWith(classOf[Testkit])
class MyPostgresTest extends DriverTest(MyPostgresTest.tdb)
...
object MyPostgresTest {
  def tdb(cname: String) = new ExternalTestDB("mypostgres", MyPostgresDriver) {
    override def getLocalTables(implicit session: Session) = {
      val tables = ResultSetInvoker[(String,String,String, String)](_.conn.getMetaData().getTables("", "public", null, null))
      tables.list.filter(_._4.toUpperCase == "TABLE").map(_._3).sorted
    }
    override def getLocalSequences(implicit session: Session) = {
      val tables = ResultSetInvoker[(String,String,String, String)](_.conn.getMetaData().getTables("", "public", null, null))
      tables.list.filter(_._4.toUpperCase == "SEQUENCE").map(_._3).sorted
    }
    override lazy val capabilities = driver.capabilities + TestDB.plainSql
  }
}

Database Configuration 

PostgreSQLのテストハーネスは ExternalTestDB に基づいている一方, test-dbs/databases.properties において設定が行われてなくてはならない.

PostgreSQL quick setup:

mypostgres.enabled = false
mypostgres.url = jdbc:postgresql:[DB]
mypostgres.user = postgres
mypostgres.password = secret
mypostgres.adminDB = postgres
mypostgres.testDB = slick-test
mypostgres.create = CREATE TABLESPACE slick_test LOCATION '[DBPATH]'; CREATE DATABASE "[DB]" TEMPLATE = template0 TABLESPACE slick_test
mypostgres.drop = DROP DATABASE IF EXISTS "[DB]"; DROP TABLESPACE IF EXISTS slick_test
mypostgres.driver = org.postgresql.Driver

Testing 

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

Fork me on GitHub