矢崎です。
Toru Koidoさん wrote:
> > > ストも refactor の対象だと思っているので、きれいにするために helper 的な
> コー
> > > ドを追加することは必要だと思います。システムに対する YAGNI は、違反して
> いま
> > > すが、テストに関しては、(今テストコードをきれいにするために必要だから)
> 違反
> > > していないと思っています。
> >
> > 現時点では、私は、テストのためだけのメソッドを追加することは
> > 反対の立場です。ただ、これは確固たる信念、あるいは理論武装
> > があってのことではなくて、直観的なものです。もしかしたら明日
> > には逆の意見を持っているかもしれません。
>
> 私は、矢崎さんに賛成です。
>
> 私は、テストとクラスは独立したものであることが重要だと考えます。
> 依存関係的には、テスト->クラスであって、この関係は物理的にも論理的も
> 崩すことはよくないと考えます。
>
> テスト専用のメソッドを追加することは、この関係を論理的に壊していることに
> なるからです。
>
> C++のようなコンパイラでは良く、デバック版とリリース版とわけてテスト用のメ
> ソッドを
> クラスに組み込むことは良くやっていますが、これではリリース版ではテストができ
> な
> いことになるのでXP的には論外と思います。
>
> しかし、インスタンスに自分の状態をチェックするメソッドなどは、必ずしもテスト
> のため
> だけとは言えないので、OKということもありだとは思います。
>
テストのためだけのメソッドを追加することに反対である、という
立場は変えてはいないのですが、それとは逆の立場の意見も
紹介しておきます。
とはいってもかの有名なXPlorationsのThe Test/Code Cycle in XP: Part 1, Model
からの一説なので、既に読まれた方もたくさんいらっしゃるかとは思いますが。
http://users.vnet.net/wwake/xp/xp0002/index.shtml
このページの中断あたりに
Initialization----Loading Documentsの見出しのついた章がありますが、
そこには次のように書かれています。
<引用>
We've also postulated a getCount() method, used only by tests to verify
that something was loaded. An advantage of having the tests in the same
package as the class under test is that you can provide non-public methods
that let tests view an object's internal state.
</引用>
で、テスト・コードは以下のようになっています。
<引用>
public void testLoadingSearcher() {
try {
String docs = "a1\tt1\ty1\na2\tt2\ty2"; // \t=field, \n=row
StringReader reader = new StringReader(docs);
Searcher searcher = new Searcher();
searcher.load(reader);
assert("Loaded", searcher.getCount() == 2);
/*矢崎注:これが指摘のgetCount()*/
} catch (IOException e) {
fail ("Loading exception: " + e);
}
}
</引用>
これは、まあ、小井土さんがおっしゃる「インスタンスに自分の状態をチェック
するメソッド」といえるのではないかな、と思います。
--
矢崎博英 firo@....jp