Index: [Article Count Order] [Thread]

Date:  Fri, 29 Aug 2008 14:47:08 +0900
From:  okkez <okkez000@....com>
Subject:  [XP-jp:05366] Re: テストファーストについて
To:  extremeprogramming-jp@....jp
Message-Id:  <1f73ff9d0808282247m3f3a4816v2801efbcb63e226f@....com>
In-Reply-To:  <20080829140113.70f3e874.ruby@....jp>
References:  <20080829140113.70f3e874.ruby@....jp>
X-Mail-Count: 05366

okkez といいます。

2008/08/29 14:01 Akira Hayakawa <ruby@....jp>:
> 一回送ったのですが、跳ね返されてきたので、再送します。
>

ちゃんと ML に届いてますよ。

> --------------

# 改行位置変えてます。

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

一つずついきます。
* クラスBに依存するクラスAのテストの書き方
  1. クラスBのテストをしっかりやってクラスAのテストで使う
  2. クラスBのモックオブジェクトやスタブを作成してクラスAのテストで使う

前者はクラスBが比較的シンプルな場合には許容されるやり方だと思います。
また、プロジェクト自体が小さく、個人で全てをコントロールできる場合も前者でいいでしょう。
後者は、クラスBが比較的複雑で外部環境(DBやファイルシステムなど)に副作用を起こしたり、
外部がきちんと動いているかどうかに依存するような場合に使用します。
# モックオブジェクトやスタブについては調べてみてください。

* データを格納して返すだけのようなシンプルなクラスやメソッドのテストは書くべきか
私は書かなくていいと思います。
Eclipse などの IDE では setter, getter は自動生成できるのでそういったメソッドのテストは書かなくていいと思います。
また、クラスがそういったメソッドしか持たない場合はクラス自体のテストも省略できるでしょう。

* ユーザに見せるトップクラスのテストだけ真剣に書く
これは結合テストや受け入れテストと言ってユニットテストには含まれないと思います。
このテストはこのテストで重要なので、書かなければならないのですけど。。。
# 継続的インテグレーションなどで調べると関連する話が出てくると思います。

このテストだけ書いて済ませられるのは、プログラムが相当シンプルな場合のみだと思います。
# このテストだけで済ませようとして炎上したプロジェクトは数知れず。。。

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

これはどちらの流派もあって、どちらでもやりやすい方でいいと思います。
個人的には、Java でテストを書く場合ならある程度重複部分が出てきたらまとめるようにしています。
その場合も、まとめたメソッドが十分シンプルでありつづけるように気をつけて書きます。

> よろしくお願いします。
>
> --

大学の図書館でテストやXPに関する書籍を数冊借りて読んでみるといいと思います。
# 最近はいい本がたくさんありますので。

ではでは。


-- 
okkez
okkez000@....com