C++でTDDを始めてみた。

最近よくユニットテストやらTDDやらの単語をよく聞くようになった。いままでだるいな(LLでは標準でサポートされていることも多いがC++の場合そうではないので)と思いつつしていなかったのだが、こないだ思い切って始めてみることにした。環境の導入やそのとき思ったことを書いておく。

1.環境の導入
色々なユニットテスト用のフレームワークがあるようだが、僕はGoogle C++ Testing Framework(GoogleTest)を導入してみた。なぜGoogleTestにしたかというとあまり理由はないw 導入は非常に簡潔だった。というのもライブラリをコンパイルしなくても(もちろんすることも可能)ヘッダとソースを追加するだけで簡単に使えてしまうから。解凍してできた中に「fused-src」というフォルダがあるのだが、そのなかのヘッダとソース(gtest.h,gtest_main.cc,gtest-all.ccの3つを)プロジェクトに加えてコンパイルすればいい。gtest_main.ccにmain関数が存在しているので使う側は特にmain関数を書く必要はなく純粋にテストだけを書けばいい。
ここで書いている導入方法はこちらが詳しい→http://d.hatena.ne.jp/E_Mattsan/20120215/1329311774

2.使ってみた感想
最初は非常に使いにくかった。というのも既存のコードのテストコードを作るところから始めたからだ。friendクラスを利用したりと非常に面倒。
 ところがいちからコードを書く場合はかえって書きやすいと感じた。「テストを通す」という明白な目標があるので書かなくてはいけないコードがわかるし、バグを作りこむ心配が少ないので安心して書けるからだ。なにより全部緑(テストが通る)になると目で見て自分のプログラムがしっかり動いているのがわかるというのが気持ちがいい。以前は動いているコードに手を入れることは若干抵抗があったのだが、それもなくなった。また、テストが書きやすいコードを書くので最初に書いたようなデメリットもない。
 またやる気が出ないときなどでも有効であるという精神的な効果もあった。というのもやる気のないときにとりあえず手軽に書けるテストコードとハリボテのメソッドを書く。そうすると実行したときにTDDなので当然失敗して赤い表示になり気持ち悪い。自分のコードにバグがあるのが目に見えてしまうので直したくなってついついコードを書いてしまう。そうしているとひとつメソッドが完成していたりする。コードを書くのが一種のゲームのように見えてくる。
 もちろんC++はコンパイル時間がそれなりにかかるのでそれが多少ネックになっているのだが、それでもなおする価値があるなと思った。