苗づくりについて徹底解説(後編)

        前回の記事ではceedlingのインストールと簡単な使い方を紹介し、ceedlingのフレームワークについてはある程度理解しました。この記事では、シードリングについて詳しく説明します。

1、苗木

  1. プロジェクト yaml

        projetc.yaml はプロジェクト全体の設定ファイルであり、ファイルの内容は必要に応じて設定できます。コードをテストするときに、シードリング フレームワークを独自のソース コードに直接追加するのは不便な場合があることを考慮して、projetc.yaml に含めるファイルを指定できます。

         次の – C:\User**** は、新しく追加されたファイル パスです。さらに、追加できるライブラリ パスなどもあります。テストしたファイル名は test_add.c 、プレフィックス名は test_ です。これはデフォルトのプレフィックス名を使用していますが、これは変更することもできます。

 同様に、CMock のプレフィックスも変更できます。デフォルトは、CMock ヘッダー ファイルのプレフィックス、mock_ です。

:when_no_prototypes: : デフォルトの警告では、CMock を使用してヘッダー ファイルのモック関数を作成する場合、ヘッダー ファイルには関数プロトタイプが含まれている必要があります。CMock コンポーネントに関数プロトタイプが含まれていない場合、CMock コンポーネントをどうするか。警告、無視、エラーを設定できます。

:enforce_strict_ordering: デフォルトは TRUE、CMock チェック関数の呼び出し順序の設定に使用されます。

:plugins: CMokc によって生成された関数を設定するために使用されます。Xxx_Expect は常にデフォルトで生成されます (前の記事で生成された fun_ExpectAndReturn など)。以下はオプションであり、対応する関数が生成されます。

- :ignore
- :ignore_arg
- :expect_any_args
- :array
- :cexception
- :callback
- :return_thru_ptr

備考: オプションを追加する場合、テストコマンド実行後、CMock が対応する関数を生成できない場合がありますので、ビルドディレクトリを削除して再度実行してください。

次の treat_as はサポートされているデータ型で、追加可能であり、オプションです (画像は公式 PDF ドキュメントから切り取ったもので、明確な画像は公式 GitHub で見つけることができます。リンクは前のブログにあります)。 :

         場合によってはコード カバレッジをテストする必要があるため、gcov を使用してコード カバレッジ レポートを生成し、この関数を project.yaml ファイルに追加する必要があります。使用するときはテスト コマンドと同様に、-gcov を追加するだけです。

2. テスト

        まず、add.c のコードを変更します。変更後のコードは次のようになります。

test_add.c コード: 

 このうち、setUp 関数はテスト前に一部のリソースを初期化する関数であり、次に test_add_NeedToImplement テスト コードが呼び出され、最後に TearDown 関数が呼び出され、ここでは使用されないリソースが解放されます。まず、test コマンドを使用してコードをテストします。

 問題ありません。後で gcov を使用してコード カバレッジ レポートを生成します。

 add.c の下部 4 行の最初の行は、関数名とコード行を含む有効なコードが 9 行あることを示しています。ただし、括弧、コメント、空白行で占められている行数は除きます。コードの 77.78% が現在実行されています。行 2 は分岐が 4 つあることを示し、行 3 は分岐の 50% が少なくとも 1 回実行されることを示し、行 4 は関数呼び出しを示します。ceedling utils:gcov コマンドを使用して、より詳細なコード テスト レポートを HTML 形式で生成します。 対応するディレクトリ内のファイルを開きます。

 

 開いたら、これが表示されます。関数のリストをクリックすると、追加関数の分析が表示されます。 

 src\add.c をクリックして Enter を押すと、コードの各行が呼び出された回数が表示されます。

 赤はコードが呼び出されたことを示し、前の数字はコードが呼び出された回数を示し、赤はコードが呼び出されなかったことを示します。

3、CMock補足命令

        前編ではCMockとは何か、何ができるのかを簡単に説明しました。以下に CMock についての詳細な説明を記載します。これらの説明はブロガー自身が理解しているものです。間違いがある場合は、ブロガーに知らせてください。

        CMock は関数宣言に従って一連の関数を自動的に生成し、必要に応じてプログラムにリンクします。CMock モック関数を使用すると、必要なデータを受信して​​いることを確認し、必要なデータを返し、必要なときにエラーをスローさせることができます。生成された関数は project\htq\build\test\mocks ディレクトリの下にあり、図に示すように、対応するファイルがあります。

ここで、宣言された関数が int do(int a, int b); であると仮定します。

CMock は do() 関数を自動的に生成し、プログラムに接続します。さらに、CMock はテスト用の一連の関数を生成します。

do_ExpectAndReturn (int a, int b, int cmock_to_return); ここで、a と b は do() の入力パラメータであり、cmock_to_return は関数の戻り値です。Xxx_Expect(戻り値の有無に応じてAndReturnを増やす)が必ず生成されます。

do_IgnoreAndReturn(int cmock_to_return) は入力を無視し、戻り値を返します。レジスタの値を読み取るなど、特定の関数が呼び出される回数やその関数を呼び出す際の実際のパラメータを気にする必要がない場合に使用されます。レジスタの場所を指定する必要はなく、指定する必要があるだけです。その出力値。後で無視したくない場合は、do_StopIgnore() を使用します。

do_AddCallback() は、いくつかのカスタム操作を実行するコールバック関数を追加します。do_AddCallback は、コールバックを呼び出す前に、(設定した期待に基づいて) 順番に引数をチェックして呼び出すようにモック関数に指示します。コールバック関数の説明:

int do _CALLBACK(int a, int b, int cmock_num_calls); do() コールバック関数のプロトタイプ

a、b は入力パラメータ、cmock_num_calls は呼び出しの数、最初の呼び出しは 0 を返し、2 番目の呼び出しは 1 を返します。do _CALLBACK の戻り値は do() を呼び出した関数に割り当てられ、最初に do_ExpectAndReturn で設定された出力値は機能しなくなります。

do_Stub は、すべての健全性チェックをスキップし、コールバック関数に直接ジャンプするようにモック関数に指示します。この場合、通常のモック呼び出しを独自のカスタム スタブ関数に置き換えます。

CMock によって生成された関数は project.yaml で構成できます。対応する関数を生成するには、次のオプションを使用します。

- :ignore
- :ignore_arg
- :expect_any_args
- :array
- :cexception
- :callback
- :return_thru_ptr

add.cを変更します。

 htq_fun_1、htq_fun_2の関数宣言を以下に示します。

int htq_fun_1(int a);

int htq_fun_2(int a, int b);

test_add.c の変更点

結果は以下の通りです。

         htq_fun_1_ExpectAndReturn(1, 1); は、CMock フレームワークによってシミュレートされた関数です。そのパラメータは、xxx 関数の入力と出力です。入力は 1 で、出力は 1 です。対応する関数の宣言を伝えるだけで済みます。上記のコード htq_fun_1 関数のステートメントは次のとおりです: int htq_fun_1 (int a); CMOCK は、htq_fun_1_ignoreandreturn、htq_fun_stopignore、htq_fu、htq_fu、n_1_expectandreturn、などの htq_fun_1_ で始まる一連の補助関数を自動的に生成します。 htq_fun_1_addcallback など

        テスト コードで htq_fun_1 を呼び出す場合、htq_fun_1(1); htq_fun_1(2); htq_fun_1(3); のように、複数回呼び出す必要があり、関数入力が毎回異なる場合は、htq_fun_1_ExpectAndReturn を呼び出す必要もあります。 (1, 1)、htq_fun_1_ExpectAndReturn(2, 6)、htq_fun_1_ExpectAndReturn(3, 4)、コードに必要な 3 つのパラメーター 1、2、および 3 は入力と出力を提供する必要があります。そうでない場合は、エラーが発生します (予期した内容を要求するプロンプトが表示されます)。入力が少なすぎます)。入力が利用可能であることが保証されている限り、1、2、および 3 に対応する出力値 (1、6、4) を必要に応じて書き込むことができます。1 つの点を強調します。htq_fun_1(1) を 3 回呼び出すだけで、入力が 1 になるたびに、htq_fun_1_ExpectAndReturn(1, 1) を 1 回記述するだけで十分であるとは言えません。これはそうではありません。 3 回与えられた場合、htq_fun_1_ExpectAndReturn の呼び出し数は htq_fun_1 の呼び出し数と同じになります。テスト後、この 2 つは 1 対 1 の通話関係も維持します。

4. まとめ

        ここまでは苗木関連の基本的な紹介で日常的には十分ですが、さらに詳しく知りたい場合は作者の github および Web サイトに移動してください。今後も機会があれば苗関連も更新していきたいと思います。実際にシードリングを使用している外国人上司へのリンクは次のとおりです: https://mp.csdn.net/mp_blog/creation/editor?not_checkout=1

氏の記事では実戦内容のこの部分は書きませんが、読んでいただければシードリングへの理解がより深まると思います。

おすすめ

転載: blog.csdn.net/zichuanning520/article/details/130687286