JDaveをさわってみた

RSpecJava版っぽいJDaveをさわってみた。
# そもそもRSpecどころかRubyも知らないけど。
あんまり時間がないので、てきとーまとめ。

試す

とあるStackクラスを作るとして、そのStackクラスの仕様は
次のように定義できる。

  • 空のStackの場合
    • 空である
    • 何かをpushすると、空でなくなる
  • Stackが満タンの場合
    • 満タンである
    • pushできない
    • すべてのアイテムを保持している
    • 削除したアイテムは保持していない
    • 削除したアイテム以外はすべて保持している
  • Stackが空でも満タンでもない場合
    • pushすると、そのアイテムが一番上に追加される


で、これをJDaveで実装すると、次のようになる。
(とりあえず1番上だけ、しかもサンプルとほぼ同じ)
あえて日本語で書いてみた。

@RunWith(JDaveRunner.class)
public class スタックスペック extends Specification<Stack<?>> {
    
    public class 空のStack {
        private Stack<String> stack;
        
        public Stack<String> create() {
            stack = new Stack<String>();
            return stack;
        }
        
        public void 空である() {
            specify(stack, should.be.empty());
        }

        public void push後は空ではない() {
            stack.push("");
            specify(stack, must.not().be.empty());
        }
    }
}

BDDなので、testやassertという文字がまったくなくなる。
そして検証部分は、仕様を確認してるっぽい感じになって、英語的に読みやすい(と思う)。

ポイントはこんな感じ。

  • @RunWith(JDaveRunner.class)をつける。
  • Specificationを継承する。
  • 内部クラスでふるまいを1つずつ実装する。
  • 内部クラスでは、createが最初に呼ばれる。JUnitのsetUpみたいなイメージ。
  • 内部クラスでは、最後にdestroyが呼ばれる(今回は実装してない)。JUnitのtearDownみたいなイメージ。

あとは、JUnitのテストケースとして実行するだけ。
Eclipseでの実行結果はこんな感じ。




以下の手順で、JDaveのHTMLレポートも出力することができる。

  1. JDave実行時にシステムプロパティjdave.tools.specdox.formatにxmlを指定して、XMLレポートを出力する。
  2. JDaveに付いてくるdox2html.shを適切な引数で実行する。

日本語だったり環境のせいだったり、なんかうまく出なかったけど、
無理やり出力させた結果。


単にSpec別に出るだけのシンプルなもの。
見た目をもっと豪華にしたい・・・。

その他

試してないけど、他にもこんなことができるらしい。

  • specify(検証部分)の指定にHamcrestを使う。
  • モックを使う(JMock)。
  • グルーピング。TestNGのgroupsみたいな感じ。
思ったこと
  • BDDな人にとってtestと付くのは違和感があるのかなー?
  • 仕様の記述レベルを合わせるのは大変そうな気がする。設計フェーズでがんばるのかな?ふるまい、と言われてはたしてこんな感じに書けるのかどうか。
  • 日本語だと、句読点とか使いたいなーと思う。というわけで、クラス名とかメソッド名の他にアノテーションで指定できてもいいのかなーなんて。
  • JDaveで作ったクラスってなんて言えばいいの?スペッククラス??
  • 仕様ベースのレポートって、なんかいい感じ。
  • JUnitでも苦労するのに、JDaveの使い方をプロジェクト内に展開するのは難しいのかなーと思ったり。testと付くのは我慢して独自でツールを作った方がいいのかな?


やっぱり、TDDに慣れ親しんでないと実感がわかないかも。