たとえば、私の製品コード(実行可能ファイルにビルドするとします)には
file_a.c (sub_module A)
int func_a() {
....
}
file_b.c (module B)
func_b () {
...
ret = func_a();
...
}
単体テストには CppUTest を使用しています。A の実際のコードで B をテストすると、
- A の実際の実装が必要です。
- func_a() からすべての異なる可能な出力を生成できない場合があります。
- func_a() が他のモジュールの関数を呼び出す場合、関数呼び出しチェーンの奥深くにあるすべてのケースを検出/セットアップするのは困難です。
- おそらくこれは極端すぎるかもしれませんが、このアプローチがすべてのコードを一緒にリンクしてmain()から単にテストすることとどのように異なるかを人々に納得させることはできませんか?
しかし、B のテスト中に func_a() をモックすると、実際の実装がリンクされるため、A のテストを開始するとリンカーは複数の定義に文句を言います。この問題については、2 つの回避策があります
- file_a.c と file_b.c ごとに個別のテスト実行可能ファイルを作成します。しかし、これにより、生産が拡大するにつれて非常に多くの実行可能ファイルが生成され、「実際の」テストと「モック」の組み合わせテストが必要な場合は複雑になります。
- 本番コードを共有ライブラリとしてコンパイルし、それをテスト実行可能ファイルにリンクしてから、リンク時のインターポーズを使用して、実際の実装に対する関数呼び出しをインターセプトします。
では、そのようなシナリオの一般的な方法は何ですか? これは、c コードの単体テストでは非常に一般的なシナリオだと思います。
ありがとう、