JDaveをさわってみた
RSpecのJava版っぽい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レポートも出力することができる。
- JDave実行時にシステムプロパティjdave.tools.specdox.formatにxmlを指定して、XMLレポートを出力する。
- JDaveに付いてくるdox2html.shを適切な引数で実行する。
日本語だったり環境のせいだったり、なんかうまく出なかったけど、
無理やり出力させた結果。
単にSpec別に出るだけのシンプルなもの。
見た目をもっと豪華にしたい・・・。
その他
試してないけど、他にもこんなことができるらしい。
思ったこと
- BDDな人にとってtestと付くのは違和感があるのかなー?
- 仕様の記述レベルを合わせるのは大変そうな気がする。設計フェーズでがんばるのかな?ふるまい、と言われてはたしてこんな感じに書けるのかどうか。
- 日本語だと、句読点とか使いたいなーと思う。というわけで、クラス名とかメソッド名の他にアノテーションで指定できてもいいのかなーなんて。
- JDaveで作ったクラスってなんて言えばいいの?スペッククラス??
- 仕様ベースのレポートって、なんかいい感じ。
- JUnitでも苦労するのに、JDaveの使い方をプロジェクト内に展開するのは難しいのかなーと思ったり。testと付くのは我慢して独自でツールを作った方がいいのかな?
やっぱり、TDDに慣れ親しんでないと実感がわかないかも。