1

cmocka を使用して一部のソース コードを単体テストしようとしています。基本的に、(関連する) ソース コードは Source.c に似ています。

単体テストは、各関数を個別に呼び出します。Add()関数をテストするとき、この関数は最終的にutil_malloc()を呼び出します(この関数は通常、malloc の前に 0 のサイズをチェックします)。これは単体テストによってラップされます。ラップされた関数__wrap_util_malloc()では、Wrappers.c で、最初に期待されるサイズがチェックされ、その後 malloc を使用してメモリが割り当てられます。

次に、Remove()関数がテストされ、以前に割り当てられたメモリが解放されます。


テスト cmocka を実行すると、次のエラーが返されます。

<failure><![CDATA[Blocks allocated... project_path/wrappers.c:46:  note: block 00341e58 allocated here ERROR: Add_Test leaked 1 block(s) ]]></failure>

<failure><![CDATA[EXCEPTION_ACCESS_VIOLATION occurred at 004060af.
To debug in Visual Studio... [...]
]]></failure>

今のところ、 Add_Test()関数の最後にRemove()呼び出しを追加しました (およびAdd()をRemove_Test()の先頭に追加しました)。これで問題は解決したようです。このことから判断すると、個別の単体テストごとに割り当てられたすべてのメモリを解放する必要があります。

今私の質問:

  1. 複数の単体テストで割り当てられたメモリを使用することは可能ですか?
  2. これを解決する最善の方法は何ですか?

ソース.c:

static ST_SOME_STRUCT GlobStruct;

void Add()
{
    GlobStruct = util_malloc(sizeof(ST_SOME_STRUCT));
}

void Remove()
{
    util_free(&GlobStruct);    
}

void DoStuff()
{
    //Do stuff using the global structure GlobStruct
}

Unit_test.c:

int main( int argc, char **argv )
{
const struct CMUnitTest Test[] =
   {
      cmocka_unit_test(Add_Test),      
      cmocka_unit_test(Remove_Test),
   };
   cmocka_set_message_output( CM_OUTPUT_XML );
   return cmocka_run_group_tests( Test, NULL, NULL );
}

static void Add_Test (void** state)
{
   expect_value(__wrap_util_malloc, size, sizeof(ST_SOME_STRUCT ));
   Add();
}

static void Remove_Test (void** state)
{
   expect_not_value(__wrap_util_free, memory, cast_ptr_to_largest_integral_type(NULL));
   Remove();
}

Wrappers.c:

void *__wrap_util_malloc(int size)
{
    check_expected(size);
    return malloc(size);
}

void __wrap_util_free(void *memory)
{
    check_expected_ptr(memory);
    free(memory);
}
4

1 に答える 1