開発者の目を通しおテストツヌル、神話、状況





Evgeny Safronov、䞊玚開発者、DataArt



「テストは、プログラム内の゚ラヌの存圚を蚌明するために䜿甚できたすが、゚ラヌがないこずを蚌明するために䜿甚するこずはできたせん」

゚ドガヌ・ダむクストラ



テストは、人間の生掻のほずんどの分野で適甚される、適甚され、暙準化された゚ンゞニアリング手法です。 哲孊、枬定基準、たたは実践のようなテストは、プログラミングよりもはるかに長く存圚したす。 たずえば、剣を停造したした。 それが十分にシャヌプになったかどうかをテストするために、圌らはそれをテストしたす。 いく぀かの時代では、たずえ生きおいる人でさえ、たずえば奎隷です。



テストは、プログラム、サブゞェクト、たたはあらゆる産業開発の操䜜性のテストです。 どのビゞネスでもそうですが、独自の埮劙さず哲孊を持っおいたす。 おそらく私たちが砎壊的に行ったこずを芋るテスタヌに​​近いでしょう-開発者によっお提案された補品を砎壊する方法を最初から考えおいたす。 これは、予枬可胜性が高く、通垞プログラムで異垞なこずを誀っお詊みお゚ラヌを芋぀けるナヌザヌにずっお、あたり䞀般的ではありたせん。 開発者はプログラムに察しお異なるアプロヌチを持っおいたすが、芚えおおく必芁がありたす。テスタヌは私たちが䜜成したものを壊さなければなりたせん-これが圌らのパンです。



テスト゜フトりェアが非垞に重芁なのはなぜですか



開発者はテストを通しお考えず、創造的に考えたす-これは問題の原因になる可胜性がありたす。 プログラムを曞くように頌たれるずき、私たちは䞻に抂念、デヌタ構造、それらの蚘述ず盞互䜜甚に぀いお考えたす。 その結果、解決策を提瀺したす-バグがたくさんありたすが、既補のものです。 通垞、ナヌザヌが倧量の異垞な操䜜を実行した堎合、入力デヌタが倉曎された堎合に䜕が起こるかはほずんどわかりたせん。



ただし、実際には、小さな倉曎の結果ずしお最も費甚のかかる間違いが発生するこずが瀺されおいたす。 コヌドの蚘述が䞍十分な堎合は、経隓豊富な同僚がそれをやり盎すように求めおくるからです。 経隓を積むず、断片化が倱敗したこずにすぐに気付くでしょう。 しかし、゚ラヌが最小限である堎合-個別のシンボル、ドット、金融取匕のサむン、䞞め゚ラヌ-あらゆる段階で、それらを芋぀けるこずは非垞に困難です。





図 1.認蚌フォヌムずそれを蚘入するためのオプションの数。



テストにこのような困難がある理由を芋おみたしょう。 この図では、3぀のフィヌルドの単玔なフォヌムが衚瀺されおいたす。 最初の2぀のフィヌルドには1〜255文字、3番目のフィヌルドには1〜20文字を入力できたす。 行を空癜のたたにするこずもできたす。 以䞋に、可胜な組み合わせの数を瀺したす。これは、宇宙の玠粒子の数を倧幅に超えおいたす。 これは、考えられるすべおのケヌスをチェックするこずが非珟実的であるずいう説埗力のある蚌拠だず思いたす。 はい、これを行うこずはおそらく䞍適切です。



プロゞェクト゚ラヌの皮類





図 2. Steve McConnellの著曞「Perfect Code」のデヌタによるず、タむプごずの゚ラヌの分配スキヌム。



総量の玄25が構造的誀差に起因しおいたす。 デヌタ構造を䜜成し、それらを䜿甚しお操䜜の実装を䜜成する蚭蚈段階でも、぀たり、これらの構造を保持する䜕らかの「接着剀」を䜜成するずきにも発生したす。 これは根本的な゚ラヌの巚倧な局です。



次に、機胜の実装などに関連するデヌタ゚ラヌが発生したす。アヌキテクチャが最埌の堎所にあるこずは興味深いこずです。 これは、間違ったアヌキテクチャを䜜成したため、原則ずしお最終補品をリリヌスするこずが非垞に難しいずいう事実によっお説明できたす。





図 3.開発の段階ごずの゚ラヌの分垃。 スティヌブマッコネルの抂芁。



構築ず蚭蚈の段階で、゚ラヌず欠陥の䞻芁な局が考慮されたす。 よく知られおいるパレヌトルヌルはここで機胜したす。欠陥の80はコヌドの20のみにロヌカラむズされおいたす。 原則ずしお、これらはある皮のコヌナヌケヌスです。 財務ロゞックなどの数孊的な操䜜を蚘述する堎合、数倀を䞞めるずきなど、倚くの゚ラヌが境界倀内にある可胜性がありたす。ほずんどの堎合は機胜したすが、ほずんどの欠陥はコヌドの小さなセクションにロヌカラむズされたす。



手動テストを䜿甚するか単䜓テストを䜿甚するかに関係なく、テストをコヌドの50でカバヌするこずにより、朜圚的な欠陥の50を防ぐこずができたず蚀うこずはできたせん。 たずえば、100個の単䜓テストを䜜成した堎合、補品の最終品質が2倍になったずは蚀えたせん。 テストのプリズムを考えない開発者が最も軜いケヌスをチェックするからです。 必芁なフォヌムには、暙準名、姓、およびログむン名が入力されおいたす-開発者はさらに先に進みたす。 フィヌルドの1぀が空の堎合、たたは長さが255文字の名前が実際に入力された堎合、圌はケヌスをチェックしない可胜性が非垞に高いです。 圌は、非暙準文字、小文字ず倧文字の組み合わせを実隓したせん。



テストは、最も䞀般的な品質管理手法です。 剣を䜿甚しお䟋を思い出した堎合、実際の戊闘で䜿甚する前に、間違いなくそれをより長く䜓隓するように䟝頌しおください。 さらに良いこずに、生産段階で鍛冶屋に同意すれば、圌は歊噚を鍛造する金属もテストしたす。 したがっお、プログラムの品質を向䞊させるために、テストの量を増やし、同時にベストプラクティスを䜿甚するこずをお勧めしたす。 努力に比䟋しお、補品の品質が向䞊したす。



開発者、テスタヌ、マネヌゞャヌ、顧客など、誰でも補品をテストできたす。 小芏暡なプロゞェクトでは、マネヌゞャヌたたは開発者がテスタヌの圹割を実行できる堎合がありたす。 ただし、ここでも4぀の圹割はすべお非垞に重芁です。プロセスの各参加者は、それぞれの芳点からオブゞェクトを確認したす。 開発者-コヌドの仕組みのプリズムを通しお。 圌は最初から、むンタヌフェヌスを砎る方法に関するほずんどの情報を持っおいたす。 テスタヌに​​ずっお、゚ラヌを芋぀けお補品を砎壊するこずは盎接的な䜜業です。 顧客はテストをたったく異なる方法で芋たす。぀たり、より少ないテストを曞いお、より少ないお金を払うだけでなく、結果ずしお高品質の補品を埗る方法に興味がありたす。 しかし、マネヌゞャヌは最も興味深い圹割を担っおおり、通垞、圌は自分の実践からのケヌスに頌るこずができたす。 ただし、原則ずしお、開発者、テスタヌ、および顧客の間の橋枡しずしお機胜し、その䞻なタスクは補品を提瀺するこずです。 しかし、出力で補品の品質を管理するのはマネヌゞャヌです。



癜黒ボックスのテスト



開発者は自分のコヌドをホワむトボックスず芋なしおいるため、ホワむト、グレヌ、ブラックボックスの分析ずいう圢でのテスト分類は興味深いものです。 しかし、テスタヌず顧客はプログラムをブラックボックスず芋なしたす。プログラムがどのように機胜するかを完党には理解しおおらず、重芁な機胜ず動䜜する必芁がある機胜のみを知っおいたす。



䞀郚の補品がバスケットに入らないために、オンラむンストアのWebサむトのバグは、開発者にずっお小さな問題です。 䜕かをコミットおよびコミット解陀し、1か所で倉数を倉曎するだけで十分です。すべお正垞に機胜したす。 テスタヌ、特に顧客にずっお、このようなバグは顧客にずっお適切な補品を賌入できないため、重芁です。



しかし、最も興味深いボックスは灰色です。 私がスマヌトテスタヌず呌んでいるのは、コヌドず補品のしくみに深く関わっおいる人たちです。 圌らは、展開ずデヌタベヌスずの通信がどのように行われるかに関心がありたす。



開発者はどのテストを曞いおいたすか









図 4.単䜓テストのピラミッド。



ピラミッドの基瀎-単䜓テスト-プロゞェクトには倚数の単䜓テストがあるこずが望たしいです。 次に、モゞュヌルの統合テスト、受け入れテスト、特定の機胜の盎接UIテストが行​​われたす。



最初



FIRSTは、テストが満たさなければならない芁件を蚘述するための方法論です。 たず第䞀に、モゞュヌル匏ですが、原則ずしお、これらの特性は自動テストに倖挿できたす。 その䜜成者は有名な叔父のボブであり、倚くのプログラミングの䜜者です。









図 5. TDDプロセスのスキヌム。



2぀の基本的なナニットテスト方法は、TDDずBDDの抂念に䌌おいたす。 BDDアプロヌチはTDDに基づいおおり、TDDに存圚する小さな欠陥を排陀するこずを目的ずしおいたす。 BDDテストの構文は、ビゞネス指向であり、顧客にずっお理解しやすく、䞀般に技術者ずしおはそれほど䞀般的ではありたせん。 TDDは、物事を正しく行う方法に関するものです。 BDDは、正しいこずを行う方法に関するものです。



TDDプロセスはどのようなものですか



最初に行うこずは、ただ䜜成されおいないコヌドのテストを䜜成するこずです。 したがっお、機胜しないこずがわかりたす。 それが機胜するためには、コヌドを蚘述する必芁がありたす。 その埌、結局のずころ、コヌドを蚘述しおテストを実行し、テストが機胜するこずを確認したす。 次に、テストを倉曎したす芁件の指定、境界条件のチェックの远加など。 その埌、テストは機胜しなくなり、再びコヌドを倉曎する必芁が生じたす。 このプロセスは、テストが最終的な基準を明確に満たし、盎面する課題を満たすたで、ルヌプアップされたす。 二次方皋匏を解く堎合、タスクは二次方皋匏の根を芋぀ける関数を曞くこずだず仮定したす。 テストを䜜成し、実数に基づいおうたく機胜するず仮定したす。 しかし、ナヌザヌが包括的な゜リュヌションを芋぀けたい堎合、䜕もうたくいかず、テストは倱敗し、修正が必芁になりたす。 したがっお、このスキヌムは開発者の血䞭にある必芁がありたす。機胜がすべおの芁件を満たすたで、それに取り組む必芁がありたす。



TDDはどのように芋えたすか



suite('#factorial()', function() { test('equals 1 for sets of zero length', function() { assert.equal(1, factorial(0)); }); test('equals 1 for sets of length one', function() { assert.equal(1, factorial(1)); }); test('equals 2 for sets of length two', function() { assert.equal(2, factorial(2)); }); test('equals 6 for sets of length three', function() { assert.equal(6, factorial(3)); }); });
      
      





この䟋はJavaScriptで蚘述されおいたすが、構文的にはPHPたたはJavaのように芋えるず思いたす。 すべおがかなり明癜です。 テストを開くず、どのポむントがテストされおいないかを簡単に蚀うこずができたす。 すばやく簡単に䜕かを远加できたす。 したがっお、関数が正しく機胜しおいるかどうかを確認しおください。



BDDはTDDに非垞に䌌おいたすが、説明の文蚀が開発ずあたり関係のない人マネヌゞャヌたたはビゞネスアナリストに少し適しおいる点が異なりたす。



 describe('#factorial()', function() { it('should return 1 when given 0', function() { factorial(0).should.equal(1); }); it('should return 1 when given 1', function() { factorial(1).should.equal(1); }); it('should return 2 when given 2', function() { factorial(2).should.equal(2); }); it('should return 6 when given 3', function() { factorial(3).should.equal(6); }); });
      
      





単䜓テスト機胜









図 6.単䜓テストツヌル。



QUnitはjQuery開発者のラむブラリであり、アサヌトメカニズムを䜿甚しお、TDDスタむルで単䜓テストを蚘述できたす。 qunit.test、テストの名前、およびテストする内容を蚘述し、コヌドが衚瀺されるはずの別のファむルで実行するず、コヌドが機胜するこずを確認できたす。



Mochaは、TDDおよびBDD圢匏でテストを䜜成できるテストフレヌムワヌクです。 原則ずしお、䜜業でTDDアプロヌチを完党に実装するために、他のツヌルず組み合わせお䜿甚​​されたす。 ぀たり、目的の圢匏でテストを実行および蚘述できたす。たずえば、別のラむブラリほずんどの堎合、Chaiがアサヌトチェックの凊理を担圓したす。



Sinonは、モック、スタブ、スパむを䜜成するためのツヌルであり、珟代の成功したプロゞェクトで非垞によく䜿甚されたす。 開発者が単䜓テストの䜜成䞭に遭遇する倚くの兞型的な問題を倚く助け、解決する関数ずモゞュヌルのセットが含たれおいたす。



Jasmineは、最も䞀般的なAngular Javascriptフレヌムワヌクの゚コシステムで実際に暙準になった人気のあるBDDラむブラリです。



神話





プロゞェクトの状況






All Articles