Index: [Article Count Order] [Thread]

Date:  Wed, 6 Dec 2000 14:57:55 +0900
From:  "Oota" <oota@....jp>
Subject:  [XP-jp:01257] Re: テストはテスト ?
To:  extremeprogramming-jp@....jp (extremeprogramming-jp ML)
Message-Id:  <000001c05f4b$1f6d0c00$010400c8@Ra20>
In-Reply-To:  <20001206122555omura@....jp>
Keywords:  XP
Posted:  Wed, 6 Dec 2000 15:09:42 +0900
X-Mail-Count: 01257

 早稲田大学の太田です。オフ会に出たいのですけど、ちょっと切羽詰ってい
まして。

おおむらさん
> ただ、自分でも「テスト」とは言いながら、XPのテスト(Unit
> Testのほうです)
> ってそのテストと違うんじゃないのかなあと思うことしきりなのです。
略させて頂きます
> もしも違うものなら、それに名前をちゃんとつけてやると、人に話すのが
> 楽になるんじゃないかなあと思うのですが、それの説明にかえって手間取る
> んだと逆効果だし。ううむ。

 私もこの点が気になってJPLoPの友野さんにお聞きしたのですが、XPでいう
テストはMeyerの契約主導設計の実現の一種であるというお話でした。「表
明」というのでしょうか。「表明」は「こうなっているべきだ」というのを事
前条件、事後条件、不変条件で通常そのプログラムの内部で記述するものです
(というのは平鍋さんのほうが詳しいと思います)が、それを外側にもってきた
のが、XPのテストということでしょうか。

 そういう意味でいうとMyersの定義である

テストは、エラーを見つけるつもりでプログラムを実行する過程である。

 とは外れているので従来のテストと同列に扱うことはできませんね。

 私がXPのテスト戦略に関して危惧しているのは、この方法では1歩間違う
と、Boris Beizerが以下で指摘しているようなことに陥る可能性があるからで
す。

フェーズ1 ― テストの目的は、ソフトウェアが動くことを示すことであ
る。

 フェーズ1の考え方は、テストとデバッグを区別して認識する点では進歩し
ている。この考え方は、1970年代後半にMyers[Myers 79]が自己崩壊であると
批判するまで最先端の考え方であった。つまり、テストで1つの誤りを指摘す
るだけで、ソフトウェアは完全には動かないことをは証明できるが、無限にテ
ストしたところでソフトウェアが完全に動くことは証明できないと指摘した。
フォーズ1の考え方が目標とすることは、現実には実現不可能である。ソフト
ウェアが動くことを証明できる確率は、テストが進むにつれて低くなる。すな
わち、テストをすればするほどバグを多く見つけることになり、この考え方そ
のものの信頼性がなくなる。つまり、ソフトウェアが動くことを高い確率で示
したいのであれば、何もテストしないでも目的は達成できる!この結論は真面
目な合理的な考え方に対しては不謹慎に思えるが、この邪気に満ちた考え方こ
そ、新しいものを生み出す三段論法となる。

 また、privateメソッドをテストするしないの基準に関しても、従来のテス
トの考え方からすると、

 C1(ステートメントカバレージ)より少ない基準でユニットテストをする場合
には、どの部分をテストしないで残すかを決定しなければならならない、。未
テストの部分が、どんなバグに対して耐性があるか考えてみるとよい。バグに
対して特別な免疫がないなら、テストする/しないの基準はなんだろうか。そ
んな基準は、独断的で合理性に欠け、救いようがない。実際問題として、テス
ト未完の部分を残すことはよくあるし、そのために、システムがダウンするこ
とがよくある。テスト未完のコードをシステムに組み込む言い訳のうちで最も
大きいのが、テストの時間や金が十分でなかったということである。時間と金
がなくてテストできないのなら、そもそもプログラム開発の最初から金と時間
がなかったはずである。テストが十分でない限り、コードはソースコードやプ
ログラムたり得ず、単なるソースプログラムの原型、あるいは、タチの悪いプ
ログラムもどきにすぎない。そんなデタラメをシステムに組み込むと、バグは
たちどころに姿を現すが、ユニットテストが不充分なため、バグはなかなか見
つからない。それこそ、Hannah Cowleyのいうように、「殺人のごとく、空し
きものは露見する」。テスト未実施のソースコードにバグがないと思うことは
空しいことであり、それをシステムに組み込むのは殺人行為である。テストが
終わっていないプログラムは、システムの中に入れずに、まとめて別の場所に
格納する方がよい。システムの中に混入しない限り、テスト済みのプログラム
に悪影響を及ぼすことはない。組み込んでいない機能は、当たり前のことだが
動作しない。未テストのコードは、動くこともあり、動かないこともあるが
(恐らくは動かないだろうが)、未テストプログラムが混入すると、正常に機能
しているプログラムにまで悪影響を与える。テストの済んでいないプログラム
をシステムの中に入れるのは、愚かな近視眼的行為であり、無責任のそしりを
免れない。

 となってしまうような気がします。しなくてもいいと思うメソッドはしなく
てもいいという主観的な考えだけでテストケースを選択するのは危険でしょ
う。

 何度も書いているようにXPのテストの考え方に反対しているわけではないの
です。Test Firstは良い考え方ですし。ただ、このテストをしたから万事OKと
いうのは危険な感じがするのです。

早稲田大学大学院理工学研究科情報科学専攻M2 太田健一郎
e-mail Address oota@....jp
               oota@....jp