質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ユニットテスト

ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

Q&A

解決済

2回答

697閲覧

過去の質問『既存ソースに手を入れずに同一ソース内の関数をスタブにしてユニットテストを実施する方法』の処理の動きについて

fukama

総合スコア8

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ユニットテスト

ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

0グッド

0クリップ

投稿2018/01/21 16:01

編集2018/01/21 16:28

過去の解決済みの質問がありまして、こちらと同様のことを行いたいのですが、
解決策の処理の動きが読み取れません。

既存ソースに手を入れずに同一ソース内の関数をスタブにしてユニットテストを実施する方法
https://teratail.com/questions/37783

上記質問の、最終的な解決案「スタブ関数をテスト関数の引数渡しにする方法」のサンプルコードを動作させてみると、
確かにスタブ対象関数が、スタブ関数に置き換えができているのですが、処理の動きが理解できません。
下記に上記質問のコードを引用させて頂きますが、具体的には、

  • test_stubcall(func1_stub, func2_stub);を呼んで、なぜtest()が呼ばれるのか。
    (defineの書き方が逆に見えるが、逆にするとコンパイルエラーが発生する。)
  • void関数のtest()になぜ、stub関数を渡せて、更に、stub関数に置き換えることまで実現できているのか

という2点がわかりません。宜しければご教授頂けると幸いです。

既存ソース側

C

1// test.c 2#include <stdio.h> 3 4void func1(void); 5void func2(void); 6 7static void test(void) 8{ 9 func1(); 10 func2(); 11} 12 13void func1(void) 14{ 15 printf("func1()\n"); 16} 17void func2(void) 18{ 19 printf("func2()\n"); 20}

テストコード側

c

1typedef void (*func_t)(void); 2#define test(a) test_stubcall(func_t func1, func_t func2) 3 4#include "test.c" 5 6void func1_stub(void) 7{ 8 printf("func1_stub\n"); 9} 10 11void func2_stub(void) 12{ 13 printf("func2_stub\n"); 14} 15 16int main() 17{ 18 test_stubcall(func1_stub, func2_stub); 19 return 0; 20}

実行結果

func1_stub func2_stub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

C

1#include "test.c"

の位置でtest.cの内容がテストコード側に読み込まれますが、それよりも手前に

C

1#define test(a) test_stubcall(func_t func1, func_t func2)

がある。
すなわち、test.cの中にあった

C

1static void test(void)

C

1static void test_stubcall(func_t func1, func_t func2)

に置き換えられる。

そして、関数定義の仮引数がfunc1とfunc2になっているので、test.cの中にあった

C

1 func1(); 2 func2();

は、テストコード側の関数呼び出しで渡されたパラメータに従って、それぞれ

C

1 func1_stub(); 2 func2_stub();

と同等になる。

ということだと思います。

投稿2018/01/21 16:36

okrt

総合スコア366

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fukama

2018/01/21 23:20

define定義でテスト対象関数を引数なしから引数ありに書き換えていたのですね。 お二方ともありがとうございました。とても分かりやすかったです。
guest

0

#define test(a) test_stubcall(func_t func1, func_t func2)によりマクロが定義されます。

これは単純な換字マクロです
その効果によって

static void test(void)

static void test_stubcall(func_t func1, func_t func2)

と書き換えられます

投稿2018/01/21 17:44

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問