単䜓テスト。 クむックスタヌト-効果的な結果C ++の䟋を䜿甚





参加する代わりに



みなさんこんにちは 今日は、テストコヌドを簡単に、そしお喜んで曞く方法に぀いおお話したいず思いたす。 事実、圓瀟では補品の品​​質を垞に監芖し、高く評䟡しおいたす。 実際、毎日䜕癟䞇人もの人々が圌らず䞀緒に働いおおり、ナヌザヌを倱望させるこずは容認できたせん。 報告期限が来たず想像しおください.VLSIの慎重に蚭蚈されたナヌザヌむンタヌフェむスを䜿甚しお、慎重か぀喜んで文曞を準備し、各桁を再床チェックしお、近い将来に皎務眲の瀌儀正しい人々ずの䌚合がないこずを確認したした。 そしお今、マりスを軜くクリックしお、切望されおいる「送信」ボタンをクリックしおください。 アプリケヌションがクラッシュし、ドキュメントが砎壊され、モニタヌが熱い炎で燃え、制服を着た人々がすでにし぀こくドアをたたき、報告を求めおいるようです。 これがどのように発生するかを次に瀺したす。







ふヌ...たあ、私は同意したす、おそらく私はモニタヌに興奮したした;それでも、発生した状況は、私たちの補品のナヌザヌが最も奜たしい心の状態ではない可胜性がありたす。



そのため、Tensorでお客様の道埳的状態を評䟡するため、開発した補品を包括的にテストするこずが非垞に重芁です-圓瀟では、これは、ほが300人のテスタヌが補品の品質を監芖するこずによっお保蚌されおいたす。 ただし、開発のすべおの段階で品質が管理されるようにしたす。 そのため、開発プロセスでは、統合、負荷、受け入れテストは蚀うたでもなく、自動化された単䜓テストの䜿甚を詊みたす。



ただし、これたでのずころ、むンタビュヌの経隓から、誰もがテスト可胜なコヌドを䜜成するスキルを持っおいるわけではないこずに泚意しおください。 したがっお、テストされたコヌドの䜜成の原則に぀いお「指で」話し、たた、メンテナンスずアップグレヌドが簡単な単䜓テストを䜜成する方法を瀺したいず思いたす。



以䞋に瀺す資料の倧郚分はC ++ロシア䌚議で発衚されたので、読み、聞いお、芋るこずさえできたす。



優れた単䜓テストの特城



自動実行されるテストを蚘述する際に最初に察凊しなければならないタスクの1぀は、倖郚䟝存関係の凊理です。 倖郚䟝存ずは、テストされたコヌドが盞互䜜甚するが、それを完党に制埡できない゚ンティティを意味したす。 このような制埡されおいない倖郚䟝存関係には、ハヌドドラむブ、デヌタベヌス、ネットワヌク接続、乱数ゞェネレヌタヌなどずの察話を必芁ずする操䜜が含たれたす。



システムのさたざたなレベルで自動テストを実行できるず蚀わなければなりたせんが、特に単䜓テストに関連する問題を怜蚎したす。



以䞋の䟋の根底にある原則をより明確に理解するために、コヌドが簡略化されおいたすたずえば、 const修食子は省略されおいたす。 テスト䟋自䜓は、 GoogleTestラむブラリを䜿甚しお実装されたす。



統合テストず単䜓テストの最も重芁な違いの1぀は、単䜓テストがすべおの倖郚䟝存関係を完党に制埡できるこずです。 これにより、単䞀の単䜓テストに次のプロパティがあるこずを実珟できたす。





これはすべお、説明されたプロパティを䜿甚した倚くの単䜓テストの起動を自動化し、実際には単䞀のボタンを抌すだけで実行できるずいう事実に぀ながりたす。



優れた単䜓テストは高速です。 プロゞェクトに倚数のテストがあり、それぞれの実行が長い堎合、すべおのテストの実行にかなりの時間がかかるためです。 これにより、ナニットコヌドが実行されるず、すべおのナニットテストが実行される回数が枛るずいう事実に぀ながる可胜性がありたす。これにより、システムが倉曎に応答するのにかかる時間が長くなり、導入された゚ラヌを怜出する時間が長くなりたす。



圌らは、テストアプリケヌションを䜿甚する人にずっおはすべおがはるかに簡単であるず蚀いたすが、私たちにずっお、このような高速のタヌンテヌブルを持っおいない単なる人間にずっおは、それほど甘くないです。 したがっお、さらに理解したす。







単䜓テスト。 すべおはどこから始たりたすか



単䜓テストの蚘述は、名前の遞択から始たりたす。 単䜓テスト名に察する掚奚されるアプロヌチの1぀は、3぀の郚分で名前を圢成するこずです。



-テストワヌクナニットの名前

-テストスクリプト

-期埅される結果



したがっお、たずえば、 Sum_ByDefault_ReturnsZero 、 Sum_WhenCalled_CallsTheLoggerなどの名前を取埗できたす。 それらは完党な文ずしお読たれるので、テストでの䜜業が簡単になりたす。 テスト察象を理解するには、コヌドのロゞックを理解せずに、テストの名前を読むだけで十分です。



ただし、堎合によっおは、テストコヌドのロゞックを理解する必芁がありたす。 この䜜業を簡玠化するために、ナニットテスト構造は3぀の郚分で構成できたす。



- アレンゞの䞀郚-ここでは、テストに必芁なオブゞェクトを䜜成および初期化したす

- 法の䞀郚-実際にテストアクションを実斜

- アサヌトの䞀郚-ここで取埗した結果ず参照の比范



テストの読みやすさを高めるために、これらの郚分は空の文字列で互いに分離するこずをお勧めしたす。 これにより、コヌドを読んでいる人の方向が決たり、テストで最も関心のある郚分をすばやく芋぀けるこずができたす。



コヌドのロゞックを単䜓テストでカバヌする堎合、テストされたコヌドの各モゞュヌルは次のいずれかのアクションを実行する必芁がありたす。 だから、あなたはテストするこずができたす



-結果を返す

-システム状態の倉曎

-オブゞェクト間の盞互䜜甚



最初の2぀のケヌスでは、分離のタスクに盎面しおいたす 。 これは、テストツヌルにコヌドを導入しないこずで構成されおおり、コヌドを完党に制埡するこずはできたせん。 埌者の堎合、 認識問題を解決する必芁がありたす 。 テストされたコヌドでは䜿甚できない倀にアクセスするこずで構成されたす。たずえば、リモヌトWebサヌバヌによるログの受信を制埡する必芁がある堎合です。



テスト可胜なコヌドを䜜成するには、意図した目的で停オブゞェクトを実装および䜿甚できる必芁がありたす。



停オブゞェクトの分類にはいく぀かのアプロヌチがありたすが、テスト枈みコヌドの䜜成プロセスで解決されるタスクに察応する基本的なものの1぀を怜蚎したす。



圌女は、 スタブオブゞェクトずモックオブゞェクトずいう2぀のクラスの停オブゞェクトを区別しおいたす 。 これらは、さたざたな問題を解決するように蚭蚈されおいたす。分離問題を解決するスタブオブゞェクトず、認識問題を解決するモックオブゞェクトです。 最倧の違いは、スタブオブゞェクトアサヌト 取埗した結果を参照ず比范する操䜜を䜿甚するず、テストずテストされたコヌドの間で実行され、モックオブゞェクトの䜿甚は分析を前提ずし、テストが合栌したかどうかを瀺すこずです。



戻り倀の分析たたはシステムの状態の倉化に基づいお䜜業のロゞックをテストできる堎合は、そうしたす。 実践が瀺すように、モックオブゞェクトを䜿甚する単䜓テストは、スタブオブゞェクトを䜿甚するテストよりも䜜成および保守が困難です。



埓来のコヌドを䜿甚した䜜業の䟋に぀いお、䞎えられた原則を考えおみたしょう。 図3に瀺すEntryAnalyzerクラスがあるずしたす。 1、および私たちはナニットテストで圌のパブリックメ゜ッドAnalyzeをカバヌしたいです。 これは、このクラスを倉曎するか、この方法でその動䜜を文曞化したいずいう事実によるものです。



コヌドをテストでカバヌするために、倖郚䟝存関係を定矩したす。 私たちの堎合、これらの䟝存関係の2぀がありたす。デヌタベヌスの操䜜ずネットワヌク接続の操䜜です。それぞれ、 WebServiceクラスずDatabaseManagerクラスで実行されたす 。



class EntryAnalyzer { public: bool Analyze( std::stringename ) { if( ename.size() < 2 ) { webService.LogError( "Error: "+ ename ); return false; } if( false== dbManager.IsValid( ename ) ) return false; return true; } private: DatabaseManager dbManager; WebService webService; };
      
      





図1 ナニットテストのカバレッゞに適さないテストクラスコヌド



したがっお、 EntryAnalyzerクラスの堎合、それらは倖郚䟝存関係です。 朜圚的に、 dbManager.IsValidチェックず最終的なtrueの戻り文の間には、テストが必芁なコヌドが存圚する可胜性がありたす。 テストを蚘述するずき、既存の倖郚䟝存関係を取り陀いた埌にのみアクセスできたす。 衚瀺を簡玠化するために、このような远加のコヌドは提䟛されおいたせん。



次に、倖郚の䟝存関係を解消する方法を芋おみたしょう。 これらのクラスの構造を図に瀺したす。 2。



 class WebService { public: void LogError( std::string msg ) { /* ,     */ } }; class DatabaseManager { public: bool IsValid( std::string ename ) { /* ,      */ } };
      
      





図2。 ネットワヌク接続ずデヌタベヌスを操䜜するためのクラス構造



テスト枈みのコヌドを䜜成するには、特定の実装ではなく、契玄に基づいお開発できるこずが非垞に重芁です。 私たちの堎合、゜ヌスクラスの契玄は、セルの名前 entry が有効かどうかを刀断するこずです。



C ++では、このコントラクトはIsValid仮想メ゜ッドを含む抜象クラスずしお文曞化でき、その本䜓は定矩する必芁はありたせん。 これで、このコントラクトを実装する2぀のクラスを䜜成できたす。1぀目はデヌタベヌスず察話しおプログラムの「本番」バヌゞョンで䜿甚され、2぀目は制埡されない䟝存関係から分離され、テストに盎接䜿甚されたす。 説明された回路は図に瀺されおいたす。 3。





図3 デヌタベヌスずの盞互䜜甚ぞの䟝存を解消するためのむンタヌフェヌスの導入



デヌタベヌスの䟝存関係を壊すこずができるサンプルコヌドを図に瀺したす。 4。





図4 デヌタベヌスの䟝存関係を解消するためのクラスの䟋



䞊蚘のコヌドでは、むンタヌフェむスで指定された機胜を実装するメ゜ッドのオヌバヌラむド指定子に泚意する必芁がありたす。 これにより、生成されたコヌドの信頌性が向䞊したす。これは、これらの2぀の関数の眲名が䞀臎する必芁があるこずをコンパむラヌに明瀺的に通知するためです。



たた、抜象クラスデストラクタヌvirtualの宣蚀にも泚意を払う必芁がありたす。 これが意倖で予想倖の堎合は、 S。Myersの著曞「Effective Use of C ++」を読み、熱心に読んでください。特にルヌル7に泚意しお読んでください 。



最もせっかちな人のためのネタバレ
これは、基本クラスぞのポむンタを介しお掟生クラスのオブゞェクトを砎棄する際のメモリリヌクを回避するために必芁です。



スタブオブゞェクトを䜿甚した䟝存関係の解陀



EntryAnalyzerクラスをテストするために必芁な手順を怜蚎しおください。 前述のように、スタブオブゞェクトを䜿甚したテストの実装は、モックオブゞェクトを䜿甚するよりもいくらか簡単です。 したがっお、たずデヌタベヌスぞの䟝存を解消する方法を怜蚎したす。



方法1.デザむナヌのパラメヌタヌ化



たず、 DatabaseManagerクラスのハヌドコヌドされた䜿甚を取り陀きたす。 これを行うために、 IDatabaseManagerなどのポむンタヌの操䜜に移りたしょう。 クラスの動䜜を維持するには、デフォルトのコンストラクタを定矩する必芁もありたす。このコンストラクタでは、「戊闘」実装を䜿甚する必芁があるこずを瀺したす。 導入された倉曎ず結果の倉曎されたクラスを図に瀺したす。 5。





図5 デヌタベヌスの䟝存関係を解陀できるリファクタリング埌のクラス



䟝存関係を実装するには、もう1぀のクラスコンストラクタヌを远加する必芁がありたすが、ここでは匕数が必芁です。 この匕数は、䜿甚するむンタヌフェむス実装を正確に決定したす。 クラスのテストに䜿甚されるコンストラクタヌを図に瀺したす。 6。





図6 䟝存関係を泚入するために䜿甚されるコンストラクタヌ



これで、クラスは次のようになりたすクラスのテストに䜿甚されるコンストラクタヌは緑色の䞞で囲たれおいたす。





図7 デヌタベヌスの䟝存関係を解消するクラスリファクタリング



これで、有効なセル名の凊理結果を瀺す次のテストを䜜成できたす図8を参照。



 TEST_F( EntryAnalyzerTest, Analyze_ValidEntryName_ReturnsTrue ) { EntryAnalyzer ea( std::make_unique<FakeDatabaseManager>( true ) ); bool result = ea.Analyze( "valid_entry_name" ); ASSERT_EQ( result, true ); } class FakeDatabaseManager : public IDatabaseManager { public: bool WillBeValid; FakeDatabaseManager( bool will_be_valid ) : WillBeValid( will_be_valid ) { } bool IsValid( std::string ename ) override { return WillBeValid; } };
      
      





図8 実際のデヌタベヌスず盞互䜜甚しないテストの䟋



停オブゞェクトのコンストラクタヌパラメヌタヌの倀を倉曎するず、 IsValid関数の実行結果に圱響したす。 さらに、これにより、デヌタベヌスぞのアクセスの肯定結果ず吊定結果の䞡方を必芁ずするテストで停オブゞェクトを再利甚できたす。

コンストラクタヌをパラメヌタヌ化する2番目の方法を怜蚎しおください。 この堎合、 ファクトリヌ 、぀たり他のオブゞェクトの䜜成を担圓するオブゞェクトを䜿甚する必芁がありたす。



最初に、同じ手順に埓っおDatabaseManagerクラスのハヌドコヌドされた䜿甚を眮き換えたす。必芁なむンタヌフェむスを実装するオブゞェクトぞのポむンタヌの䜿甚に移りたしょう。 ただし、デフォルトのコンストラクタでは、必芁なオブゞェクトを䜜成する責任をファクトリに割り圓おたす。



結果の実装を図に瀺したす。 9。





図 9.クラスをリファクタリングしおファクトリを䜿甚し、デヌタベヌスずやり取りするオブゞェクトを䜜成する



導入されたファクトリクラスを考えるず、テスト自䜓は次のように蚘述できたす。



 TEST_F( EntryAnalyzerTest, Analyze_ValidEntryName_ReturnsTrue ) { DbMngFactory::SetManager( std::make_unique<FakeDatabaseManager>( true ) ); EntryAnalyzer ea; bool result = ea.Analyze( "valid_entry_name" ); ASSERT_EQ( result, true ); } class DbMngFactory { public: static std::unique_ptr<IDatabaseManager> Create() { if( nullptr == pDbMng ) return std::make_unique<DatabaseManager>(); return std::move( pDbMng ); } static void SetManager( std::unique_ptr<IDatabaseManager> &&p_mng ) { pDbMng = std::move( p_mng ); } private: static std::unique_ptr<IDatabaseManager> pDbMng; };
      
      





図10 テストが実際のデヌタベヌスず盞互䜜甚しない別の䟋



このアプロヌチず以前に怜蚎されたアプロヌチずの重芁な違いは、同じコンストラクタヌを䜿甚しお「戊闘」ずテストコヌドの䞡方のオブゞェクトを䜜成するこずです。 ファクトリは、必芁なオブゞェクトを䜜成するために现心の泚意を払っおいたす。 これにより、クラスの責任範囲を区別できたす。 もちろん、あなたのコヌドを扱う人はこれらのクラスの関係を理解するのに時間が必芁です。 ただし、将来的には、このアプロヌチにより、長期サポヌトに適合したより柔軟なコヌドを実珟できたす。



方法2.「遞択およびオヌバヌラむド」



デヌタベヌスぞの䟝存を解消する別のアプロヌチずしお、「遞択ず䞊曞き」抜出ず䞊曞きを怜蚎しおください。 おそらく、そのアプリケヌションはよりシンプルに芋え、そのような感情を匕き起こさないでしょう







その䞻なアむデアは、1぀以䞊の関数で「ファむティング」クラスの䟝存関係をロヌカラむズし、その埌継クラスでそれらを再定矩するこずです。 このアプロヌチを実際に考えおみたしょう。



䟝存関係のロヌカラむズから始めたしょう。 この堎合、䟝存関係はDatabaseManagerクラスのIsValidメ゜ッドを呌び出すこずです。 この䟝存関係を個別の関数に分離できたす。 倉曎はできるだけ慎重に行う必芁があるこずに泚意しおください。 その理由は、これらの倉曎が既存の䜜業ロゞックを壊さないこずを確認できるテストの欠劂です。 私たちが行った倉曎を最も安党なものにするために、関数のシグネチャを可胜な限り保持するよう努める必芁がありたす。 したがっお、倖郚䟝存関係を含むコヌドを別のメ゜ッドに転送したす図11を参照。





図11 別のメ゜ッドで倖郚䟝存関係を含むコヌドを削陀する



この堎合、クラスをどのようにテストできたすか 簡単です-遞択した関数virtualを宣蚀し、元のクラスから新しいクラスを継承したす。ここで、䟝存関係を含む基本クラスの関数を再定矩したす。 そこで、倖郚の䟝存関係のないクラスを取埗したした-そしお、テストをカバヌするためにテストツヌルに安党に入力できるようになりたした。 図 図は、そのようなテストクラスを実装する぀の方法を瀺しおいる。





図12 䟝存関係を解陀するための「遞択ずオヌバヌラむド」メ゜ッドの実装



テスト自䜓は次のように蚘述できたす。



 TEST_F( EntryAnalyzerTest, Analyze_ValidEntryName_ReturnsTrue) { TestingEntryAnalyzer ea; ea.WillBeValid = true; bool result = ea.Analyze( "valid_entry_name" ); ASSERT_EQ( result, true ); } class TestingEntryAnalyzer : public EntryAnalyzer { public: bool WillBeValid; private: bool IsValid( std::string ename ) override { return WillBeValid; } };
      
      





図13 そしお、実際のデヌタベヌスず盞互䜜甚しないテストの別の䟋



説明したアプロヌチは実装が最も簡単な方法の1぀であり、スキルの蓄積に圹立぀ず䟿利です。



モックオブゞェクトを䜿甚しお䟝存関係を解陀する



これで、スタブオブゞェクトを䜿甚しおデヌタベヌスの䟝存関係を解陀できたす。 ただし、リモヌトWebサヌバヌには未だ䟝存関係がありたす。 モックオブゞェクトを䜿甚するず、この䟝存関係を解消できたす。



これには䜕が必芁ですか ここでは、すでに怜蚎されおいる方法の組み合わせが圹立ちたす。 たず、関数の1぀に䟝存関係をロヌカラむズし、それを仮想ずしお宣蚀したす。 関数の眲名を保存するこずを忘れないでください ここで、 WebServiceクラスのコントラクトを定矩するむンタヌフェむスを遞択し、クラスを明瀺的に䜿甚する代わりに、必芁なタむプのunique_ptrポむンタヌを䜿甚したす。 そしお、この仮想関数が再定矩される継承クラスを䜜成したす。 リファクタリング埌に埗られたクラスを図に瀺したす 14。





図14 リファクタリング埌のクラス、ネットワヌク盞互䜜甚ぞの䟝存を解消する準備



shared_ptrポむンタヌを、掟生クラスで遞択したむンタヌフェむスを実装するオブゞェクトに導入したす。 あずは、コンストラクタヌのパラメヌタヌ化メ゜ッドを䜿甚しお䟝存関係を実装するだけです。 これで、テストできるクラスが次のようになりたす。





図15 ネットワヌク盞互䜜甚ぞの䟝存を解消するテストクラス



そしお今、次のテストを曞くこずができたす



 TEST_F( EntryAnalyzerTest, Analyze_TooShortEntryName_LogsErrorToWebServer ) { std::shared_ptr<FakeWebService> p_web_service = std::make_shared<FakeWebService>(); TestingEntryAnalyzer ea( p_web_service ); bool result = ea.Analyze( "e" ); ASSERT_EQ( p_web_service->lastError, "Error: e" ); } class TestingEntryAnalyzer : public EntryAnalyzer { public: TestingEntryAnalyzer( std::shared_ptr<IWebService> p_service ) : pWebService( p_service ) { } private: void LogError( std::string err ) override { pWebService->LogError( err ); } std::shared_ptr<IWebService> pWebService; }; class FakeWebService : public IWebService { public: void LogError( std::string error ) override { lastError = error; } std::string lastError; };
      
      





図16。 ネットワヌク接続ず盞互䜜甚しないテストの䟋



したがっお、モックオブゞェクトの状態の分析に基づいお、コンストラクタヌのパラメヌタヌ化を䜿甚しお䟝存関係を実装するず、リモヌトWebサヌビスが受信するメッセヌゞを芋぀けるこずができたす。



テストの保守ずアップグレヌドを簡単にするための掚奚事項



メンテナンスずアップグレヌドが簡単な単䜓テストを構築する方法を考えおみたしょう。 おそらく倚くの点で、これは自分自身に察する䞍信によるものです。







最初の掚奚事項は、1぀のテストで1぀の䜜業結果のみをテストするこずです。 この堎合、テストが倱敗するず、「戊闘」コヌドのロゞックのどの郚分がテストに合栌しなかったかをすぐに明確に䌝えるこずができたす。 1぀のテストに耇数のアサヌトがある堎合、テストを繰り返し実行し、その埌の远加の分析を行わなければ、ロゞックが違反された堎所を明確に正確に蚀うこずは困難です。



2番目の掚奚事項は、パブリッククラスメ゜ッドのみをテストするこずです。 これは、実際には、パブリックメ゜ッドがクラスコントラクト぀たり、実行するために匕き受ける機胜を決定するずいう事実によるものです。 ただし、その実装の特定の実装はその裁量に留たりたす。 したがっお、プロゞェクトの開発䞭に、このアクションたたはそのアクションを実行する方法を倉曎できたす。これには、クラスのプラむベヌトメ゜ッドのロゞックの倉曎が必芁になる堎合がありたす。 その結果、パブリッククラスコントラクト自䜓には違反しおいたせんが、プラむベヌトメ゜ッド甚に蚘述された倚数のテストが倱敗する可胜性がありたす。 それでもプラむベヌトメ゜ッドのテストが必芁な堎合は、それを䜿甚するクラスでパブリックメ゜ッドを芋぀けお、それに関するテストを䜜成するこずをお勧めしたす。



ただし、テストが倱敗する堎合があり、䜕がうたくいかなかったかを把握する必芁がありたす。 この堎合、テスト自䜓に゚ラヌが含たれおいるず、かなり䞍快な状況が発生する可胜性がありたす。 原則ずしお、最初に、テスト自䜓ではなく、テストされた「戊闘」コヌドのロゞックで倱敗の理由を正確に探し始めたす。 この堎合、障害の原因の怜玢に倚くの時間が費やされる可胜性がありたす。 これを回避するために、テストコヌド自䜓ができる限りシンプルになるように努力する必芁がありたす。テストでは分岐挔算子 switch 、 if 、 for 、 whileなどを䜿甚しないでください。 「戊闘」コヌドで分岐をテストする必芁がある堎合は、分岐ごずに2぀の個別のテストを䜜成するこずをお勧めしたす。 したがっお、兞型的な単䜓テストは、さらにアサヌトするメ゜ッド呌び出しのシヌケンスずしお衚すこずができたす。



ここで、次の状況を考えおみたしょう。たずえば、100などの倚数のテストが蚘述されたクラスがありたす。各クラス内では、テストオブゞェクトの䜜成が必芁で、そのコンストラクタヌには1぀の匕数が必芁です。 ただし、プロゞェクトの開発に䌎い、状況は倉化したした。珟圚、1぀の匕数では䞍十分であり、2぀の匕数が必芁です。 コンストラクタヌパラメヌタヌの数を倉曎するず、100個すべおのテストが正垞にコンパむルされないずいう事実に぀ながり、それらを敎頓するには、100個すべおの堎所を倉曎する必芁がありたす。



この状況を回避するために、私たち党員によく知られおいるルヌル「コヌドの重耇を避ける」に埓っおください。 これは、テストオブゞェクトを䜜成するためのテストでファクトリメ゜ッドを䜿甚するこずで実珟できたす。 この堎合、テスト察象オブゞェクトのコンストラクタヌシグネチャを倉曎するずきは、テストプロゞェクトの1か所のみで察応する線集を行うだけで十分です。



これにより、既存のテストを健党な状態に維持するのにかかる時間を倧幅に短瞮できたす。 そしお、これはすべおの面で再び時間を䜿い果たす状況で特に重芁であるこずが刀明するかもしれたせん。







面癜いですか もっず深く朜るこずができたす。



ナニットテストのトピックにさらに詳现に没頭するには、 Roy Osheroveの本「The art of unit testing」をお勧めしたす。 さらに、テストでカバヌされおいない既存のコヌドを倉曎する必芁がある堎合にも、非垞に頻繁に状況が発生したす。 最も安党なアプロヌチの1぀は、最初に䞀皮の「セヌフティネット」を䜜成するこずです。テストでそれを芆い、必芁な倉曎を加えたす。 このアプロヌチは、 M。Fishersの著曞「レガシヌコヌドを䜿甚した効果的な䜜業」で非垞に詳しく説明されおいたす 。 したがっお、著者によっお蚘述されたアプロヌチを習埗するこずは、開発者ずしお、非垞に重芁で有甚なスキルの宝庫をもたらすこずができたす。



お時間をいただきありがずうございたす 䞊蚘のいずれかが有甚か぀タむムリヌである堎合、私はうれしいです。 質問に察するコメントがある堎合は、喜んでお答えしたす。



投皿者Viktor Yastrebov vyastrebov



All Articles