自分はTDDすらやったことの無い、ある意味時代遅れの開発しかやったことはないのだけど、先のエントリを読むとTDDのテストと単体テストは別物という解釈らしい。
それを聞いたとき、「?」と思ったのが本音だ。テストコードなのに品質とは関係ないのだろうか?と。
TDDに対する私なりの解釈
私はある関数のコードを書くときにJavadocやDoxygenで関数ヘッダをある程度詳しく文章で書く。
そして関数内にコメントの形式でどんなコード(処理)を実装すべきかを書いていく。イメージとしては以下のような感じ。
private List<nnnn> func(int id) { // xxオブジェクトのインスタンス取得 // XXXDAO経由でidに関連するデータを取得 // 取得したデータからxxxとxxxの条件に合致するものを抽出しリストにする // リストを生成し返す }
あとは上記のコメントを実際のコードに置き換えて行けばよい。また自分以外のメンバーに作ってもらうときもこの形式で渡すこともある。
ただこの方式だと、単に文章をコードに置き換えただけでそのコードが正しく動作するものかどうかを検証する手段がない。
なので、上記のようなコメントを先に書く代わりにTDDのテストコードを書いて、その通りに関数本体側を実装する。そうすると、
- この館数ではどういうコード(処理)を書くべきかの情報が残せる(コメントで残すのと同じ)
- 実装したコードが意図した動作をしているか"実行して"評価することができる
という2点が一緒に満たせるというのがTDDというものなのかな、と。
実際に境界値評価だったり網羅性の評価を行う"単体テスト"の場合は、もっとしっかりとテストコードを書く必要があるのだと思うし、その単体テストコードのベースがTDDのテストコードであることは問題無いということだろうか。
TDDと単体テストコードは、誤解を恐れずに言えば前者が"コーディングの補助"、後者が"品質の担保"ということになるのだろうか。
感想
TDDのテストコードが品質担保(これだけでは単体テストとしては不十分で使えない)とすると、開発工数の見積もりにTDDのコーディング工数を入れるのは、TDDに理解の無いSIerなどでよくある開発現場だと説明するのが難しいかもしれないね。
何も言わずに実装工数見積もりの中に含めてしまうか、単体テストコードへ昇華させることを視野に説明して見積もりに乗せるかということになるだろうか。
個人的には、TDDだけならやる意味は少し薄いのかなという気持ちはある。TDDのテストコードを単体テストコードへ昇華させるという前提でやるなら、取り組む価値はあるかと思っている。
コメント
お元気でしょうか? 久々に書いてみました。
懐かしくPCを自作しました。CPUをcorei7-860にしました。
メモリはまだ2GBですが、64版のwin7も買い、SSD64Gを導入しました。
まだwin7が届いてないので、SSDは活用してないですが、なぜか
起動がcle3.06に負けるのが納得できないです(^^;
win7はproを買い、XPモード使えるようにしました。OEMで買ったけど。
先生から教わって以来、長く自作してませんでしたが、今回何か目覚めました。
今現在ではCPUの性能もほとんど活用できてない感じがしますね。
SSDが本格起動した時の感動があるのかが焦点の構造です。
先生は最近そこまでの自作はされていない感じですね。お仕事が忙しいので
しょうかね。
また福岡でお茶でもしましょうね。ちなみに3/13に大濠でご存知だと思われます、
バンドやっていた部下と会います。結婚し、出産し、今度は神奈川に引っ越すとの
事でしたので。
また近況カキコします。