cucumber-jvmで受け入れテストを日本語で書こう

これはJava Advent Calendar 2012の13日目のエントリです。

前の日のエントリ | 次の日のエントリ

Cucumberとは

CucumberRailsではおなじみの受け入れテストを実行するツールです。
最大の特徴は、テストシナリオを自然言語(日本語、英語、etc...)で書けること。
似たようなツールにSeleniumが有るわけですが、これのテストは普通にJavaのコードですので、パッと見で分かりやすいってのがあります。
また、SEとは似て非なるサラリーマンプログラマでない人でも、書式さえ覚えれば簡単に受け入れテストを書けるというメリットもあります。

このCucumberをJavaから利用するためのツールがcucumber-jvmです。今回はこれを使用してWebアプリに受け入れテストを行ってみたいと思います。

実際に動かしてみよう

というわけで実際に動かせるサンプルを以下に用意してあります。
https://github.com/zephiransas/cucumber-example
適当なディレクトリにcloneした後、Mavenからcucumberを以下のようにして実行します。

mvn clean verify -Pintegration-tests

ブラウザが開いてテストが実行されているのがわかるかと思います。
では、実際にどのようにテストが実行されているか、その詳細を見ていきます。

featureファイル

src/it/resourcesにsample.featureというファイルがあります。Cucumberではこのfeatureファイルに受け入れテストの実行手順を書いていきます。

#language: ja

フィーチャ: Cucumberのテスト
  シナリオ: テストのシナリオ
    前提 ページを表示する
    ならば "Hello World"と表示されていること
    
    もし "ほむほむ"と表示されていること
    かつ "ほげほげ"と表示されていないこと
    もし "test"リンクをクリックする
    もし "ほむほむ"と表示されていないこと
    かつ "ほげほげ"と表示されていること

WebSteps.java

WebSteps.java内ではfeatureに記述した手順を、具体的にどのように実行するかを定義しておきます。

@前提("^ページを表示する$")
public void ページを表示する() {
  connector.openAndWait("http://localhost:8080/cucumber-example/");
}

@ならば("\"([^\"]*)\"と表示されていること$")
public void と表示されていること(String pattern) {
  assertTrue(connector.isTextPresent(pattern));
}

@ならば("\"([^\"]*)\"と表示されていないこと$")
public void と表示されていないこと(String pattern) {
  assertFalse(connector.isTextPresent(pattern));
}

@もし("\"([^\"]*)\"リンクをクリックする$") 
public void リンクをクリック(String selector) {
  connector.clickAndWait(selector);
}

自然言語で書かれたfeatureファイルの手順との関連付けは cucumber.api.java.ja.* に定義されている
@もし、@ならば、@前提
といった日本語のアノテーションで記述します。このアノテーションの属性には正規表現を記述できますので、対応するfeatureの手順を記述します。

WebSteps内ではfeatureファイルから指定したパラメータを取得したり、またSeleniumを使用してブラウザ上の要素に対して値のセットや取得などができますので、これをassertThatなどで検証していきます。

まとめ

以上、駆け足ではありますがcucumber-jvmを紹介しました。
また、このcucumber-jvmについて12/16に岡山県立大学で開催される、合同勉強会in大都会岡山 -2012 Winter-でセッションをする予定です。
まだまだ席に余裕がありますので、興味のあるかたは是非ご参加ください!