私が新しいプロジェクトを開始するとしましょう。品質が最優先事項です。
大規模な単体テストを行う予定ですが、さらなる単体テストを容易にし、強化するためにアーキテクチャに取り組んでいるときに留意すべき重要なことは何ですか?
編集: ユニット テストの際に、クラスの動作からインスタンス化コードを切り離すことがどのように役立つかについて話している記事を数回前に読みました (今は見つかりません)。それが私がここで求めているデザインのヒントです。
私が新しいプロジェクトを開始するとしましょう。品質が最優先事項です。
大規模な単体テストを行う予定ですが、さらなる単体テストを容易にし、強化するためにアーキテクチャに取り組んでいるときに留意すべき重要なことは何ですか?
編集: ユニット テストの際に、クラスの動作からインスタンス化コードを切り離すことがどのように役立つかについて話している記事を数回前に読みました (今は見つかりません)。それが私がここで求めているデザインのヒントです。
テストのしやすさは、メソッドが持つ依存関係の多くをテストコード(モック、偽物など)に置き換えることができることによってもたらされます。これを実現するために現在推奨されている方法は、依存関係の逆転、別名ハリウッドの原則によるものです。私たち、私たちはあなたに電話します。」言い換えれば、コードは「物事を求め、物事を探さない」必要があります。
このように考え始めると、コードが多くのものに簡単に依存する可能性があることがわかります。他のオブジェクトだけでなく、データベース、ファイル、環境変数、OS API、グローバル、シングルトンなどにも依存関係があります。優れたアーキテクチャに準拠することで、適切なレイヤーを介してこれらの依存関係のほとんどを最小限に抑えることができます。したがって、テストするときは、テストデータでいっぱいの作業データベースは必要ありません。データオブジェクトをモックデータオブジェクトに置き換えるだけです。
これは、オブジェクトの実行からオブジェクトの構築を慎重に分類する必要があることも意味します。コンストラクターに配置された「new」ステートメントは、テストモックで置き換えるのが非常に難しい依存関係を生成します。これらの依存関係をコンストラクター引数を介して渡すことをお勧めします。
また、デメテルの法則を念頭に置いてください。オブジェクトに複数のレイヤーを深く掘り下げないでください。そうしないと、非表示の依存関係が作成されます。Flintstones.Wilma.addChild(pebbles);を呼び出します。つまり、「原始家族フリントストーン」への依存だと思っていたのは、実際には「原始家族フリントストーン」と「ウィルマ」の両方への依存です。
コードを非常にまとまりのあるものにし、分離を少なくすることで、コードがテスト可能であることを確認してください。また、モック ツールを使用して単体テスト中に依存関係をモックアウトする方法を理解していることを確認してください。
よりテストしやすいコードを記述できるように、 SOLID の原則に慣れることをお勧めします。
いくつかのランダムな考え:
インターフェースを定義します。機能モジュールを互いに切り離し、相互の通信方法を決定します。インターフェイスは、異なるモジュールの開発者間の「契約」です。次に、テストがインターフェイスで動作する場合、チームが互いのモジュールをブラック ボックスとして扱い、独立して作業できるようにします。
最初に、少なくとも UI の基本機能をビルドしてテストします。あなたのプロジェクトがあなたに「話しかける」ことができるようになると、何が機能していて何が機能していないかを知ることができます。(おまけ: 開発者が UI を使用せざるを得ない場合、使いやすさやワークフローなどの欠点をすぐに特定できます。)
実用的な最低レベルでテストします。小さなピースが機能することに自信が持てるほど、それらを組み合わせて機能する全体が簡単になります。
コーディングを開始する前に、仕様に基づいて、機能ごとに少なくとも 1 つのテストを記述します。 結局のところ、顧客が製品を購入する理由は機能です。本来の目的を果たすように設計されていることを確認してください。
やるべきことをやったからといって満足してはいけません。してはいけないことをしないようにしてください。 不正なデータをフィードしたり、非論理的な方法で使用したり、データ転送中にネットワーク ケーブルを取り外したり、競合するアプリケーションと一緒に実行したりします。あなたの顧客はそうするでしょう。
幸運を!
あなたのテストは、あなたの要件と同じくらい良いものになるでしょう。それらは、最初に一度に思いつく要件である場合もあれば、機能を追加するときに一度に 1 つずつ思い付く要件である場合もあれば、出荷して人々が開始した後に思い付く要件である場合もあります。大量のバグを報告していますが、それが何をすべきかを正確に文書化できる、または文書化する人がいなければ、良いテストを書くことはできません。