Index: [Article Count Order] [Thread]

Date:  Sat, 30 Sep 2000 06:52:03 +0900
From:  omura@....jp
Subject:  [XP-jp:00987] Re: Why do I test private methods?
To:  extremeprogramming-jp@....jp (extremeprogramming-jp ML)
Message-Id:  <20000930065014omura@....jp>
In-Reply-To:  Your message of "Fri, 29 Sep 2000 13:14:37 +0900"             <00Sep29.131450jst.115205@....jp>
References:  <00Sep29.131450jst.115205@....jp>
Posted:  Sat, 30 Sep 2000 06:50:14 +0900
X-Mail-Count: 00987

おおむらです

firo <firo@....jp> wrote:
from "[XP-jp:00979] Why do I test private methods?"

>今、本家XPのMLのほうで、Why do I test private methods?
>というsubjectのスレッドが盛り上がっています。
>
>内容は、
>private methodはテストすべきかどうか?というような内容
>です(投稿全てに目を通していないので、今は別の方向に
>流れていっているものもあるかもしれません)。
>
>すべき、すべきでない、の意見にわかれています。本家の
>ほうでも、いろいろな考えがある、ということですね。
>
>R.Jefはprivateメソッドをテストするのはよい、という意見の
>ようです。

◇
読まなきゃと思いながら、最初の二、三個くらいしか読んでません。
あとで読みますから、初期状態はこんなんだったということで
おつきあいください...


◇
わたくし、思いますに、javaのpublicやprivateなどのアクセス制限は
テスト以外のクラスに対するもので、テスト用クラスに対するアクセス
制限というのは、また別なのではないでしょうか。

つまり、テスト用クラスというのは、ある意味、テスト対象クラスに
対するメタな操作であるわけで、メタなんなら、対象クラスの中身が
全部、透明に見えているのがナチュラルなように思います。
privateな変数すらみえてもいいのではないかと思うわけです。

で、テストと対象クラスの独立性というのは確かに必要なのですが、
それは、テストを書く人が自分で意識して書けばいいのかなと思います。
対象クラス自身が、このメソッドはテストしてほしいとか、この変数は
テストしちゃだめだ、というのはなんか変な気がするからです。
テストを書くのは開発者自身なので、明示的にアクセス制限を書く
必要はないでしょう...(でも、将来そのコードをメンテナンスする人に
対するドキュメントという意味では必要なのかな??)


でそう考えると、「privateなメソッドはテストすべきかどうか」という質問
自体があんまり意味がなくて、答は「テストすべき/したいメソッドは
テストすればいい」というだけのように思いますね。


でも、そうなると、privateなメソッドをテストしたら、内部状態のテストに
なってテストの再利用はできなくなるし、テストを見てクラスの使い方を
学ぼうという人が混乱するではないかという反論もあると思います。

それについては、外に見える振舞いのテストと、内部の状態の
テストとは別のクラスに分けて書いておいて、外に見える振舞いの
テストだけを公開すればよいのではないかと思います。

ん? テストを公開する? 

つまり、テストを仕様のようなものだと思っているので、publicな
テストとprivateなテストがあるのかなという感じです。


まとめると、

1. テストは対象クラスの中身を全部見てもかまわない。
2. ただし、内部状態のテストと振舞いのテストは分離しておくべきである。
3. また、当然ではあるが、内部状態のテストを書くときは、本当に必要な
ものだけをテストすること--実装が変ると捨てられることになるので。

いかがなものでしょうか

一般論はともかく、現実には個々のプロジェクトで、いろんな状況があるで
しょうから、それぞれで実状にあった方針を決めてやればいいだけですよね。