2011-11-11 7 views
0

Cでのユニットテストでは、お互いの関数を呼び出す2つのオブジェクトファイル(AとB)をプロダクションソースにビルドします。ユニットテストのためにAとBのモック/フェイクの実装を提供します。これは、ユニットテストのために実行時に切り替えられるようになっています。コンパイル時のCユニットテスト用の関数リンケージの書き換えまたは中断

実行可能にしたいことは、A、B、fake_A、およびfake_Bを1つの大きなテストバイナリにリンクすることです。実行時とユニットテストの両方で、モジュールのプロダクションと偽の実装を切り替えることができます。 これは、すべてのケースで複数の異なるテストバイナリを作成し、結果を統合する必要がないようにすることが望ましいからです。

ユニットテストのためにAとBをコンパイルするので、実行時には存在しない余分なヘッダー、定義、コンパイラフラグなどを強制することができます。

AとBの関数間のリンケージを何らかの書き換えやリンク時のトリックで壊すことができるのだろうかと思います。

私は説明しようとしましょう。 (

交流

void a_work(void) { 
    b_work(); 
} 

BC

void b_work(void) { 
    do_some_work(); 
} 

fake_b.c

/* for test, when a_work() calls b_work() I want this to be run */ 
void b_work(void) { 
    if (fake_b_enabled) 
    do_fake_b_work(); 
    else 
    // call the real b_work() somehow 
} 

通常のa_work:のは、私は、ファイルにAC、BC、fake_a.cとfake_b.cを持っているとしましょう)のb_work()への呼び出しは、リンク時に実際のb_work()にリンクされます。これは、私が傍受したり書き換えたいことです。

私は関数ポインタレイヤーで何らかのラッピングを考えていますが、それを行う方法はわかりません。

+0

別のオブジェクトファイルとリンクしないのはなぜですか? –

+0

@OliCharlesworthどういう意味ですか?興味深いアイデア。 – blueshift

答えて

0

共有オブジェクト(* nixでは、またはWindowsではDLL)を使用します。テストとプロダクションの両方の方法であなたの関数を実装しますが、それぞれに1つの共有ライブラリを構築してください。次に、それらの間で切り替えるバイナリが1つ必要な場合は、LD_LIBRARY_PATHを使用してバイナリのロードを作成します。

+0

ポイントは、私が一度呼び出すことができるバイナリを1つ取得し、すべてのテストを実行することです。私はそれを行うためにランタイムの読み込みと読み込みを使用できるかどうか疑問に思います。 – blueshift

+0

スクリプトを使用して複数回テストを実行するだけです。 –

関連する問題