seratch's weblog in Japanese

About Scala, Java and Ruby programming in Japaense. If you need English information, go to http://blog.seratch.net/

scala-testgenというテスト自動生成ツールをつくりました

少し前になりますが、scala-testgenというライブラリをつくりました。

Scalaのテストケースのひな形を自動生成するツールです。

https://github.com/seratch/scala-testgen
https://github.com/seratch/testgenerator

セットアップ

scala-testgen testgenerator はGithub Pagesでホストしているmavenリポジトリからダウンロードできます。

sbt 0.11.0では、project/plugins.sbtに以下を追加するだけで使うことができます。*1

resolvers ++= Seq(
  "seratch" at "http://seratch.github.com/mvn-repo/releases"
)

addSbtPlugin("com.github.seratch" %% "testgen-sbt" % "0.1")

resolvers += "sonatype" at "http://oss.sonatype.org/content/repositories/releases"

addSbtPlugin("com.github.seratch" %% "testgenerator" % "1.1.0")

使い方

例えば以下のようなクラスがあるとして

package com.example
case class Name(first: String, last: String)

sbtでtestgen test-gen コマンドを実行すると

$ sbt
> test-gen com.example.Name
"com.example.NameSuite" created.

以下のようなテストケースが作成されます。

package com.example

import org.scalatest._
import org.scalatest.matchers._
import org.junit.runner.RunWith
import org.scalatest.junit.JUnitRunner

class NameSuite extends FunSuite with ShouldMatchers {

  test("available") {
    val first: String = ""
    val last: String = ""
    val instance = new Name(first,last)
    instance should not be null
  }

}

また「src/main/scala/com/example/models.scala」というソースファイルに複数のクラスが入っているようなケースでは

package com.example
case class Staff(id: Long, name: String, ...)
case class Company(id: Long, name: String, ...)
case class Stock(id: Long, itemId: Long, ...)

ファイルパスとして指定するとソース内のclassやobject、traitに対してテストを生成します。

既にテストがある場合は何もしません。

$ sbt
> test-gen com/example/models.scala
"com.example.StaffSuite" already exists.
"com.example.CompanySuite" already exists.
"com.example.StockSuite" created.

カスタマイズ

生成するテストのテンプレートはデフォルトではScalaTestのFunSuite FlatSpec になっていますが、他のテンプレートやspecs、specs2を使う事もできます。

  • テストのテンプレート
    • ScalaTestのFunSuite
    • ScalaTestのAssertions
    • ScalaTestのSpec
    • ScalaTestのWordSpec
    • ScalaTestのFlatSpec(デフォルト)
    • ScalaTestのFeatureSpec
    • specsのSpecification
    • specs2のSpecification
  • ScalaTestのMatchers指定
    • ShouldMatchers(デフォルト)
    • MustMatchers
    • なし

なお、0.1ではsbtでのカスタマイズ設定に対応できていません。
とりあえず、Javaシステムプロパティで指定できますが、これについては改善点と認識しています。

java -jar sbt-launch.jar \
  -Dtestgen.srcDir=src/main/scala \
  -Dtestgen.srcTestDir=src/test/scala \
  -Dtestgen.encoding=UTF-8 \
  -Dtestgen.testTemplate=scalatest.FunSuite \
  -Dtestgen.scalatest.Matchers=ShouldMatchers

(追記)

その後、sbt での設定に対応しました。build.sbt にこのように書けます。

import testgenerator.SbtKeys._

seq(testgeneratorSettings: _*)

testgeneratorEncoding in Compile := "UTF-8"

testgeneratorTestTemplate in Compile := "scalatest.FlatSpec"

testgeneratorScalaTestMatchers in Compile := "ShouldMatchers"

testgeneratorWithJUnitRunner in Compile := false 

testgeneratorLineBreak in Compile := "LF"

Happy Testing!

その他、詳細についてはgithubのドキュメントをご覧ください。

Scalaでテストをたくさん書いているという方はぜひ使ってみてください。

https://github.com/seratch/scala-testgen
https://github.com/seratch/testgenerator

*1:その他、sbt 0.10.xやMavenからも使えます