不透明な構造に基づいてAPIで作成したライブラリがあります。不透明な構造を使用することには多くの利点があり、私はそれに非常に満足しています。
私のAPIは仕様に関して安定しているので、リリースする前にしっかりとしたベースを確認するために、単体テストの完全なバッテリーを作成したいと思います。
私の懸念は単純ですが、主な目標が内部ロジックを隠すことである不透明な構造に基づいてAPIをどのように単体テストしますか?
たとえば、非常に単純なオブジェクト、非常に単純なテストを含む配列を考えてみましょう。
WSArray a = WSArrayCreate();
int foo = 5;
WSArrayAppendValue(a, &foo);
int *bar = WSArrayGetValueAtIndex(a, 0);
if(&foo != bar)
printf("Eroneous value returned\n");
else
printf("Good value returned\n");
WSRelease(a);
もちろん、これは配列が実際に1つの値で希望どおりに動作するなど、いくつかの事実をテストしますが、少なくともCで単体テストを作成するときは、通常、データ構造のメモリフットプリントを既知の状態と比較します。
私の例では、配列の内部状態が壊れているかどうかはわかりません。
それをどのように処理しますか?ユニットテストのためだけに実装ファイルにコードを追加することは避けたいと思います。モジュールの緩い結合を強調します。実装にユニットテストを挿入することは、私にはかなり侵襲的であるように思われます。
私が最初に考えたのは、実装ファイルを単体テストに含めて、単体テストをライブラリに静的にリンクすることでした。
例えば:
#include <WS/WS.h>
#include <WS/Collection/Array.c>
static void TestArray(void)
{
WSArray a = WSArrayCreate();
/* Structure members are available because we included Array.c */
printf("%d\n", a->count);
}
それはいい考えですか?
もちろん、単体テストはカプセル化の恩恵を受けることはありませんが、実際に機能していることを確認するためにここにあります。