SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

「JBehave」による振舞駆動開発(BDD)の実践

 次に、テスト対象のクラスを実装します。まずは、インターフェースについて仕様を決めて空実装します。名前の追加機能と、リストアップの機能が必要なので、以下のように実装します。

PayRoll.java
package com.example;

import java.util.ArrayList;
import java.util.List;

/**
 * 従業員名簿クラスです。
 */
public class PayRoll {

    /**
     * 従業員を登録します。
     * 
     * @param name
     *            名前
     */
    public void register(String name) {
    }

    /**
     * 従業員の名前一覧を取得します。
     * 
     * @return 名前一覧
     */
    public List getNames() {
        return new ArrayList();
    }
}

 上記のクラスを「src/main/java」以下の「com.example」パッケージへ配置します。PayRollクラスのメソッドのスケルトンが作成できたので、それを踏まえて、先ほど作成したStepクラスに検証ロジックを追加します。

AddPayRollSteps.java
package com.example;

import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;

import org.jbehave.core.annotations.Given;
import org.jbehave.core.annotations.Named;
import org.jbehave.core.annotations.Then;
import org.jbehave.core.annotations.When;


public class AddPayRollSteps {

    private PayRoll payRoll;

    @Given("空の従業員名簿を作成します")
    public void givenAPayRoll() {
        payRoll = new PayRoll();
    }

    @When("<name>を追加します")
    public void whenRegister(@Named("name")String name) {
        payRoll.register(name);
    }

    @Then("<name>が追加されていること")
    public void thenTheContainsShould(@Named("name")String name) {
        assertThat(payRoll.getNames().isEmpty(), is(false));
        assertThat(payRoll.getNames().get(0), is(name));
    }
}

 以上で、JBehaveを動かすために必要なものが一通り揃いましたので、早速JBehaveを起動します。以下のコマンドで起動することができます。

$ mvn verify

 もちろん未実装なので、テストは失敗します。コンソールには以下のように出力されます。

(BeforeStories)

Running story com/example/payroll_stories.story

(com/example/payroll_stories.story)
Scenario: 従業員名簿に名前を追加します
Examples:
Given 空の従業員名簿を作成します
When <name>を追加します
Then <name>が追加されていること

|name|
|徳川家康|

Example: {name=徳川家康}
Given 空の従業員名簿を作成します
When 徳川家康を追加します
Then 徳川家康が追加されていること (FAILED)
(java.lang.AssertionError:
Expected: is <false>
     but: was <true>)

(AfterStories)

 Thenの段階で失敗していることが分かります。従業員名簿に名前を追加したのですが、追加した値が名簿から取得できなかったようです。次に要求仕様を踏まえて、テストが通るようにPayRollクラスを実装します。

PayRoll.java
public class PayRoll {

    private List names = new ArrayList();

    /**
     * 従業員を登録します。
     * 
     * @param name
     *            名前
     */
    public void register(String name) {
        names.add(name);
    }

    /**
     * 従業員の名前一覧を取得します。
     * 
     * @return 名前一覧
     */
    public List getNames() {
        return new ArrayList(names);
    }
}

 以上のように、実装を修正したうえで、再度テストを起動します。今度は、「BUILD SUCCESS」と表示され、テストが通ります。

まとめ

 BDDのGiven-When-Thenを軸にした設計によって、HowからWhatへフォーカスしたテストを行うことが可能になります。

 昨今注目されているドメイン駆動設計など、設計から実装へのトレーサビリティをより向上させようとする動きが盛んですが、同じくBDDもアプリケーションの構造を改善していくのに寄与すると思います。

参考文献

  1. JBehave公式サイト
  2. Wikipedia

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
特集記事連載記事一覧

もっと読む

この記事の著者

谷津 勝也(ヤツ カツヤ)

フリーランスのエンジニア。千葉県生まれ。JavaEE、オブジェクト指向を得意分野とする。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/7585 2014/01/29 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー