Play Framework 2.2.xのbuild.sbtにcucumberを実行するタスクを追加

背景

  • Play Frameworkでjavaを使って開発している。
  • UIのテストにcucumber-jvmを使っている。
  • it:testでcucumberを実行している
  • 開発中は特定のタグ @current のついたシナリオだけ実行したい
  • play it:current とかやりたいけど、方法が分からん
  • skipoleschris/xsbt-cucumber-plugin · GitHub を入れてみたが、Scalaが前提のようなので、使えない感じ

仕方がないので、タスクを作ってみた

実行方法

play cucumber

でcucumberが実行できる

play "cucumber [タグの名前]"
(ex play "cucumber @current")

タグの名前を指定して実行することもできる。

build.sbtに入れ込むコード

lazy val cucumberTask = InputKey[Unit]("cucumber", "Run Cucumber tests.")

cucumberTask := {
  val logger = streams.value.log
  logger.info("Running Cucumber tests.")
  val args: Seq[String] = Def.spaceDelimited("<arg>").parsed
  val cucumberOpts = args.isEmpty match {
    case false => "-Dcucumber.options=" + args.map("--tags " + _).mkString(" ")
    case true => ""
  }
  logger.info("Cucumber.Options: "  + cucumberOpts)
  val cucumberRunner = "features.RunCucumber"
  val classPassArgs = (fullClasspath in Test).value.map(_.data).mkString(";")
  Fork.java(ForkOptions(runJVMOptions=Seq(cucumberOpts)), Seq("-cp", classPassArgs, "org.junit.runner.JUnitCore", cucumberRunner))
}
  • クラスパスはfullClasspath in testを使っている
  • CucumberのRunnerはコードに埋め込み
  • tags以外のオプションは対応していない

自分で使う分にはここから始めればいいから十分だ。

  • 引数とりたい場合はTaskKeyじゃなくて、InputKeyに突っ込む
  • Def.spaceDelimited("").parsedで引数が取れる
  • Fork.javaでjvmを起動できる

がポイント?