specsのLiterateSpecificationsを実際やってみた

比較も兼ねてConcordionもあわせて試してみたよ。


テストのネタにするのは,こんな単純なヤツ。


まずはspecsの環境設定部分。といってもIntelliJ+Maven使うので簡単。archetypeに"org.scala-tools.archetype:scala-archetype-simple:1.1"を使ってプロジェクトを作成。Scalaのバージョンとか微妙に古くさいんで,下記のようにPOMを書き直す。


環境設定はそんでおしまい。あとはspecsで動く仕様書を書いてみる。


HelloWorldSpecificationが本体で,HelloWorldTestってのはJUnit4へ橋渡しするダミー。"mvn test"では,HelloWorldTestが実行されるが,くだんの仕様書は生成されない。
仕様書を生成するには,HelloWorldSpecificationそのものか,specsに含まれるrunクラスを使って実行するしかないんだけど,クラスパスの設定が面倒臭いので,とてもコマンドラインから実行してみる気にはなれない。:-(
でもIntelliJ使っているから大丈夫。


(↑)こんな感じにSpecificationは実行可能(main関数持ち)と判定してくれるので,IntelliJから直接HelloWorldSpecificationを実行する。すると,こんなレポートが生成される。


どことなく微妙なところ(wikiが評価されない,最後のテストが2つ表示されているなど)もあるけど,なかなかイイ感じ。UTF-8で書いているから日本語も問題ない。難点と言えば,IntelliJでspecsのコードをオートフォーマットかけると悲しい結果になるくらいか...。そこは,IntelliJScalaプラグインの今後に期待したい(specsサポートもね)。


対して,Concordionの場合。チュートリアルに"concordion-kickstart"っていうひな形があるんでそれを使って環境構築する。といってもライブラリの設定くらいだけどね。


Concordionは仕様部(Specification)と実行部(Fixture)が別々なのが特徴。


specsとなるべく似せようかと思ったけど,Concordionの特徴を殺してしまうので,ちょっとムリして c:set 使ってみたよ。フィクスチャは普通にJUnitのテストケースなので,IDEに認識される(↓)。


フィクスチャを実行すると,こんなレポートが生成されるよ(レポートはカレントディレクトリではなく,一時ディレクトリに生成されるので,よくメッセージを読むこと)。

      • -

現時点での完成度はConcordionのほうが上。JUnitサポートしてるIDEだったら,どれでも使えるしね。でも,たったこんだけしか試してないけど,Concordionの理想はやっぱ理想でしかなカナーってオモタ。
どこがっていうと仕様部の文言をネタにしてフィクスチャに渡す,c:set -> c:assertXXX の一連の動作のことさ。確かに,仕様書に「こうしたら,こうなる」て記述して,それをネタにテスト→検証できたらステキ指数アップってのもわかるけど,その仕込みするのがハッキリ言ってウザい。:-P
「もう全部 assertTrue でエエがな」と思ってみても,仕様部と実行部が分かれているため全体の見通しも悪いと,良いこと無かった。そう思うと,specsの割り切りは好感が持てんね。開発者以外が書ける余地まったくないし。;-)


...気がつくと,テストコードは文芸的プログラミングっぽく記述するのが流行ってる感じがするナー。確かに,これを設計や成果物(納品物)に活かさないのは損だって気持ちもわかるわ。
そうゆう一方で,JUnit MaxとかInifitestみたいなテスト最適化もホットなので,ますますもって道具は使いようになって来た気がする。


ps.
もっと手っ取り早くspecsのLiterateSpecificationsを試してみたいのなら,specsのテストコードを見るのが一番の近道だとオモタ。
http://code.google.com/p/specs/source/browse/#svn/trunk

ちょうどコマンドラインで実行しやすいようにバッチファイルとシェルスクリプトが同梱してあるんで,こんな感じに試してみることができるよ(環境変数の設定をお忘れ無く)。


"-c"オプションで色つきにできるとしたって,コマンドラインからの実行は現実的じゃ無さそうだ(それはクラスパスのせい。オールScalaなプロジェクトだったらアリなんだろか?)。せめてMavenからspecsを実行できるようになってくんないかなーと思う。
Google Code Archive - Long-term storage for Google Code Project Hosting.


ps2.
ビミョーな感じのIntelliJ Scalaプラグイン。コードに問題無いのにコンパイルできないときは,次の点に気をつけるといいよっという自分メモ。

  • scala-compiler.jarを含んでいるかを確認する。
    • Mavenの場合もscala-libraryだけで安心してはいけない。
  • junit.jarを含んでいるかを確認する。
    • Javaと違ってオンデマンドで必要なライブラリを教えてくれはしないようだ。

JavaやGroovyに比べると構文解析にむちゃくちゃ時間かかるようで,なかなかイラっとくるってのはナイショだ。:-)