ソフトウェアテストの種類(写真)







Tests GuidedによるガイドGrowing Object-Oriented Softwareで、ソフトウェアを設計するときに使用するさまざまなタイプのテストについて説明し、 Alistair CockburnのPorts and Adaptersのアーキテクチャスタイルにどのように適合するかを示しました。







Ports and Adaptersでは、アプリケーションの中心的な場所はドメインモデルによって取得されます。ドメインモデルは、データベース、キュー、UIなど、インフラストラクチャのどの部分とも接触しません。 ただし、このモデルには、ドメインの観点から外部との関係を定義するインターフェイスが含まれています。 Cockburnは、これらのインターフェイスポートを呼び出します。 これらのインターフェースは、外界と相互作用する適切なオブジェクトに実装されます-Cockburnはそれらをアダプターと呼びました。 分散システムでは、それぞれ独自のドメインモデルを持つさまざまなプロセスが、ポートとアダプターを使用して相互に対話します。







上の図では、大きな円はプロセスであり、小さな(内部の)円はオブジェクトです。 ドメインはプロセスの中心にあります。 プロセスが外の世界と相互作用するインフラストラクチャモジュール(図ではこれらは署名されたセクターです)は、ドメイン「円」で囲まれています。 ドメインの概念を技術的な実装にマップするアダプターは、それらの間に配置されます。







以下では、さまざまなレベルのテストがポートとアダプターにどのように適合するかを説明します。







単体テスト









単体テストでは、個々のオブジェクト、または単一のプロセス内の小さなグループをテストします。 たとえば、テスト駆動開発では、ユニットテストを作成します。その結果はテスト対象のコードに影響します。テストケースをパスしない場合は編集します。







統合テスト









「統合テスト」という用語は、多くのタイプのテストに適用できます。 この本では、サードパーティのパッケージを使用して実装されたコードからのある種の抽象化のテストを示すためにそれを使用しました。 ここでは、抽象化の実装がサードパーティのコードと正しく統合されていることをテストします。それがどのように機能するかについて誤った仮定をしておらず、エラーの原因不明のものにつまずかないようにします。 ただし、テスト済みの(サードパーティの)コードにアクセスできないため、これらのテストで見つかったエラーを取得して直接修正することはできません。







受入試験









受け入れテストはユーザー指向のテストであり、システム全体のドメインロジックをテストし、期待どおりに機能することを実証します。







ポートとアダプターを使用すると、ドメインレイヤーの受け入れテストを直接実行できます。これは、ドメインレイヤーが技術インフラストラクチャおよび実世界から完全に隔離されているためです。 受け入れテストは、ポートインターフェイスを介してモデルと対話できます。 このようなテストは非常に高速です。 また、モデルの状態(たとえば、データベースまたはキュー)を保存しないため、互いに簡単に分離できます。







分散システムの受け入れテストでは、共有メモリ内のさまざまなプロセスのドメインを初期化し、ポートインターフェイスの実装を使用して相互に参照できます。これにより、特定の各テストがプロセスの境界を超えないようになります。







システムテスト









システムテストでは、開いているポートを介してシステム全体を制御してテストします。 また、ビルド、展開、システムブートもテストします。 開発の初期段階でシステムテストを記述することにより、システムの開発時に常に展開の準備ができていることが保証されます。







ただし、このようなテストは非常にブレーキがかかり、実行される実際の条件(同時実行性、非同期性、データの保存の必要性)により、互いに分離された読み取り可能なテストの記述が大幅に複雑になります。








All Articles