3

テスト結果を表示する方法に CUnit フレームワークを使用しています。(私はプログラミングとSOの初心者なので、ステップバイステップの回答は本当に感謝しています)。

exit() を期待する関数をテストするときに、同じ CUnit フレームワークを使用できる方法はありますか? 私にはそうは思えませんが、とにかく尋ねたいと思っています-他のCUnitテストと一緒に合格/不合格の結果が表示されるので、理想的です。

そうでない場合は、他の初心者向けのソリューション (この SO 投稿など) を検討してきましたが、GOTO/setjmp/longjmp を使用できません。また、ソリューションは移植可能である必要があります。

このコードを実行するために Mac & gcc コマンドラインを使用しています。

EDIT提案された解決策の 1 つは、理想的に見える C プリプロセッサ (CPP) ディレクティブ / "mocking"を使用することです。test.c ファイルで以下のコードを使用しました。

#define ERROR(PHRASE) {fprintf(stderr,"Fatal Error %s occurred in %s, line %d\n",PHRASE, FILE, LINE); exit(2);} 
#ifdef ERROR(PHRASE)
#define ERROR(PHRASE) {printf("In test phase");} 
#endif 
#ifndef ERROR(PHRASE #define ERROR(PHRASE) {printf("Not In test phase");} 
#endif

端末が私に与えるエラーメッセージは次のとおりです。

test.c:30:9: warning: 'ERROR' macro redefined [-Wmacro-redefined]
#define ERROR(PHRASE) {printf("In test phase");}
        ^
test.c:26:9: note: previous definition is here
#define ERROR(PHRASE) {fprintf(stderr,"Fatal Error %s occured in %s, lin...
        ^
test.c:32:14: warning: extra tokens at end of #ifndef directive
      [-Wextra-tokens]
#ifndef ERROR(PHRASE) {printf("Not In test phase");}

(PHRASE) を削除しても、同じエラーが発生します。

編集 他の誰かに役立つ場合は、 #ifdef を使用してモックすることが、最終的にこの問題を解決する最も簡単な方法でした。こちらのサイトも参考になりました。

4

3 に答える 3

0

テストに関する問題や労力の増加がある場合に考慮される可能性のある側面の 1 つは、コードの複雑さを大幅に増やさずにテストに役立つ何らかの方法でテスト対象のプログラムを変更する余地があるかどうかです。

この場合、exit() の呼び出しを関数からのエラー リターン コードに置き換えて、呼び出し元が実際に終了する前に片付けや状態のログ記録などを行うことができる範囲はありますか? もしそうなら、これは両方ともテストを簡素化し、コードが実際にリリース/プロダクションで使用される場合の障害検出を簡素化する可能性があります。なぜなら、特にコードがライブラリ関数に隠れています!

于 2019-01-17T18:39:43.290 に答える