ユニットとインテグレーションのギャップのテスト:小型コンポーネントインテグレーションのユニットインテグレーションテスト


9

過去数週間、私はテスト方法論のギャップを埋める方法を検討し、検討してきました。簡単に言うと、単体テストは小さすぎ、従来の統合テストは大きすぎます。

頻繁にシナリオがアップになるAB、両方の使用コンポーネントをC。ただしA、のB要件は少し異なり、についての仮定も少し異なりますC。私が開発者である場合A、どこでどのように私の想定をテストするのCですか?

明らかにAモックされた仮定Cを使用Aした単体テストは、単独でのテストには適していますが、仮定自体はテストしません。

別の可能性は、の単体テストを追加することですC。ただし、これはA開発段階ではありますがC、仮定を進化させてテストを変更するのは非常にA不格好なため、これは理想的ではありません。実際、A開発者はC(たとえば、外部ライブラリ)の単体テストに適切にアクセスできない場合もあります。

これをより具体的な例でフレーム化するには:これがノードアプリケーションであると想定します。 AB依存しC、(特に)ファイルを読み取り、ファイルの内容をに渡されたオブジェクトに格納しますC。最初Cは、処理するすべてのファイルが小さく、重大なブロックなしで同期的に読み取ることができます。ただし、の開発者Bは、自分のファイルが巨大になりC、非同期読み取りに切り替える必要があることを認識しています。これにより、で散発的な同期バグが発生します。Aこれは、Cファイルを同期的に読み取ることを前提としています。

これは、完全な統合テストから追跡するのが非常に難しいことで有名なタイプのバグであり、統合テストではまったく検出されない可能性があります。またAAsの前提条件がモックされているため、sの単体テストでは捕捉されません。ただし、「」Aおよび「」のみを実行する「ミニ」統合テストで簡単に検出できますC

このタイプのテストへの参照はわずかしか見つかりませんでした。小型の統合コンポーネント統合テストユニット統合テスト。また、正式なTDD単体テストではなく、BDDテストの方向性にも関係しています。

このテストギャップをどのように埋めますか?具体的には、そのようなテストはどこに置くのですか?どのように私はの入力あざけりないAC「ミニ」統合テストのために?そして、これらのテストと単体テストの間でテストの懸念を分離するためにどれだけの努力を払う必要がありますか?または、テストのギャップを埋めるためのより良い方法はありますか?


1
モジュールACのバージョン管理を検討し、何らかの依存関係管理を使用することを検討しましたか?
miraculixx 14


1
@gnat先端をありがとう。私は質問を曖昧さを少なくしました。
mjhm 14

@miraclixxご提案ありがとうございます。詳しく説明してもらえますか?blog.nodejitsu.com/package-dependencies-done-rightのようなものを意味する場合、これは私が質問している問題とは異なる問題を解決すると思います。私が参照しているコンポーネントは一般に小さすぎて、ノードモジュールとして個別にバージョン付けすることができません。たとえば、モデルやコントローラのコンポーネントファイルなどです。さらに、バージョニングは、特定の問題を明示的にテストするのではなく、安全性と障害の原因に関するヒントのみを提供します。
mjhm 14

回答:


6

コンポーネントに根本的な問題があるようです。

Cは、Cが実行する必要があることを実行し、テスト、文書化、およびそれを実行するように設計する必要があります。Cが「Bがやりたいことをする」ように設計されている状況では、虐待的な関係があり、Aが到着したときに非常に明確になり、Cに少し違うことをさせたいと考えます。

あなたがしてはいけないことは、AのコンテキストでCを単体テストすることであり、特にCのコンテキストでAをテストすることではありません。Aを個別にテストし、CからAへのモックの結果を提供します。 Cが同じ結果を提供しない場合、大きな統合テストを実行するときに検出されるバグまたは設計上の欠陥があります。ユニットテストは常にこの方法で行われています。あるユニットを同時に別のユニットでテストすることはできません。単体テストは、そのために設計されたものではありません。

統合テストは、「プログラム全体」である必要はありませんが、頻繁にそのように設定されます。これらは、プログラムの残りの部分を実行せずにAとCを一緒に実行するテストリグにすることもできます(または、プログラムの残りをできるだけ少なくすることもできます)。この時点では、これらのコンポーネントの機能やプログラムの他の部分との相互作用に依存するため、これ以上アドバイスすることはできませんが、通常は、両方のコンポーネントのテストカバレッジを提供するテストリグを作成できます。そのために努力する価値があるのか​​、それとも(統合テストのサブセットを実行したとしても)プログラム全体を1つとして統合テストする方が効率的であるのかは、あなたしか答えられないことです。ほとんどの統合テストは多くのセクションで構成されているので、うまくいけば、これら2つのコンポーネントに関連するものだけを実行できるはずです(そうでない場合は、


ええ、それは私が考えていることです。これは単体テストの範囲と目的を超えています。残念ながら、依存するコンポーネントが完全に設計、テスト、および文書化されているソフトウェアの世界には住んでいません。また、ほとんどの統合テストは、一般的にエンドツーエンドであり、ソース開発者ではなくQAスペシャリストによって処理されます。ご想像のとおり、ミックスには管理と組織の問題があります。
mjhm 14

独自の統合テストを追加する必要があると思いますが、キュウリやセレンを実行するときに、「カスタマーログインモジュールをユニットテストしています」というユニットテストと呼びます。
gbjbaanb 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.