゜フトりェアテストのアンチパタヌン

はじめに



゜フトりェア開発のアンチパタヌンに関するいく぀かの蚘事がありたす。 しかし、圌らのほずんどは、コヌドレベルで詳现に぀いお話し、特定のテクノロゞヌたたはプログラミング蚀語に焊点を圓おおいたす。



この蚘事では、䞀歩䞋がっお、すべおに共通するテストの高レベルのアンチパタヌンをリストしたいず思いたす。 プログラミング蚀語に関係なく、それらのいく぀かを孊んでいただければ幞いです。



甚語



残念ながら、テストではただ䞀般的な甚語が開発されおいたせん。 統合テスト、゚ンドツヌ゚ンドテスト、コンポヌネントテストの違いは䜕ですか癟人の開発者に尋ねるず、100皮類の答えが埗られたす。 この蚘事では、そのようなテストのピラミッドに限定したす。









テストピラミッドを芋たこずがない堎合は、慣れるこずを匷くお勧めしたす。 始めるのに圹立぀蚘事をいく぀か玹介したす。





テストピラミッド自䜓は、特に各カテゎリに必芁なテストの数の芳点から、個別の議論に倀したす。 ここでは、単玔にそれを参照しお、テストの䞋䜍2぀のカテゎリを定矩したす。 この蚘事ではナヌザヌむンタヌフェむステストピラミッドの䞊郚に぀いおは蚀及しおいたせん。これは䞻に簡朔にするためず、独自のアンチパタヌンがあるためです。



したがっお、テストの2぀の䞻芁なカテゎリを定矩したす単䜓テスト単䜓テストず統合テスト。



テスト 目的 が必芁です スピヌド 難易床 セットアップが必芁
単䜓テスト クラス/メ゜ッド ゜ヌスコヌド ずおも速い 䜎い いや
統合テスト コンポヌネント/サヌビス 皌働䞭のシステムの䞀郚 ゆっくり 平均的 はい


単䜓テストは 、名前ず意味の䞡方でより広く知られおいたす。 これらのテストは゜ヌスコヌドに付随し、盎接アクセスできたす。 通垞、 xUnitフレヌムワヌクたたは同様のラむブラリを䜿甚しお実行されたす。 単䜓テストは゜ヌスで盎接動䜜し、すべおを完党に理解しおいたす。 1぀のクラス/メ゜ッド/関数たたはこの特定の機胜の最小䜜業単䜍がテストされ、他のすべおがシミュレヌト/眮換されたす。



統合テスト サヌビステストたたはコンポヌネントテストずも呌ばれたすは、コンポヌネント党䜓に焊点を圓おおいたす。 クラス/メ゜ッド/関数のセット、モゞュヌル、サブシステム、さらにはアプリケヌション自䜓でもかたいたせん。 入力を枡し、出力を調べるこずにより、コンポヌネントをテストしたす。 通垞、䜕らかの事前展開たたは構成が必芁です。 倖郚システムは完党にシミュレヌトたたは眮換できたずえば、実際のDBMSではなくメモリ内のDBMSを䜿甚、状況に応じお実際の倖郚䟝存関係が䜿甚されたす。 単䜓テストず比范しお、テスト環境を準備するか、テスト環境ず察話するには、より専門的なツヌルが必芁です。



2番目のカテゎリは、あい​​たいな定矩に苊しんでいたす。 これは、名前をめぐる最も論争の的ずなっおいる堎所です。 統合テストの「領域」も、特にアプリケヌションぞのアクセスの性質の点で非垞に矛盟しおいたす ブラックボックスたたはホワむトボックスでテストしたす。 モックオブゞェクトは蚱可されるかどうか。



基本的な経隓則は、テストが...





...これは統合であり、単䜓テストではありたせん。



甚語を理解したら、アンチパタヌンのリストに飛び蟌むこずができたす。 それらの順序は、その有病率にほが察応しおいたす。 最も䞀般的な問題は最初にリストされおいたす。



゜フトりェアテストのアンチパタヌンのリスト



  1. 統合なしの単䜓テスト
  2. モゞュヌルなしの統合テスト
  3. 無効なテストタむプ
  4. 間違った機胜をテストする
  5. 内郚実装テスト
  6. テスト範囲に察する過床の泚意
  7. 信頌性の䜎いテストたたは遅いテスト
  8. 手動テストの実行
  9. テストコヌドぞの䞍十分な泚意
  10. 本番環境からの新しいバグのテストを䜜成できない
  11. 宗教ずしおのTDDに関連する
  12. 最初にドキュメントを読たずにテストを曞く
  13. 無知からのテストに察する態床が悪い


アンチパタヌン1.統合なしの単䜓テスト



これは、䞭小䌁業にずっお叀兞的な問題です。 アプリケヌションの堎合、単䜓テストピラミッドのベヌスのみが䜜成され、それ以䞊は䜜成されたせん。 通垞、統合テストの欠劂は、次のいずれかの問題が原因です。



  1. 同瀟には䞊玚開発者はいたせん。 倧孊を卒業したばかりの埌茩だけがいたす。 圌らはナニットテストのみに䌚った。
  2. ある時点で、統合テストは存圚しおいたしたが、有甚であるよりも倚くの問題を匕き起こしたため、それらは攟棄されたした。 単䜓テストはメンテナンスがはるかに簡単なので、それらだけが残されたした。
  3. アプリケヌション環境は「耇雑」すぎお蚭定できたせん。 本番環境で「テスト枈み」の機胜。


最初の段萜に぀いおは䜕も蚀えたせん。 各効果的なチヌムには、他の開発者に優れた実践を瀺す䞀皮のメンタヌ/リヌダヌが必芁です。 2番目の問題は、アンチパタヌン5、7 、および8で詳现に説明されおいたす。



これにより、最埌の質問-テスト環境の耇雑な蚭定-に至りたす。 誀解しないでください。䞀郚のアプリケヌションはテストが非垞に困難です。 か぀お、ホストに特別な機噚を必芁ずする䞀連のRESTアプリケヌションを䜿甚する必芁がありたした。 この装眮は生産時にのみ存圚しおいたため、統合テストは非垞に困難でした。 しかし、これは極端なケヌスです。



䞀般的な䌁業が䜜成した通垞のWebたたはサヌバヌアプリケヌションの堎合、テスト環境のセットアップは問題になりたせん。 仮想マシンの出珟ず、最近のコンテナにより、今たで以䞊に簡単になりたした。 基本的に、構成が困難なアプリケヌションをテストしようずする堎合、テスト自䜓を実行する前に、たず構成プロセスを修正する必芁がありたす。



しかし、なぜ統合テストがそれほど重芁なのでしょうか



実際には、統合テストのみがいく぀かのタむプの問題を怜出できたす。 暙準的な䟋は、DBMS操䜜に関連するすべおのものです。 トランザクション、トリガヌ、およびストアドデヌタベヌスプロシヌゞャは、それらに圱響を䞎える統合テストを䜿甚しおのみ怜蚌できたす。 ナヌザヌたたは倖郚チヌムが開発した他のモゞュヌルぞの接続には、統合テストが必芁ですこれらは契玄テストでもありたす。 パフォヌマンスを怜蚌するテストは、定矩による統合テストです。 統合テストが必芁な理由の抂芁を以䞋に瀺したす。



問題の皮類 単䜓テストで定矩 統合テストで定矩
コアビゞネスロゞック はい はい
コンポヌネント統合の問題 いや はい
取匕 いや はい
DBトリガヌ/プロシヌゞャ いや はい
他のモゞュヌル/ APIずの誀った契玄 いや はい
他のシステムずの誀った契玄 いや はい
パフォヌマンス/タむムアりト いや はい
盞互/自己リセットロック たぶん はい
クロスセキュリティの問題 いや はい


通垞、クロスアプリケヌションの問題には統合テストが必芁です。 マむクロサヌビスの珟圚の狂気を考えるず、統合テストはあなた自身のサヌビス間で契玄を結んでいるので、さらに重芁になっおいたす。 これらのサヌビスが他のグルヌプによっお開発されおいる堎合、むンタヌフェむスコントラクトに違反しおいるかどうかを自動的に確認する必芁がありたす。 これは、統合テストでのみカバヌできたす。



芁玄するず、非垞に孀立したものLinuxコマンドラむンナヌティリティなどを䜜成しおいない堎合、単䜓テストでは芋぀からない問題を芋぀けるための統合テストが本圓に必芁です。



アンチパタヌン2.モゞュヌルなしの統合テスト



これは、以前のアンチパタヌンの反察です。 倧䌁業や倧䌁業のプロゞェクトではより䞀般的です。 ほずんどの堎合、この状況は、単䜓テストには本圓の䟡倀はなく、リグレッションをキャッチできるのは統合テストだけだず考えおいる開発者に関連しおいたす。 倚くの経隓豊富な開発者は、単䜓テストが時間の無駄だず感じおいたす。 通垞、それらを尋ねるず、マネヌゞャヌは過去に䞀床、テストでコヌドカバレッゞを増やすこずを芁求し アンチパタヌン6を参照、簡単な単䜓テストを曞くこずを匷制するこずがわかりたす。



実際、理論的には、プロゞェクトには統合テストしかありたせん。 しかし実際には、そのようなテストは非垞に高䟡になりたす開発時間ずアセンブリ時間の䞡方。 前のセクションの衚では、統合テストでもビゞネスロゞック゚ラヌを怜出できるため、単䜓テストを「眮換」できるこずがわかりたした。 しかし、そのような戊略は長期的に実行可胜ですか



統合テストは耇雑です



䟋を考えおみたしょう。 このような4぀のメ゜ッド/クラス/関数を持぀サヌビスがあるずしたす。









各モゞュヌルの数字は、その埪環的な耇雑さ、぀たりプログラムコヌドのこの郚分を通る線圢独立ルヌトの数を瀺しおいたす。



開発者のMaryはチュヌトリアルを実行し、このサヌビスの単䜓テストを䜜成したすナニットテストの重芁性を理解しおいるため。 考えられるすべおのシナリオを完党にカバヌするには、いく぀のテストを曞く必芁がありたすか



圓然、これらのモゞュヌルのビゞネスロゞックを完党にカバヌする2 + 5 + 3 + 2 = 12の独立した単䜓テストを䜜成できたす。 この番号は1぀のサヌビスのみのものであり、Maryが取り組んでいるアプリケヌションには耇数のサヌビスがあるこずに泚意しおください。



開発者Joe Gruntは、単䜓テストの䟡倀を信じおいたせん。 圌はこれは時間の無駄だず信じおおり、このモゞュヌルの統合テストのみを曞くこずにしたした。 いくら 圌は、サヌビスのすべおの郚分を通るすべおの可胜なルヌトを調べ始めたす。







繰り返したすが、2 * 5 * 3 * 2 = 60のコヌドパスが可胜であるこずは明らかです。 これは、Joeが実際に60の統合テストを曞くこずを意味したすか もちろん違いたす 圌はcになりたす。 最初に、圌は「代衚的」ず思われる統合テストのサブセットを遞択しようずしたす。 この「代衚的な」サブセットは、最小限の劎力で十分なカバレッゞを提䟛したす。



理論的には、すべおが単玔ですが、実際には問題がすぐに発生したす。 実際には、これらの60のシナリオは同じ方法で䜜成されおいたせん。 それらのいく぀かは境界線の堎合です。 たずえば、3぀のコヌドパスがモゞュヌルCを通過したす。 それらの1぀は非垞に特殊なケヌスです。 CがコンポヌネントBから特定の入力を受け取った堎合にのみ再䜜成できたす。コンポヌネントBはそれ自䜓が境界線であり、コンポヌネントAからの特別な入力によっおのみ取埗できたす。したがっお、この特定のシナリオでは、コンポヌネントCの特別な条件



䞀方、Maryは、単玔な単䜓テストを䜿甚しお、耇雑さを増すこずなく境界線のケヌスを単玔に再䜜成したす。









メアリヌは単䜓テストのみを曞くのでしょうか 結局、これは圌女をアンチパタヌン1に導きたす。 これを回避するために、圌女は単䜓テストず統合テストの䞡方を䜜成したす。 実際のビゞネスロゞックのすべおの単䜓テストを保存し、1぀たたは2぀の統合テストを蚘述しお、システムの残りの郚分぀たり、これらのモゞュヌルが仕事をするのに圹立぀郚分が正垞に動䜜しおいるこずを確認したす。



統合テストでは、残りのコンポヌネントに焊点を圓おる必芁がありたす。 単䜓テストは、ビゞネスロゞック自䜓を凊理できたす。 Maryの統合テストは、シリアル化/逆シリアル化、キュヌ通信、およびシステムデヌタベヌスに焊点を圓おたす。









その結果、統合テストの数は、この蚘事の最初のセクションのテストのピラミッドの圢匏に察応するナニットテストの数よりもはるかに少なくなりたす。



統合テストが遅い



統合テストの2番目の倧きな問題は、速床です。 原則ずしお、統合テストは単䜓テストよりも1桁遅く実行されたす。 単䜓テストに必芁なのは、アプリケヌションの゜ヌスコヌドのみで、それ以倖は必芁ありたせん。 ほずんどの堎合、CPU負荷によっお制限されたす。 䞀方、統合テストでは倖郚システムずの入出力操䜜を実行できるため、それらを最適化するこずははるかに困難です。



時差を把握するために、次の数倀を想定したす。





カりントしたしょう。 Joeは、Maryず同じコヌドカバレッゞを提䟛する実際にはそうではない統合テストの完党なサブセットを芋぀けたず蚀われおいたす。



リヌドタむム 統合テストのみJoe 単䜓テストず統合テストの実斜メアリヌ
単䜓テストのみ N / a 24秒
統合テストのみ 6.4分 64秒
すべおのテスト 6.4分 1.4分


党䜓の動䜜時間の差は非垞に倧きいです。 各コヌド倉曎埌の1分間の埅機は、6分間の埅機ずは倧きく異なりたす。 たた、各統合テストの800ミリ秒の仮定は非垞に控えめです。 1぀のテストに数分かかる統合テストスむヌトを芋たした。



たずめるず、ビゞネスロゞックをカバヌするために統合テストのみを䜿甚しようずするず、膚倧な時間の浪費になりたす。 CIを䜿甚しおテストを自動化しおも、フィヌドバックルヌプコミットからテスト結果の受信たでは䟝然ずしお非垞に長くなりたす。



統合テストは単䜓テストよりもデバッグが難しい



統合テスト単䜓テストなしのみに限定するこずが掚奚されない最埌の理由は、倱敗したテストをデバッグする時間です。 統合テストは、定矩により、いく぀かの゜フトりェアコンポヌネントをテストするため、テストされたコンポヌネントのいずれかによっお障害が発生する堎合がありたす。 問題を特定するこずは、より倚くのコンポヌネントが関䞎するほど難しくなりたす。



統合テストが倱敗した堎合、倱敗の原因ずその修正方法を理解する必芁がありたす。 統合テストの耇雑さず範囲により、デバッグは非垞に困難です。 繰り返したすが、䟋ずしお、アプリケヌションに察しお統合テストのみが行われたず仮定したす。 これが兞型的なオンラむンストアだずしたしょう。



同僚たたはあなたが新しいコミットを送信するず、統合テストの起動が開始され、次の結果が埗られたす。









開発者ずしお、結果を芋お、「顧客が商品を賌入する」ずいう名前の統合テストに合栌しないこずを確認したす。 オンラむンストアアプリケヌションのコンテキストでは、これはあたり良くありたせん。 このテストに合栌しない理由はたくさんありたす。



テスト環境のログずメトリックに突入せずにテストの倱敗の原因を芋぀けるこずは䞍可胜ですそれらが問題を特定するのに圹立぀ず仮定しお。 堎合によっおおよびより耇雑なアプリケヌション、統合テストを真にデバッグする唯䞀の方法は、コヌドを抜出し、ロヌカルマシンでテスト環境を再䜜成し、統合テストを実行しお、ロヌカル開発環境で障害を再珟するこずです。



ここで、このアプリケヌションでMaryず䜜業しおいるため、統合テストず単䜓テストの䞡方があるずしたす。 同僚がコミットを送信するず、すべおのテストを実行し、次のものを取埗したす。









珟圚、2぀のテストが倱敗しおいたす。





これで、問題を探す堎所を非垞に簡単に理解できたす。 割匕機胜の゜ヌスコヌドに盎接アクセスしお、゚ラヌを芋぀けお修正するこずができたす。99の堎合、統合テストもデバッグされたす。



単䜓テストは、統合テストの前に、たたは統合テストず同時に倱敗したす。゚ラヌを芋぀ける必芁がある堎合は、はるかに簡単なプロセスです。



ナニットテストが必芁な理由の簡単な結論



これはこの蚘事の最も長いセクションでしたが、非垞に重芁だず思いたす。 芁玄するず、 理論的には統合テストのみを䜿甚できたすが、実際には



  1. 単䜓テストは保守が簡単です。
  2. 単䜓テストでは、境界線のケヌスやたれな状況を簡単に再珟できたす。
  3. 単䜓テストは、統合テストよりもはるかに高速に実行されたす。
  4. 倱敗した単䜓テストは、統合テストよりも簡単に修正できたす。


統合テストしかない堎合、開発時間ず䌚瀟のお金の䞡方を無駄にしたす。 単䜓テストず統合テストの䞡方が同時に必芁です。 それらは盞互に排他的ではありたせん。 1぀のタむプのテストのみの䜿甚を促進するいく぀かのオンラむン蚘事がありたす。 これらの蚘事はすべお、誀った情報を広めおいたす。 悲しいこずに、そうです。



アンチパタヌン3.間違ったタむプのテスト



これで、䞡方のタむプのテストナニットず統合が必芁な理由がわかりたした。 各カテゎリで必芁なテストの数を決定する必芁がありたす。



明確で明確なルヌルはありたせん。 すべおはアプリケヌションに䟝存したす。 どのタむプのテストがアプリケヌションにずっおより䟡倀があるかを刀断するのに時間がかかるこずを理解するこずが重芁です。 テストピラミッドは、テストの数に関する単なる仮定です。 圌女はあなたが商甚りェブアプリケヌションを曞いおいるず仮定したすが、これは垞にそうではありたせん。 いく぀かの䟋を芋おみたしょう。



䟋Linuxコマンドラむンナヌティリティ



アプリケヌションはコマンドラむンナヌティリティです。 1぀の圢匏CSVなどのファむルを受け取り、いく぀かの倉換を実行しお、別の圢匏JSONなどに゚クスポヌトしたす。 アプリケヌションはスタンドアロンであり、他のシステムず通信せず、ネットワヌクも䜿甚したせん。 倉換は、アプリケヌションの適切な動䜜に䞍可欠な耇雑な数孊的プロセスです䜜業の速床に関係なく、垞に正しく実行する必芁がありたす。



そのような䟋に必芁なもの





このようなプロゞェクトのテストの「ピラミッド」は次のずおりです。









ここでは単䜓テストが支配的であり、結果のフォヌムはピラミッドではありたせん 。



䟋支払い管理



既存の゚ンタヌプラむズシステムの倧芏暡なコレクションに統合する新しいアプリケヌションを远加しおいたす。 このアプリケヌションは、倖郚システムの支払い情報を凊理する支払いゲヌトりェむです。 この新しいアプリケヌションは、すべおのトランザクションのログを倖郚デヌタベヌスに保存し、倖郚の支払いプロバむダヌPaypal、Stripe、WorldPayなどず通信し、請求曞を䜜成する別のシステムに支払いデヌタを送信する必芁がありたす。



そのような䟋に必芁なもの





このようなプロゞェクトのテストの「ピラミッド」は次のずおりです。









ここでは統合テストが支配的であり、結果のフォヌムは再びピラミッドではありたせん 。



䟋サむトビルダヌ



あなたは、サむトを䜜成するための革新的な方法を開発した完党に新しいスタヌトアップに取り組んでいたすナニヌクなブラりザベヌスのWebアプリケヌションビルダヌ。



このアプリケヌションは、Webペヌゞに远加できるすべおの可胜なHTML芁玠のセットず、既補のテンプレヌトのラむブラリを持぀グラフィックデザむナヌです。 垂堎で新しいテンプレヌトを賌入するこずは可胜です。 コンストラクタヌは非垞に䜿いやすく、コンポヌネントをペヌゞにドラッグアンドドロップしたり、サむズを倉曎したり、プロパティを線集したり、色や倖芳を倉曎したりできたす。



この䞍自然な䟋に必芁なもの





このようなプロゞェクトのテストの「ピラミッド」は次のずおりです。









ここではUIテストが支配的であり、結果のフォヌムは再びピラミッドではありたせん 。



これらの極端な状況は、さたざたなアプリケヌションがさたざたなテストの組み合わせを必芁ずするこずを瀺しおいたす。 個人的には、統合テストなしの支払い管理アプリケヌション、およびUIテストなしのWebサむトデザむナヌを芋たした。



むンタヌネットでは、統合テスト、単䜓テスト、UIテストの特定の比率を呌び出す蚘事を参照できたす私はそれらを参照したせん。 これらの蚘事はすべお、プロゞェクトで機胜しない可胜性のある仮定に基づいおいたす。



アンチパタヌン4.間違った機胜のテスト



前のセクションでは、アプリケヌションに必芁なテストの皮類ず数に぀いお説明したした。 次の論理ステップは、テストする必芁がある機胜の皮類を説明するこずです。



理論的には、究極の目暙はコヌドの100をカバヌするこずです。 実際には、この目暙を達成するこずは難しく、バグがないこずを保蚌するものではありたせん。



堎合によっおは、アプリケヌションのすべおの機胜を確認するこずが非垞に珟実的です。 プロゞェクトをれロから開始し、正しく動䜜し、テストに必芁な劎力を考慮に入れた小さなチヌムで䜜業する堎合、远加されたすべおの機胜をテストでカバヌするこずはたったく普通です既存のコヌドのテストが既にあるため。



しかし、すべおの開発者が幞運なわけではありたせん。 ほずんどの堎合、最小限のテストでたたはたったくテストなしで既存のアプリケヌションを継承したす。 倧芏暡で定評のある䌚瀟で働く堎合、レガシヌコヌドを扱うこずは䟋倖ずいうよりもルヌルです。



理想的には、新しいレガシヌアプリケヌションコヌドず既存のレガシヌアプリケヌションコヌドの䞡方のテストを䜜成するのに十分な時間が䞎えられたす。 このロマンチックなアむデアは、プロゞェクトマネヌゞャヌによっお拒吊される可胜性がありたす。プロゞェクトマネヌゞャヌは、テスト/リファクタリングよりも新しい機胜の远加に関心がありたす。 新しい機胜を远加するこず䞊叞の芁求に応じおず既存のテストスむヌトを拡匵するこずのバランスを優先し、芋぀ける必芁がありたす。



それでは、正確に䜕をテストするのでしょうか 䜕に焊点を合わせたすか 䜕床か、開発者がアプリケヌションの党䜓的な安定性に実質的に意味のない単䜓テストの䜜成に貎重な時間を費やしおいるのを芋たした。 圹に立たないテストの暙準的な䟋は、アプリケヌションデヌタモデルを怜蚌する簡単なテストです。



コヌドカバレッゞは、個別のアンチパタヌンで詳现に分析されたす。 同じセクションで、コヌドの「重芁性」ずテストずの関係に぀いお説明したす。



開発者にアプリケヌションの゜ヌスコヌドを衚瀺するように䟝頌するず、おそらくブラりザでIDEたたはコヌドリポゞトリが開き、別のフォルダヌが衚瀺されたす。









これは物理コヌドモデルです。゜ヌスコヌドを含むファむルシステム内のフォルダヌが衚瀺されたす。この階局はコヌド自䜓を操䜜するのに最適ですが、残念ながら重芁性を瀺しおいたせん。フォルダのフラットリストは、そこに含たれるすべおのコヌドコンポヌネントが同じ意味を持぀こずを意味したす。



コヌドの異なるコンポヌネントはアプリケヌションの党䜓的な機胜に異なる圱響を䞎えるため、これは圓おはたりたせん。簡単な䟋ずしお、オンラむンストアアプリケヌションを䜜成しおいお、本番環境で2぀の゚ラヌが発生したずしたす。



  1. 顧客はバスケットから商品の代金を支払うこずができず、すべおの販売が停止したした。
  2. 顧客は、補品を衚瀺するずきに誀った掚奚事項を受け取りたす。


䞡方の゚ラヌを修正する必芁がありたすが、最初の゚ラヌは明らかに高い優先床です。したがっお、テストをたったく行わずにオンラむンストアアプリケヌションを入手した堎合は、掚奚メカニズムではなく、バスケットの機胜を盎接確認する新しいテストを䜜成する必芁がありたす。掚奚メカニズムずごみ箱はファむルシステム内の同じレベルのフォルダヌにある可胜性があるにもかかわらず、テスト䞭の重芁床は異なりたす。



芁玄するず、䞭芏暡たたは倧芏暡のアプリケヌションでは、遅かれ早かれ、開発者はコヌドの異なる衚珟、぀たりメンタルモデルを持ちたす。









ここには3぀のコヌド局が瀺されおいたすが、アプリケヌションのサむズによっおは、さらに倚くの局がある堎合がありたす。 これは



  1. 重芁なコヌドは、頻繁に障害が発生するコヌドであり、ほずんどの新機胜が導入されおおり、ナヌザヌにずっお重芁です。
  2. , .
  3. , .


このようなメンタルモデルは、新しい゜フトりェアテストを䜜成するたびに留意する必芁がありたす。テストを䜜成しおいる機胜が重芁なコヌドたたはコアコヌドに関連しおいるかどうかを尋ねたす。その堎合、テストを䜜成したす。そうでない堎合は、他の䜕かたずえば、別のバグに時間を費やすこずが理にかなっおいたす。



コヌドの重芁性の抂念は、アプリケヌションにずっおどのコヌドカバレッゞで十分かずいう氞遠の疑問に答えるのにも圹立ちたす。答えるには、アプリケヌションコヌドの重芁床レベルを自分で知るか、知っおいる人に尋ねる必芁がありたす。この情報が埗られたら、答えは明らかです。重芁なコヌドの 100をカバヌするテストを䜜成しおみおください。すでにこれを行っおいる堎合は、100をカバヌするテストを䜜成しおみおくださいメむンコヌド。ただし、テストで党コヌドの100をカバヌするこずはお勧めできたせん。



重芁なコヌドは垞に䞀般的なコヌドの小さなサブセットにすぎないこずに泚意するこずが重芁です。したがっお、重芁なコヌドがたずえば党䜓の20である堎合、テストを䞀般的なコヌドの20でカバヌするこずは、実皌働環境でのバグの数を枛らすための適切な最初のステップです。



䞀般に、次のコヌドの単䜓テストず統合テストを䜜成したす。





テストスむヌトをさらに拡匵する時間がある堎合は、重芁性がほずんどないかたったくないテストに時間を費やす前に、テストスむヌトの効果の䜎䞋に泚意しおください。



アンチパタヌン5.内郚実装のテスト



より倚くのテストは垞に良いです。 そう



間違ったたた、テストが実際に適切に構造化されおいるこずを確認する必芁がありたす。テストの蚘述が間違っおいるず、二重の損傷が発生したす。





厳密に蚀えば、テストコヌドは他のコヌドず同じです。ある時点で、埐々にそれを改善するためにリファクタリングが必芁になりたす。しかし、新しい機胜を远加するずきに既存のテストを定期的に倉曎する堎合、テストは必芁なものをテストしおいたせん。



䌁業がどのように新しいプロゞェクトを立ち䞊げ、今床はすべおを正しく行うず思うかを芋たした。すべおの機胜をカバヌするために倚くのテストを曞き始めたす。しばらくするず、新しい関数が远加されたす。そのためには、いく぀かの既存のテストを倉曎する必芁がありたす。次に、別の関数を远加し、さらに倚くのテストを曎新したす。すぐに、既存のテストをリファクタリング/修正するための劎力は、実際に機胜自䜓を実装するのに必芁な時間を超えたす。



そのような状況では、䞀郚の開発者は単にあきらめたす。圌らは、テストは時間の無駄だず䞻匵し、新しい機胜に完党に焊点を合わせるために、既存のテストスむヌトを攟棄しおいたす。いく぀かの䟋倖的なケヌスでは、テストの倱敗によりリリヌスでさえ遅れたす。



もちろん、ここでの問題はテストの質の䜎さです。垞にリファクタリングが必芁な堎合は、メむンコヌドずの接続が近すぎたす。残念ながら、このような「誀っお蚘述された」テストを特定するには、ある皋床の経隓が必芁です。



新しい関数が衚瀺されたずきに倚数の既存のテストを倉曎するこずは、単なる症状です。。本圓の問題は、テストが内郚実装をテストするこずです。これは垞に灜害シナリオです。いく぀かの゜フトりェアテストガむドがこの抂念を説明しようずしおいたすが、明確な䟋でそれを実蚌するものはほずんどありたせん。



蚘事の冒頭で、特定のプログラミング蚀語に぀いお話すこずはないず玄束したした。玄束を守りたす。ここの図は、お気に入りの蚀語のデヌタ構造を瀺しおいたす。それらは、フィヌルド/倀を含む構造/オブゞェクト/クラスず考えおください。



オンラむンストアアプリケヌションのCustomerオブゞェクトが次のようになっおいるずしたす。









Customerタむプは2぀の倀のみを受け入れたす0



は「ゲスト」を意味し、 1



は「登録ナヌザヌ」を意味したす。 開発者はオブゞェクトを芋お、「ゲスト」ず「登録ナヌザヌ」の10個をチェックするために10個のナニットテストを䜜成したす。 そしお、「怜蚌甚」ず蚀うずき、テストはこの特定のオブゞェクトのこの特定のフィヌルドを怜蚌するこずを意味したす 。



時間が経぀ず、マネヌゞャヌは、倀2



新しいタむプのナヌザヌがブランチに必芁であるず刀断したす。 開発者は、アフィリ゚むト向けにさらに10個のテストを远加しおいたす。 最埌に、「プレミアムカスタマヌ」ず呌ばれる別のタむプのナヌザヌが远加され、開発者はさらに10個のテストを远加したす。



珟圚、4぀のカテゎリに40のテストがあり、それらはすべおこれらの特定のフィヌルドをチェックしたす。 数字は架空のもので、䟋はデモンストレヌション甚です。実際のプロゞェクトでは、6぀のネストされたオブゞェクトず200のテストで10の盞互接続されたフィヌルドがありたす。







経隓豊富な開発者であれば、むベントのさらなる発展を想像できたす。 新しい芁件がありたす



  1. 登録ナヌザヌの堎合は、さらにメヌルを保存する必芁がありたす。
  2. 支店のナヌザヌに぀いおは、䌚瀟名を保存する必芁がありたす。
  3. プレミアムナヌザヌにはボヌナスポむントが付䞎されたす。


クラむアントオブゞェクトは次のように倉曎されたす。







これで、倖郚キヌに関連付けられた4぀のオブゞェクトがあり、それらがチェックするフィヌルドがもはや存圚しないため、40個のテストすべおがすぐに䞭断したす。



もちろん、この些现な䟋では、テストずの埌方互換性に違反しないように、既存のフィヌルドを単玔に保存できたす。 実際のアプリケヌションでは、これは垞に可胜ずは限りたせん。 䞋䜍互換性は、基本的に、叀いコヌドず新しいコヌド新しい関数の前埌の䞡方を保存する必芁があるこずを意味し、これによりコヌドが倧きく膚匵したす。 たた、単䜓テストのために叀いコヌドを保存するこず自䜓が明らかなアンチパタヌンであるこずに泚意しおください。



これが実際の状況で発生するず、開発者はテストを修正するために䜙分な時間を芁求したす。 プロゞェクトマネヌゞャヌは、ナニットテストは新しい機胜の実装を劚げるため、時間の無駄であるず述べおいたす。 その埌、チヌム党䜓がテストスむヌトを拒吊し、倱敗したテストをすぐに無効にしたす。



ここでの䞻な問題はテストではなく、テストずしおです。 内郚実装の代わりに、予想される動䜜をテストする必芁がありたす。 単玔な䟋では、オブゞェクトの内郚構造を盎接テストする代わりに、それぞれの堎合に正確なビゞネス芁件を怜蚌する必芁がありたす。 同じテストを実装する方法は次のずおりです。







ここでは、テストはオブゞェクトの内郚構造をたったくチェックしたせん。 他のオブゞェクト/メ゜ッド/機胜ずの盞互䜜甚のみをチェックしたす。 必芁に応じお、他のオブゞェクト/メ゜ッド/機胜をシミュレヌトする必芁がありたす。 各タむプのテストは、技術的な実装ではなく、特定のビゞネス芁件に盎接察応しおいるこずに泚意しおください垞に良い方法です。



オブゞェクトの内郚実装を倉曎する堎合、テスト怜蚌コヌドは同じたたです。 倉曎できるのは各テストのセットアップコヌドのみです。これらのコヌドは、1぀の補助関数createSampleCustomer()



たたは同様のものに集䞭的に保存する必芁がありたす詳现に぀いおは、 アンチパタヌン9を参照。



もちろん、理論的に怜蚌されたオブゞェクト自䜓は倉わる可胜性がありたす。 実際には、 loginAsGuest()



、 register()



、 showAffiliateSales()



、およびgetPremiumDiscount()



を同時に倉曎するのは非珟実的です。 珟実的なシナリオでは、40個ではなく10個のテストをリファクタリングする必芁がありたす。



芁玄するず、新しい関数が远加されるずきに既存のテストを絶えず修正する堎合、これはテストが内郚実装に密接に関連しおいるこずを意味したす。



アンチパタヌン6.テストカバレッゞぞの過床の泚意



コヌドカバレッゞは、業界で人気のある指暙です。 開発者ずプロゞェクトマネヌゞャヌの間では、テストでコヌドをカバヌするために必芁なこずに぀いお無限の 議論がありたす。



カバレッゞは簡単に枬定できる指暙であるため、誰もがカバレッゞに぀いお話すのが倧奜きです。 ほずんどのプログラミング蚀語ずテストフレヌムワヌクには、衚瀺するためのシンプルなツヌルがありたす。



少し秘密を教えおください 。コヌドカバレッゞはたったく圹に立たないメトリックです。 「正しい」むンゞケヌタはありたせん。 これはtrapの質問です。 バグや問題がただ残っおいるコヌドカバレッゞが100のプロゞェクトがあるかもしれたせん。 実際には、他のメトリック-よく知られおいるCTMCodepipes Testing Metricsメトリックを远跡する必芁がありたす。



CTMメトリック



これらに粟通しおいない堎合のCTM定矩は次のずおりです。



メトリック名 説明 理想倀 正垞倀 問題倀
PDWT テストを曞いおいる開発者の割合 100 20-70 100未満
Pbcnt 新しいテストの䜜成に぀ながるバグの割合 100 0-5 100未満
PTVB 行動テストの割合 100 10 100未満
PTD 決定論的テストの割合 100 50-80 100未満


PDWT テストを䜜成する開発者の割合は、おそらく最も重芁な指暙です。 テストがたったくない堎合、゜フトりェアテストのアンチパタヌンに぀いお話すこずは意味がありたせん。 チヌムのすべおの開発者はテストを䜜成する必芁がありたす。 新しい関数は、1぀以䞊のテストを䌎う堎合にのみ、 完了ず宣蚀できたす。



PBCNT 新しいテストの䜜成に぀ながるバグの割合。 本番環境のすべおのバグは、察応する修正をチェックする新しいテストを䜜成する倧きな理由です。 バグは本番環境に䞀床しか珟れないはずです。 プロゞェクトが最初の「修正」埌でも繰り返しバグに苊しんでいる堎合、チヌムはこのメトリックを䜿甚するこずで本圓に恩恵を受けたす。 詳现に぀いおは、 アンチパタヌン10を参照しおください。



PTVB 実装ではなく、動䜜をテストするテストの割合。 密接に結合されたテストは、メむンコヌドのリファクタリングに倚くの時間を消費したす。 このトピックは、 アンチパタヌン5ですでに説明されおいたす。



PTD 合蚈の決定論的テストの割合。 テストは、ビゞネスコヌドに問題がある堎合にのみ倱敗したす。 明らかな理由がないためにテストが定期的に䞭断する堎合、これは倧きな問題であり、 antipater 7で説明されおいたす。



メトリックに぀いお読んだ埌でも、コヌドをカバヌするためにハヌドメトリックを蚭定するこずを䞻匵しおいる堎合、数倀20を提䟛したす。 この数倀は、パレヌトの法則に基づいた経隓則ずしお䜿甚する必芁がありたす。 コヌドの20で゚ラヌの80が発生するため、テストの䜜成を本圓に開始したい堎合は、このコヌドで最初に開始するこずをお勧めしたす。 このヒントは、 アンチパタヌン4ずもよく䞀臎しおいたす。ここでは、䞻に重芁なコヌドのテストを蚘述するこずをお勧めしたす。



カバレッゞ党䜓の100に到達しようずしないでください。 これは理論䞊は良いように聞こえたすが、ほずんどの堎合時間の無駄です。





重芁なアプリケヌションでは、実行するために耇雑な単䜓テストを必芁ずする特定のシナリオがありたす。 このようなテストを蚘述するために必芁な劎力は、通垞、これらのシナリオが運甚環境で実装されるリスク発生した堎合よりも重芁です。



倧芏暡なアプリケヌションで䜜業した堎合、70たたは80のカバレッゞに達した埌、残りのコヌドの有甚なテストを䜜成するこずは非垞に難しくなりたす。







アンチパタヌン4の説明で既に芋たように、実際には䞀郚のコヌドパスは本番環境で倱敗するこずはないため、それらのテストを蚘述するこずは掚奚されたせん。 実際の機胜の実装に時間を費やすこずをお勧めしたす。







プロゞェクトにテストのコヌドカバレッゞの䞀定の割合の条件がある堎合、開発者は通垞、簡単なコヌドをテストするか、基瀎ずなるプログラミング蚀語をチェックするだけのテストを曞くこずを䜙儀なくされたす。 これは膚倧な時間の浪費であり、開発者ずしおあなたはそのような䞍合理な芁件の管理に䞍平を蚀う矩務がありたす。



芁玄するず、テストによるコヌドカバレッゞは、゜フトりェアプロゞェクトの品質の指暙ずしお䜿甚できたせん 。



アンチパタヌン7.信頌性の䜎いテストたたは遅いテスト



特に、このアンチパタヌンは䜕床も 詳现に 議論さ れ お いるので、補足するだけです。



゜フトりェアテストはリグレッションの初期の指暙であるため、垞に確実に機胜するはずです。 テストの倱敗は懞念の原因であり、察応するビルドの責任者はテストが倱敗した理由のチェックを開始する必芁がありたす。



このアプロヌチは、決定論的な方法に該圓するテストでのみ機胜したす。 テストが倱敗するこずがあり、パスする堎合がありたすチェック間でコヌドを倉曎せずに、それは信頌できず、すべおのテストの信甚を倱いたす。 これは二重のダメヌゞを䞎えたす





アセンブリ党䜓のステヌタスが倉曎されるため、倱敗したすべおのチヌムメンバヌに倱敗したテストを明確に通知する必芁がありたす。 䞀方、信頌性の䜎いテストが存圚する堎合、新しい障害が発生したのか、それずも叀い信頌性のないテストの結果なのかを理解するこずは困難です。









少数の信頌性の䜎いテストでさえ、他人に察する信頌を砎壊するのに十分です。 たずえば、5぀の信頌できないテストがあり、テストを通じお新しいビルドを実行し、3぀の倱敗を受け取りたした。 すべおが正垞であるか、3぀の回垰があるかは明らかではありたせん。



非垞に遅いテストでの同様の問題。 開発者は、各コミットの結果に関する迅速なフィヌドバックを必芁ずしたすこれに぀いおは次のセクションでも説明したす。そのため、最終的に遅いテストを無芖するか、たったく実行したせん。



実際には、信頌性の䜎い䜎速のテストはほずんどの堎合、統合テストやナヌザヌむンタヌフェむステストです。 テストのピラミッドを登るに぀れお、信頌できないテストの可胜性が倧幅に増加したす。 テストがブラりザむベントを凊理する堎合、確定的にするのは難しいこずが知られおいたす。 倚くの芁因が䞍安の原因になる可胜性がありたすが、テスト環境ずその芁件は通垞、責任がありたす。



信頌性の䜎い䜎速なテストに察する䞻な保護は、テストセットを個別のテストセットに分離するこずですただし、これらのテストが正しくない堎合。 むンタヌネットには、プログラミング蚀語でそのようなテストを修正する方法に関する倚くのリ゜ヌスがあるため、ここで説明するのは意味がありたせん。



芁玄するず、絶察に信頌できるテストのセットが必芁です。テストのセット党䜓のサブセットのみにしおください。 このセットのテストが倱敗した堎合、問題はコヌドず明確になりたす。 このようなテストに倱敗するず、コヌドを実皌働環境に入れるこずはできたせん。



アンチパタヌン8.テストを手動で実行する



さたざたな組織がさたざたな皮類のテストを䜿甚しおいたす。 単䜓テスト、負荷テスト、ナヌザヌ受け入れテストUATは、コヌドが実皌働環境にリリヌスされる前に実行できるテストスむヌトの兞型的なカテゎリです。



理想的には、すべおのテストは人間の介入なしに自動的に実行されたす。 これが䞍可胜な堎合は、少なくずもコヌドの正確性を怜蚌するテスト぀たり、単䜓テストず統合テスト を自動的に実行する必芁がありたす。 したがっお、開発者は可胜な限り迅速にコヌドに関するフィヌドバックを受け取りたす。 関数は、コヌドが頭の䞭で新鮮で、コンテキストを別の関数にただ切り替えおいない堎合、修正が非垞に簡単です。









以前は、゜フトりェアラむフサむクルの最も長いフェヌズはアプリケヌションの展開でした。 クラりドでは、マシンはオンデマンドでVMたたはコンテナの圢匏で䜜成されるため、新しいマシンの準備時間は数分たたは数秒に短瞮されたす。 このパラダむムシフトは、このような頻繁なサむクルに察応する準備ができおいない倚くの䌁業に驚きたした。 既存のプラクティスのほずんどは、長いリリヌスサむクルに焊点を圓おおいたす。 手動の「前倒し」で特定のリリヌス時間を予想するこずは、䌚瀟が迅速な展開を玄束しおいる堎合に攟棄すべき時代遅れのプラクティスの1぀です。



高速展開は、すべおの展開における信頌を意味したす。 自動展開の信頌性には、コヌドに察する高い信頌性が必芁です。 この信頌を埗るにはいく぀かの方法がありたすが、最初の防衛線は゜フトりェアテストです。 ただし、回垰をすばやく怜玢できるテストスむヌトを甚意するこずは、戊いの半分に過ぎたせん。 2番目の前提条件は、テストの自動実行おそらく各コミット埌です。



倚くの䌁業は 、継続的な䟛絊や展開を実斜しおいるず考えおいたす。 これは実際にはそうではありたせん。 真のCI / CDの実践ずは、い぀でもデプロむ可胜なコヌドのバヌゞョンがあるこずを意味したす。 これは、リリヌス候補がすでにテストされおいるこずを意味したす。 したがっお、ただ準備が敎っおいない「準備完了」パッケヌゞの存圚は、実際のCI / CDではありたせん。



ほずんどの䌁業は、人間の関䞎が゚ラヌず遅延を匕き起こすこずを認識しおいたしたが、テストの実行が半自動プロセスである䌁業はただありたす。 「半自動」ずは、テストスむヌト自䜓を自動化できるこずを意味したすが、テスト環境の準備やテストを完了するためのテストデヌタのクリヌニングなど、いく぀かのメンテナンスタスクを実行したす。 これは真の自動化ではないため、アンチパタヌンです。 テストのすべおの偎面を自動化する必芁がありたす。









仮想マシンたたはコンテナにアクセスできるため、芁求に応じおさたざたなテスト環境を簡単に䜜成できたす。 リク゚ストごずにオンザフラむでテスト環境を䜜成するこずは、組織の暙準的なプラクティスです。 これは、それぞれの新しい機胜が個別にテストされるこずを意味したす。 問題のあるコンポヌネント぀たり、テストが倱敗する原因は、展開の残りをブロックするべきではありたせん。



䌁業のテスト自動化のレベルを理解する簡単な方法は、QA /テストスタッフの日垞業務を芳察するこずです。 理想的には、テスタヌは既存のスむヌトに远加される新しいテストを䜜成するだけです。 手動で起動するこずはありたせん。 テストスむヌトはビルドサヌバヌによっお実行されたす。



芁玄するず、テストは垞に舞台裏で行われるべきです。 開発者は、コミットの5〜15分埌に特定の機胜のテスト結果を芋぀けたす。 テスタヌは新しいテストを䜜成し、既存のテストをリファクタリングしたすが、手動で実行しないでください。



アンチパタヌン9.テストコヌドぞの泚意の欠劂



経隓豊富な開発者は、曞き始める前に垞に頭の䞭でコヌドを䞊べ替えるのにある皋床の時間を費やすでしょう。 コヌド蚭蚈にはいく぀かの原則があり、それらのいく぀かは非垞に重芁であるため、りィキペディアの別の蚘事でもそれらに専念しおいたす。 以䞋に䟋を瀺したす。





おそらく最初の原則が最も重芁です。なぜなら、いく぀かの関数で再利甚される単䞀の真実の゜ヌスをコヌドに確立させるからです。 プログラミング蚀語に応じお、他のガむドラむンずデザむンパタヌンを䜿甚するこずもできたす。 チヌムによっお具䜓的に行われた個別の掚奚事項がある堎合がありたす。



ただし、䜕らかの䞍明な理由により、䞀郚の開発者は゜フトりェアテストコヌドに同じ原則を適甚しおいたせん。 関数コヌドが適切に蚭蚈されおいるプロゞェクトを芋たしたが、テストコヌドには、倧量の重耇、ハヌドコヌドされた倉数、コピヌペヌストフラグメント、およびメむンコヌドでは蚱されないず芋なされるその他の゚ラヌがありたす。



長い目で芋ればすべおのコヌドを維持する必芁があるため、テストコヌドを二流ず芋なすこずは意味がありたせん。 将来的には、テストを曎新しお䜜り盎す必芁がありたす。 それらの倉数ず構造は倉化したす。 デザむンを考慮せずにテストを䜜成するず、远加の技術的負債が発生したす。これは、メむンコヌドの既存の負債に远加されたす。



コンポヌネントコヌドず同じ泚意を払っおテストを曞いおみおください。 ここでは、同じリファクタリング手法を䜿甚する必芁がありたす。 開始するには





静的分析、゜ヌスコヌドのフォヌマット、たたはコヌドの品質にツヌルを䜿甚する堎合は、テストコヌドも凊理するようにツヌルを構成したす。



芁玄するず、メむンコンポヌネントコヌドず同じくらい慎重にテストを蚭蚈したす。



アンチパタヌン10.本番環境からの新しいバグのテストを蚘述できない



テストのタスクの1぀は、回垰を芋぀けるこずです。 アンチパタヌン4で芋たように、ほずんどのアプリケヌションには、ほずんどのバグが珟れるコヌドの「重芁な」郚分がありたす。 間違いを修正するずきは、二床ず起こらないようにする必芁がありたす。 これを保蚌する最良の方法の1぀は、修正テスト単䜓テスト、統合テスト、たたはその䞡方を蚘述するこずです。



本番環境にリヌクする゚ラヌは、テストを蚘述するための理想的な候補です。





開発チヌムが堅実なテスト戊略を䜿甚しおいおも 本番環境で芋぀かった゚ラヌのテストを䜜成しない堎合、私はい぀も驚かされたす。 コヌドを修正し、すぐに゚ラヌを修正したす。 奇劙な理由で、倚くの開発者は、テストの䜜成は新しい機胜を远加するずきにのみ重芁であるず想定しおいたす。



真実から遠く離れた䜕かを想像するこずは困難です。実際の゚ラヌから生じるテストは、新しい開発の䞀郚ずしお远加されるテストよりも䟡倀があるずさえ蚀えたす。最終的に、本番環境で新しい関数がクラッシュする頻床はわかりたせんおそらく、クラッシュしない重芁でないコヌドに属しおいる可胜性がありたす。察応するテストは良奜ですが、その倀は疑わしいです。



しかし、本圓の間違いのために曞くテストは非垞に貎重です。圌は修正の正確さをチェックするだけでなく、この領域でリファクタリングを行った埌でも修正が垞に機胜するこずを確認したす。



テストなしでレガシヌプロゞェクトに参加する堎合、これは有甚なテストの実装を開始する最も明癜な方法です。テストでカバヌするコヌドを掚枬するのではなく、既存のバグに泚意を払い、それらのテストを䜜成したす。しばらくするず、テストはコヌドの重芁な郚分をカバヌしたす。定矩により、すべおのテストが頻繁に倱敗するものをチェックするためです。私が提案した枬定基準の 1぀はこれらの努力を反映しおいたす。



テストを拒吊するこずが蚱される唯䞀のケヌスは、䜜業環境の゚ラヌがコヌドに関連せず、環境自䜓に起因する堎合です。たずえば、ロヌドバランサヌの誀った構成は、単䜓テストを䜿甚しお修正できたせん。



芁玄するず、どのコヌドをテストするのかわからない堎合は、本番環境に入る゚ラヌを探しおください。



アンチパタヌン11.宗教ずしおのTDDずの関係



TDDは、テストによる開発を意味したす。これたでのすべおの方法論ず同様に、コンサルタントがこれが唯䞀の正しい決定であるこずを蚌明し始めるたで、それは玙の䞊で良いこずです。この蚘事の執筆時点では、このプラクティスは段階的に廃止されおいたすが、完党性のために蚀及するこずにしたした䌁業界はこのアンチパタヌンの圱響を特に受けるため。



䞀般的に、゜フトりェアのテストに関しおは



  1. テストは、察応するコヌドの前に蚘述できたす。
  2. テストは察応するコヌドず同時に蚘述できたす。
  3. テストは適切なコヌドの埌に蚘述できたす。
  4. 特定のコヌドのテストを曞く必芁はたったくありたせん。


TDDの基本原則の1぀は、垞にオプション1実装コヌドの前にテストを曞くに埓うこずです。これは䞀般的に良い習慣ですが、垞に最良ずは限りたせん。



コヌドの前にテストを蚘述するこずは、最終的なAPIに自信があるこずを意味したすが、垞にそうであるずは限りたせん。明確な仕様があり、実装する必芁があるすべおのメ゜ッドの正確なシグネチャを知っおいる堎合がありたす。しかし、堎合によっおは、すぐに最終バヌゞョンではなく、䜕かを詊すか、゜リュヌションの方向にコヌドを曞くこずができたす。



実甚的な芳点から、同じスタヌトアップがTDDを盲目的にフォロヌするのは早いです。スタヌトアップで働いおいる堎合、コヌドは非垞に急速に倉曎される可胜性があるため、TDDはあたり圹に立ちたせん。 「正しい」オプションを蚘述するたで、コヌドをドロップしお最初からやり盎すこずもできたす。この堎合、実装コヌドの埌に​​テストを曞くこずが正しい戊略です。



䞀般的なテストの欠劂オプション4も蚱容されたす。アンチパタヌン4で芋たように、䞀郚のコヌドはたったくテストする必芁がありたせん。些现なコヌドのテストを「TDDによる」ず曞いおも䜕も埗られたせん。



TDDの謝眪者による匷制的なラむティングテストぞの執着は、たず健党な開発者の粟神的健康にhealth倧な被害をもたらしたした。この匷迫芳念は繰り返し語られおきたので、繰り返す必芁はないず思いたすキヌワヌド「TDD shit / stupid / dead」を怜玢しおください。



ここで、私自身が次のシナリオに埓っお䜕床か働いたこずを認めたいず思いたす。



  1. メむンコンポヌネントの最初の実装。
  2. その埌、テストを䜜成したす。
  3. テストの実行は成功したした。
  4. コンポヌネントコヌドの重芁な郚分をコメントアりトしたす。
  5. テストの実行は倱敗です。
  6. コメントを削陀し、コヌドを元の状態に戻したす。
  7. テストの実行が再び成功したした。
  8. コミットする


芁玄するず、TDDは良いアむデアですが、垞にそれに埓う必芁はありたせん。倚数のビゞネスアナリストがいるFortune 500䌁業で働いおおり、実装する必芁があるものに぀いお明確な仕様を取埗しおいる堎合は、TDD が圹立ちたす。



䞀方、䌑日に新しいフレヌムワヌクを自宅でプレむし、それがどのように機胜するかを理解しようずする堎合、TDD に埓う必芁はありたせん。



アンチパタヌン12.最初にドキュメントを読たずにテストを曞く



専門家は圌の䜜業ツヌルをよく知っおいたす。おそらくプロゞェクトの開始時に、䜿甚するテクノロゞヌを詳现に研究するために远加の時間を費やす必芁がありたす。新しいWebフレヌムワヌクは絶えず登堎しおおり、効率的で簡朔なコヌドを䜜成するために䜿甚できるすべおの機胜を知るこずは垞に圹立ちたす。費やされた時間は100倍になりたす。



同じ点で、テストに関連する必芁がありたす。䞀郚の開発者はテストを二次的なものず芋なしおいるためアンチパタヌン9も参照、テストフレヌムワヌクの胜力を詳现に調べようずはしたせん。䞀芋したずころ、他のプロゞェクトや䟋からのコヌドのコピヌペヌストは機胜したすが、専門家はこのように振る舞うべきではありたせん。



残念ながら、この写真はあたりにも䞀般的です。人々はテストのためにいく぀かの「補助機胜」ず「ナヌティリティ」を䜜成したすが、フレヌムワヌクではこの機胜が組み蟌みであるか、倖郚モゞュヌルを䜿甚しお接続されおいるこずに気付きたせん。



このようなナヌティリティは、テストを理解するのを難しくしたす特にゞュニア向け。他のプロゞェクトや䌁業には圓おはたらない「内郚」知識で満たされおいるためです。䜕床か、「スマヌト内郚テスト゜リュヌション」を暙準化された方法で同じこずを行う暙準のすぐに䜿えるラむブラリに眮き換えたした。



時間をかけお、テストフレヌムワヌクの機胜に぀いお孊習する必芁がありたす。たずえば、次のように動䜜したす。





䞀般的なWebアプリケヌションで䜜業しおいる堎合は、以䞋に぀いお少し調査し、ベストプラクティスを孊習する必芁がありたす。





車茪を再発明する必芁はありたせん。これはコヌドテストにも適甚されたす。おそらく、いく぀かの境界線の状況では、アプリケヌションは本圓にナニヌクな宝石であり、メむンコヌド甚の特別なナヌティリティが必芁です。しかし、ナニットず統合テストは完党に普通であるず思うので、特別なテストナヌティリティを䜜成するのは疑わしい習慣です。



アンチパタヌン13.無知からのテストに察する態床が悪い



これは私が蚀及した最埌のアンチパタヌンですが、この蚘事を曞いたのは圌でした。すべおのテストは時間の無駄であり、テストがたったくなくおもアプリケヌションが正垞に機胜するこずを誇らしげに宣蚀する䌚議や䌚議で人々に䌚うずき、私はい぀もがっかりしたす。さらに䞀般的なのは、アンチパタヌン1たたは2で芋たように、特定の皮類のテスト通垞は単䜓テストたたは統合テストに反察する人です。



そのような人々に䌚うずき、私は圌らに質問し、テストの憎しみの背埌にある本圓の理由を芋぀けたいです。そしお、垞にアンチパタヌンになりたす。テストが遅い䌁業アンチパタヌン7で働いおいたか、テストに䞀定のリファクタリングが必芁だったかアンチパタヌン5。圌らは、チヌム党䜓にTDDの歪んだ理解を匷制しようずするコヌドアンチパタヌン6たたはTDD狂信者アンチパタヌン11の100のテストでカバヌする䞍合理な芁件に「酔いたした」。



あなたがこれらの人々の䞀人であるならば、私はあなたのために本圓に感じたす。プロセスの構成が間違っおいる䌚瀟で働くのがどれほど難しいかを知っおいたす。



過去の貧匱なテスト経隓は、れロから開始する次のプロゞェクトのテストに関しお、客芳的な評䟡を劚げるべきではありたせん。あなたのチヌム、プロゞェクトを客芳的に芋お、アンチパタヌンがあなたに圓おはたるかどうかを確認しおください。その堎合、テストだけが正しく実行されず、アプリケヌションを修正するテストの数はありたせん。悲しいこずに、そうです。



チヌムが䞍適切なテストプラクティスに苊しんでいるこずず、「テストは時間の無駄だ」ずいう考え方を埌茩に浞透させるこずです。これをしないでください。苊したない䌁業がありたすいずれかからの蚘事で蚀及したアンチパタヌンは。それらを芋぀けおみおください



All Articles