背景
- 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を起動できる
がポイント?