過去数週間、私はテスト方法論のギャップを埋める方法を検討し、検討してきました。簡単に言うと、単体テストは小さすぎ、従来の統合テストは大きすぎます。
頻繁にシナリオがアップになるA
とB
、両方の使用コンポーネントをC
。ただしA
、のB
要件は少し異なり、についての仮定も少し異なりますC
。私が開発者である場合A
、どこでどのように私の想定をテストするのC
ですか?
明らかにA
モックされた仮定C
を使用A
した単体テストは、単独でのテストには適していますが、仮定自体はテストしません。
別の可能性は、の単体テストを追加することですC
。ただし、これはA
開発段階ではありますがC
、仮定を進化させてテストを変更するのは非常にA
不格好なため、これは理想的ではありません。実際、A
開発者はC
(たとえば、外部ライブラリ)の単体テストに適切にアクセスできない場合もあります。
これをより具体的な例でフレーム化するには:これがノードアプリケーションであると想定します。 A
にB
依存しC
、(特に)ファイルを読み取り、ファイルの内容をに渡されたオブジェクトに格納しますC
。最初C
は、処理するすべてのファイルが小さく、重大なブロックなしで同期的に読み取ることができます。ただし、の開発者B
は、自分のファイルが巨大になりC
、非同期読み取りに切り替える必要があることを認識しています。これにより、で散発的な同期バグが発生します。A
これは、C
ファイルを同期的に読み取ることを前提としています。
これは、完全な統合テストから追跡するのが非常に難しいことで有名なタイプのバグであり、統合テストではまったく検出されない可能性があります。またA
、A
sの前提条件がモックされているため、sの単体テストでは捕捉されません。ただし、「」A
および「」のみを実行する「ミニ」統合テストで簡単に検出できますC
。
このタイプのテストへの参照はわずかしか見つかりませんでした。小型の統合、コンポーネント統合テスト、ユニット統合テスト。また、正式なTDD単体テストではなく、BDDテストの方向性にも関係しています。
このテストギャップをどのように埋めますか?具体的には、そのようなテストはどこに置くのですか?どのように私はの入力あざけりないA
とC
「ミニ」統合テストのために?そして、これらのテストと単体テストの間でテストの懸念を分離するためにどれだけの努力を払う必要がありますか?または、テストのギャップを埋めるためのより良い方法はありますか?