Index: [Article Count Order] [Thread]

Date:  Sat, 06 Sep 2008 00:07:56 +0900
From:  細川 馨 <khosokawa@....com>
Subject:  [XP-jp:05368] Re: テストファーストについて
To:  extremeprogramming-jp@....jp
Message-Id:  <0AF18955-FFB9-430F-BF94-38C8262ACE22@....com>
In-Reply-To:  <20080829135316.87230454.ruby@....jp>
References:  <20080829135316.87230454.ruby@....jp>
X-Mail-Count: 05368

ホソカワです。

#久しぶりのポストです。

On 2008/08/29, at 13:53, Akira Hayakawa wrote:

> 初めまして。Akiraといいます。
>
> 言語はjavaで、一人きりでぼっちプログラミングしています。 
> 京大の学生です。
> 設計のインターフェイスを明確にする為にテストファーストというも 
> のをマジメに導入しようかと考えていますが、いくつか疑問がありま 
> す。
>
> 1)どこまでテストすべきか?
> 例えば、ある設計においては、あるクラスAがクラスBに 
> 依存している事がほとんどかと思います(例えば引数にとったり、返 
> り値にそのクラスを使ったりします)。
>
> この場合、Aのテストケースを書いたとして、それが正しい事 
> を証明するにはBが正しく動いている必要があります。最終的 
> には、依存しているのは正しくテストされてるであろうと思われる、 
> javaライブラリにのみ依存しているクラスまでテストを書いていく必 
> 要があると思いますが、非常に無駄に思えます。多くの場合、データ 
> を格納して返すだけとかその程度の振る舞いしかせず、わざわざ書く 
> 必要もないからです。
> 逆に、そういう末端までテストケースを書くのはめんどくさいという 
> 事で、ユーザに見せるトップのクラスのテストだけを真剣に書いて、 
> それが通れば成功という風にやっていくのは気が遠すぎてやる気がし 
> ないのと、たぶんテストファーストの理念にそぐわないような気がし 
> ます。

テストファーストのテストは、テスト対象のメッソッドの機能を定義し 
ていると言えます。「このようにパラメータをセットすれば、正しい結 
果がもらえます。」、「このようにセットするとエクセプションが出ま 
す。」などがテストを実行することによって理解することができると思 
います。ので、そんなに無駄なことでは無いように思います。もし、無 
駄と思うのであれば、例で言うと「クラスAは、本当に必要なの 
かどうか、直接クラスBを使えないのか?」などを考えてはどう 
でしょう。

>
> では、どの階層でテストを書いていくべきかという事で一つの疑問と 
> して持ち上がるかと思います。みなさんの意見をお聞かせください。
> javaは静的言語なので、テストコードが非常に長く複雑になりがちで 
> す、また私が書くとなぜかキャストがいっぱい出てきます。出来れば 
> 無駄なテストコードを書きたくないのです。
>

「階層」は、関係ないと思います。「Test everything that could  
possibly break. (壊れそうなところは必ずテストしよう。) - Extreme  
Programming Installed, Ron Jeffries 」自分のコードが絶対大丈夫と 
確信を持てるくらいテストを書きましょう。テストコードもプログラム 
です。refactoring して、きれいな状態を保ちましょう。

> 2)コピペを使うべきかどうか?
> テストをそれぞれのクラスについて書いていくと、例えば 
> setUpなどで同じような事を何回も書く事になります。これはとても 
> 手間です。
> 例えば生成をメソッドとしてくりぬいて、それを再利用させるべきで 
> しょうか?
> 私としてはコンストラクタやあるいはテストケースのsetUpメ 
> ソッドなどで、メソッド呼び出しを使う事にためらいがあるのです 
> が、何か良い方法はないでしょうか?

コピペは、やめましょう!生成をメソッドとしてくりぬいて、再利用し 
ましょう!
テストもプログラムです。そのうち、大きくなってきます。そのとき、 
コピペされたコードにバグなり変更があると、一つ一つ修正しなくては 
ならなくなります。