くりにっき

フルスタックキュアエンジニアです

Try Dream Development : 夢の開発を始めよう #TddAdventJp

TDD Advent Calendar jp: 2012 の1日目です。

初日ということで、TDDをとりまく環境について浅く狭く紹介したいと思います。

TDD(Test Driven Development=テスト駆動開発)とは何か?

普通は一通り実装が終わってからテストを書くと思いますが*1、先にテストを書くこと(テストファースト)で全体的にメンテしやすいコードにできます。

詳しくは wikipedia:テスト駆動開発 参照。

TDDをすることにより何が嬉しいか

  • 最初からテスト有りきで実装をするため、テストが網羅されている
    • 後からテストを書く場合テストすることを前提とされていないことが多いため、実はこっちの方が難しいと思います
    • ある程度テストが網羅されていればリファクタリングもやりやすいし、デグレ防止のためのセーフティネットとしての役割も十分果たせる
  • 最近流行りのCIを活用できる

その他メリット・デメリットはあると思いますが、その辺は後の方々に譲ります。

各言語のTDD事情

TDDやるにも各言語で事情が変わってくるため、自分が実際に使ったことのある範囲でまとめておきます。

Java

JUnit

最近Groovy勢に押され気味ですが、まだまだ JUnit が主流だと思います。

ただ個人的にJUnitJavaであるが故にいろいろと面倒くさいのでGroovyベースのspock を推したいです。(僕自身は実際に使ったことはないのでここでは説明しません)

自分のTDD環境です

  • Eclipse 4.2
    • QuickJUnit plugin
      • EclipseでTDDやるならこれがないと始まらない
      • Market placeから検索してインストール
      • 「Ctrl + 0」で現在行でテスト実行、「Ctrl + 9」でプロダクトコードとテストコードを相互移動
  • JUnit
    • Eclipse付属のものは古いことが多いので手動で最新版を追加した方がいいです
    • JUnitは大きく3.7と4.0以降で全然違うので、Java5以降であれば何があっても4系にする
      • プロダクトコードで使ってるフレームワークやライブラリだとバージョンアップするにも勇気*2が必要ですが、テストコードのライブラリなら軽い気持ちで最新版できると思います
  • hamcrest
    • JUnit 4系の大きな特徴としてassertThatがありDSL(Domain-Specific Language = ドメイン固有言語)っぽくテストを書くことができるのですが、JUnitデフォルトの機能だと若干機能が不足してるためhamcrestで補います
    • 参考:hamcrestのMatcherメモ - 都元ダイスケ IT-PRESS
参考文献

テスト駆動開発入門

テスト駆動開発入門

  • 作者: ケントベック,Kent Beck,長瀬嘉秀,テクノロジックアート
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2003/09
  • メディア: 単行本
  • 購入: 43人 クリック: 1,011回
  • この商品を含むブログ (153件) を見る

TDDの勉強会だと大抵この本を勧められる。
サンプルコードはJavaだけどそこまで他言語で写経するのも面白い

                                            • -

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)


@さん著。僕が書いているようなことは全部この本に書いています。JUnitのことはもちろん周辺技術に関してもまとまっているためおすすめ

詳しい紹介

Ruby / Ruby on Rails

Test::Unit

Ruby標準のライブラリ。標準的なxUnitの機能は備えているので問題はないのですが、後述のRSpecが素晴らしすぎるためあまり使われてないと思います。

RSpec

Railsだとこれが一番主流な気がします。他言語の人から見ると黒魔術な仕様が結構ありますが*3、使いこなせばテストコードをシンプルにできます

関連リンク

spork

起動が遅いRailsを補うためのgem。予めRailsを起動しておいて起動を速くする。Gemfileを更新した時は一度再起動しないといけないのがネック

関連リンク

guard

こいつも常駐系。ソースが保存された時に自動的にrspecを動かして、結果をgrowlとかに通知してくれる。
保存したらテスト自動実行ってのは便利なんですが、specが大きくなるとその分時間がかかるのがネック。

自分の場合通常はguardを使って、1テストケースずつ実行したいような場合は前述の「RubyvimでQuick JUnit風にテスト実行」+sporkでやってます

JavaScript

QUnit

jsはテスティングフレームワークが乱立してて何を使うか悩みどころですが、なんとなくQUnitが一番使われてる気がします。*4

AZusaar!!のクライアントサイドのテストでは

  • QUnit
  • QUnit-TAP : QUnitの実行結果をTAP形式で出力
  • phantomjs : jsのテストをコンソールで実行する
  • prove : 特定のシェルを置いておくことでテストスイートとして使える

という構成になってます。

詳しくはソース参照

参考リンク

JsTestDriver

JsTestDriver自体が小さなサーバになっていて、その中でjsを読み込んでテストを実行する。
ただこれが曲者で、(自分が使った当時は)日本語でassertすると文字化けしてテストが通らないという問題があったため使うのをやめました。

QUnitに比べてアサーションが充実してたり、EclipseやWebStormからプラグイン出てるのはいいんだけどなぁ・・・

Jasmine

最近人気急上昇みたい

使ったことはないので詳しくは触れませんが、テストコードがrspecっぽくて素敵。欠点はjsの言語仕様上functionがうざいということかw
今度新規でjsを書くことがあれば是非使いたい

参考文献

テスト駆動JavaScript

テスト駆動JavaScript


テスト駆動開発入門」のjs版といっても差し支えない。
jsならではのDOMのテストやmockの紹介がためになる

勉強会

*1:え、みんなテスト書きますよね?

*2:開発現場によっては上長判断も

*3:letとかsubjectとか

*4:他のテスティングフレームワークQUnit用のアダプターも出てるくらいだし