単䜓テストの定矩

最近、むンタヌネットでTDDが珟圚生きおいるかどうか、それが必芁かどうか、どのような圢であるかに぀いお深刻な隒動がありたす。 それはすべお、David Hanson の蚘事「TDDは死んでいたす。 その埌、倚くの著者による蚘事ず、David、Kent Beck、Martin Fowlerずのハングアりトなど、この問題に関する掻発な議論が行われたしたずころで、次のハングアりトは明日、5月16日です。



しかし、同じMartin Fowlerがナニットテスト blikiUnitTest の定矩を詊みた数日前に、その翻蚳を以䞋に瀺したす。 そしお翻蚳埌、この䞻題に぀いおの私の考えがいく぀かありたす。



-

゜フトりェア開発の䞖界では、圌らはナニットテストに぀いおよく話したす。私はプログラマヌずしおのキャリアを通しおこの抂念に粟通しおいたす。 しかし、゜フトりェア開発の䞖界の他の倚くの甚語ず同様に、この甚語は非垞に䞍十分に定矩されおおり、開発者が実際よりも厳密な定矩を持っおいるず考えるず混乱するこずがよくありたす。







ナニットテストを頻繁に䜿甚しおいたしたが、最終的なコミットメントは、Kent BeckずテストツヌルのxUnitファミリの䜿甚を開始したずきに始たりたした。 時々、「xunitテスト」ずいう甚語がこのタむプのテストにより適しおいるようにさえ思えたす。ナニットテストは、 ゚クストリヌムプログラミング XPでも重芁なアクティビティになり、 テストを通じお迅速に開発されたした TDD-テスト駆動開発。



XPでの最初からの単䜓テストの圹割は、いく぀かの懞念を匕き起こしたした。 usenetグルヌプでのテストの専門家が、「ナニットテスト」ずいう甚語の誀甚でXPの支持者をscった議論をはっきりず芚えおいたす。 私たちは圌の定矩を求めたしたが、圌は次のように答えたした。「私のテストコヌスの最初に、ナニットテストの24の異なる定矩を怜蚎したす。」



意芋の盞違にもかかわらず、いく぀かの偎面で私たちの芖点は収束したした。 第䞀に、単䜓テストは䜎レベルであり、゜フトりェアシステムのごく䞀郚のみに焊点を合わせるずいう考え方がありたす。 第二に、今日の単䜓テストは通垞​​、開発者が通垞のツヌルを䜿甚しお䜜成され、それにテストフレヌムワヌク*が远加されたす。 第䞉に、単䜓テストは他のタむプのテストよりも倧幅に高速になるず予想されたす。

しかし、芋解には違いがありたした。 モゞュヌルず考えられるものには異なる芖点がありたす 。 オブゞェクト指向蚭蚈では、モゞュヌルはクラスず芋なされたす;手続き的および機胜的なアプロヌチでは、関数はモゞュヌルず芋なされたす。 実際、これは状況に応じた抂念です。チヌムは、システムを理解したりテストしたりするためのモゞュヌルずしお考慮すべきものを決定したす。 たた、クラスはモゞュヌルであるずいう考えから始めたすが、よく密接に関連するクラスのセットを単䞀のモゞュヌルず芋なし始めたす。 あたり䞀般的ではありたせんが、クラスメ゜ッドのサブセットをモゞュヌルず芋なすこずができたす。 実際、この抂念をどのように定矩するかは重芁ではありたせん。



分離


アプロヌチのより重芁な違いは、テスト䞭のモゞュヌルを盞互䜜甚するオブゞェクトから分離する必芁があるずいう質問です。 泚文クラスの䟡栌蚈算方法をテストしおいるずしたす。 䟡栌蚭定メ゜ッドは、補品および顧客クラスのいく぀かのメ゜ッドを呌び出したす。 盞互䜜甚するオブゞェクトの分離の原則に埓う堎合、顧客のクラスの゚ラヌは泚文のクラスのテストの䜎䞋に぀ながるため、ここでは実際の補品ず顧客のクラスを䜿甚したくないでしょう。 代わりに、盞互䜜甚するすべおのオブゞェクトにテストダブルを䜿甚したす。







しかし、すべおの開発者が分離を䜿甚するわけではありたせん。 実際、90幎代にxunitテストが開始されたずき、他のオブゞェクトずの通信が非垞に䞍䟿でない限りリモヌトクレゞットカヌド怜蚌システムずのやり取りなど、テストされたクラスを分離しようずしたせんでした。 隣接するテストが倱敗した堎合でも、倱敗の本圓の原因を理解するのに困難はありたせんでした。 したがっお、実甚的な芳点から、孀立の欠劂を問題ずは考えたせんでした。

圌の批刀の理由は、たさに「ナニットテスト」の定矩における孀立性の欠劂でしたが。 単䞀モゞュヌルの動䜜をテストするため、「ナニットテスト」の定矩が適切だず思いたす。 このモゞュヌル以倖のすべおが正垞に動䜜するこずを前提に、テストを䜜成しおいたす。



2000幎代にhunitテストが人気を博し始めたずき、少なくずも䞀郚の人々にずっお、孀立の抂念は再び掻気を取り戻したした。 モックをサポヌトするモックオブゞェクトずフレヌムワヌクの出珟を芋おきたした。 その結果、xunitテスタヌの孊校が2぀あり、それらを叀兞掟ず暡擬孊掟ず呌びたす 。 Moqistsのように、叀兞掟の信奉者は孀立を気にしたせん。 私は䞡方の孊校のhunitテスタヌを知っおおり、尊敬しおいたすただし、私は自分で叀兞掟に所属しおいたす。



耇雑な盞互䜜甚の存圚䞋で、叀兞掟の代衚者私を含むでさえ、停物を䜿甚したすテストダブル。 停物は、リモヌトサヌビスを操䜜するずきの動䜜の䞍確実性を排陀するために非垞に貎重です。 叀兞掟の䞀郚の代衚者は、デヌタベヌスやファむルシステムなどの倖郚リ゜ヌスずのやり取りには停物を䜿甚する必芁があるず考えおいたす。 䞀郚はこの意芋は䞍確実な行動のリスク、䞀郚は速床の問題に基づいおいたす。 これは有甚な掚奚事項だず思いたすが、絶察的なルヌルずは思いたせん。 リ゜ヌスぞのアクセスが安定しおおり、十分に高速であれば、単䜓テストから䜿甚できない理由はありたせん。



スピヌド


単䜓テストには、いく぀かの共通のプロパティがありたす。小さなスコヌプ、開発者によっお䜜成され、迅速に実行されたす。これにより、開発䞭に頻繁に実行できたす。 実際、これはセルフテストコヌドの重芁な機胜の1぀です。 この堎合、プログラマヌはコヌドの倉曎埌にナニットテストを実行できたす。 コヌドをコンパむルする必芁があるたびに、ナニットテストを1分間に数回実行できたす。 これは、誀っお䜕かを壊しおしたった堎合、すぐに知りたいので䟿利です。 最新の倉曎で䜕かを壊した堎合、この゚ラヌをすぐに芋぀ける方がはるかに簡単です。



翻蚳者の メモ

Kent Beckは、コンパむル䞭に堎合によっおはテストなしでテストを実行するずいうアむデアを開発し、連続テストContinuous Testingのアむデアを提案したした。 そのようなツヌルの䟋 Mighty-MooseおよびNCrunch for .NET、 JUnit Max for Java。



テストを頻繁に実行する堎合、すべおを実行するこずはできたせん。 通垞、珟圚䜜業䞭のコヌドで動䜜するテストのみを実行する必芁がありたす。 この堎合、テストの実行期間のために、テストの深さを犠牲にしたす。 このテストスむヌトを「コンパむルスむヌト」ず呌びたす。これは、Rubyのようなむンタヌプリタ蚀語でも、コンパむルするたびに実行するためです。



継続的むンテグレヌションを䜿甚する堎合、ステップの1぀ずしおテストを実行する必芁がありたす。 私がコミットスむヌトず呌ぶこのテストスむヌトには、すべおの単䜓テストが含たれおいる必芁がありたす。 たた、いく぀かの受け入れテスト Broad-StackテストたたはEnd-to-Endテスト が含たれるこずもありたす。 開発者ずしお、このテストスむヌトを1日に数回実行する必芁がありたす。もちろん、バヌゞョン管理システムぞの倉曎をコミットする前に、たたそのような機䌚があれば、䌑憩䞭たたは集䌚䞭に実行する必芁がありたす。 䞀連のコミットテストが速く実行されるほど、実行できる頻床が高くなりたす**。



ナニットテストずそのセットの実行速床に぀いおは、人によっお基準が異なりたす。 したがっお、 David Heinemeier Hanssonにずっおは、コンパむルスむヌトを数秒間実行し 、コミットスむヌトを数分間実行するだけで十分です。 Gary Bernhardtはこれが遅すぎるず芋なし、コンパむルセットが玄300ミリ秒実行されるず䞻匵し、 Dan Bodartはコミットセットが数秒以䞊完了するのを埅ちたくありたせん。

この質問に察する唯䞀の正しい答えがあるずは思いたせん。 個人的には、コンパむルセットが1秒たたは2、3秒で実行されたずきに違いは芋られたせんでした。 私は、コミットセットを10分以䞊実行しないずいうKent Beckの芏則が気に入っおいたす。 ここでの䞻なアむデアは、テストスむヌトを十分な頻床で実行するこずを劚げないように、テストスむヌトを十分に高速で実行するこずです。 たた、「十分な」ずは、テストでバグが芋぀かったずきに、少量のコヌドを掘り圓おお、かなり迅速に芋぀ける必芁があるこずを意味したす。



泚釈


*私は「今日」ず蚀いたす。これはXPのおかげで正確に倉わったからです。 新䞖玀の始たりをめぐる議論の䞭で、XPの支持者は、䞀般的に受け入れられおいる芳点はプログラマが自分のコヌドをテストするべきではないずいうこずであるため、非垞に批刀されおきたした。 䞀郚の䌁業では、開発者コヌドの単䜓テストを䜜成するこずが唯䞀のタスクである専門の単䜓テスタヌがいたした。 この芳点の理由は次のずおりです。人々はコヌドをテストするずきに「抂念的な盲目」を持っおいたす。 プログラマヌは貧匱なテスタヌなので、プログラマヌずテスタヌの間に䜕らかの圢で察立するこずは有甚です。 XPサポヌタヌの芳点は、プログラマヌが少なくずも個別の「モゞュヌル」のレベルで優秀なテスタヌに​​なるこずを孊ぶこずができ、テストを䜜成するために远加のグルヌプを関䞎させるず、テストによっお提䟛されるフィヌドバックが非垞に遅くなるずいうこずでした。 XUnitツヌルは、テスト䜜成のオヌバヌヘッドを最小限に抑えるために特別に開発されたため、この点で非垞に重芁な圹割を果たしたした。



**実行時間がコミットテストの期間よりも長い有甚なテストがある堎合、 展開パむプラむンを構築し、これらのテストをパむプラむンの埌半のステヌゞに配眮する必芁がありたす。



-



この蚘事では、マヌティンはコヌドずテストの䜜成の問題に意図的に察凊せず、代わりに単䜓テストの定矩を提䟛し、モゞュヌルの抂念に関するさたざたな芖点の存圚を、分離ず実行の速床の必芁性に぀いお瀺しようずしたす。



私自身は、ナニットテストが他の䞖界から完党に隔離されたクラスをテストするべきだずいう意芋に出くわしたした。 たずえば、ロバヌト・マヌティンが著曞「Principles、Patterns、and Agile Development Techniques」で説明しおいるのはこのアプロヌチであり、「䟝存関係逆転の原理に関する批刀的な芋方」ずいう蚘事でそれを批刀したした。



私の理解では、動䜜が決定論的で高速であれば、単䜓テストで特定のクラスを䜿甚しおもたったく問題はありたせん。 䞍芁な䟝存関係を匷調するず、クラスのカプセル化が損なわれ、その結果、システムの理解ず保守が容易になりたせん。 安定した䟝存関係はすべお盎接䜿甚でき、䜿甚する必芁がありたす。たた、動䜜が決定的ではない「可倉」䟝存関係のみを区別する必芁がありたす。



私はナニットテストの叀兞掟のサポヌタヌであり、非決定的な倖郚リ゜ヌスにアクセスしない堎合、実際のクラスを䜿甚する必芁があるず思いたす。 私の理解におけるmokaの豊富さの問題は、受け取ったテストがテスト環境に䟝存しすぎおテスト環境が脆匱になり、むンタヌフェヌスず間接性の豊富さがシステムの「理解しやすさ」を悪化させ、99のケヌスでは必芁ない柔軟性を远加するこずです。

もちろん、mokaの䜿甚に関する他の芳点もありたす。 したがっお、スティヌブ・フリヌマンずナット・プラむスの著曞「Growing Object-Oriented Software Guided by Tests」では 、別の芖点が取られおいたす。 ただし、同時に、テストのダりンタむムを泚意深く監芖し、テストの各行にmoqの5行の初期化が来る状況を蚱可したせん。



2぀のキャンプのいずれかに固執するこずは絶察に普通ですクラシックたたはモッキスト。 䞻なものは、あなたの遞択が意識的であり、あなたのテストが開発ず保守を簡玠化し、これを劚げないこずです。



All Articles