入門ガイド

コンセプト

リファレンス

main コード

iutest_c を実行するために必要な main コードを以下に記述します。
/* ワーキング変数の定義 */
IUTEST_C_WORKSPACE();

int main(int argc, char** argv)
{
    IUTEST_INIT(&argc, argv);
    return IUTEST_RUN_ALL_TESTS();
}

もっとも簡単なテスト

IUTEST(CaseName, TestName)
{
    int x = 0;
    IUTEST_ASSERT_EQ(0, x);
}
IUTEST マクロからテストの記述を開始します。
あとは、アサーションマクロを使用してあなたのコードをテストするだけです。

テストの明示的な登録

iutest_c はテストを自動的に検出して実行する機能がありますが、
一部対応していないコンパイラがあります。
その場合、IUTEST_REGISTER_TEST を使用して登録をしてください。
値のパラメータ化テストを使用する場合は、IUTEST_REGISTER_TEST_P も合わせて呼ぶようにしてください。
int main(int argc, char** argv)
{
    /* 初期化前に call してください。 */
    /* testcase_name にテストケース名 */
    /* test_name にテスト名 */
    IUTEST_REGISTER_TEST(testcase_name, test_name);

    /* 値のパラメータ化テストの場合は IUTEST_REGISTER_TEST_P もする */
    IUTEST_REGISTER_TEST_P(prefix, testcase_name);

    IUTEST_INIT(&argc, argv);
    return IUTEST_RUN_ALL_TESTS();
}

アサーションの制限

iutest_c の アサーションには使用するにあたって、一部制限があります。

テストフィクスチャ

iutest_c でもテストフィクスチャに対応しています。
言語が C なので、テストフィクスチャは構造体と関数ポインタで構成します。
よって、iutest や Google Test とは少し違った記述が必要になります。
void TestF_SetUp(void)
{
  /* ここに SetUp コード */
}
static const iuTestFixture TestF = { NULL /* SetUpTestCase */
                                  , NULL /* TearDownTestCase */
                                  , TestF_SetUp /* SetUp */
                                  , NULL /* TearDwon */
                                  , NULL /* ユーザーデータ */
                                  };
IUTEST_F(TestF, Hoge)
{
   IUTEST_ASSERT_EQ(0, 0);
   IUTEST_EXPECT_NULL(iuUnitTest_GetCurrentUserData());
}
ユーザーデータには、iuUnitTest_GetCurrentUserData 関数を使うことでアクセスすることができます。

簡易的なパラメタライズテスト

関数の引数にパラメータを渡すテストを簡易的に記述できるマクロを用意してあります。

void TestFunction(int x, int y)
{
   IUTEST_ASSERT_EQ(x, y);
}
IUTEST_PMZ(ParamMethodTest, EQ, TestFunction, 0, 0);
IUTEST_PMZ(ParamMethodTest, EQ, TestFunction, 1, 1);
IUTEST_PMZ(ParamMethodTest, EQ, TestFunction, 2, 2);

値のパラメータ化テスト

値をパラメータ化したテストを作成します。
1つのテストの記述に対して複数の値をテストすることができます。
特定の範囲の数値を網羅的にテストしたい場合などに便利です。

IUTEST_INSTANTIATE_TEST_CASE_P(int, A, TestP, iuRange, 0, 2 );

IUTEST_P(int, TestP, Test)
{
    const int x = param; // パラメータは param 引数として渡されます
    const int kMax = 10;
    IUTEST_ASSERT_LT(x, kMax);
}

パラメータの生成には、iuValues,iuRange,iuStepRange,iuCombine が利用できます。

組み合わせテスト

iuCombine を使用することで、複数のパラメータの組み合わせテストが行えます。
iuCombine の書式は以下のようになります。
IUTEST_INSTANTIATE_TEST_CASE_P((int, char, unsigned int), A, TestName, iuCombine
	   , (iuRange, (0, 2)), (iuStepRange, (100, 110, 2)), (iuValues, (0, 4, 2)) );

IUTEST_INSTANTIATE_TEST_CASE_P の第一引数にはパラメータの各要素の型を括弧でくくって指定します。
第5引数以降には、各要素の生成器と生成器に対するパラメータを指定します。生成器には、iuValues,iuRange,iuStepRange が利用できます。
パラメータは括弧でくくり、さらに生成器とパラメータを括弧でくくってください。

続いて、テストの記述方法を説明します。
typedef IUTEST_P_TYPE((int, char, unsigned int)) TestCombineParamType;

IUTEST_P(TestCombineParamType, TestCombine, Test)
{
	const int x0 = param.value0;
	const char x1 = param.value1;
	const unsigned int x2 = param.value2;
	iuConsole_Output("%d %d %d\n", x0, x1, x2);
}
iuCombine を使用して値のパラメータ化テストを行う場合、IUTEST_P マクロの第一引数に指定するための型を定義する必要があります。
型の定義には IUTEST_P_TYPE を使用します。IUTEST_P_TYPE は構造体を宣言するだけですので、typedef で任意の名前をつけてください。
パラメータの値は、構造体のメンバー変数として定義されています。変数名は、value0,value1,value2... になります。
テスト関数には param 変数としてパラメータが渡されますのでこちらからアクセスしてください。

テストを一時的に無効にする

テストの失敗の修正が早急にはできないなど、何らかの理由でテストを実行したくない場合、DISABLE_ プレフィックスを テスト名もしくはテストケース名に付けることで、無効にできます。

無効なテストは --iutest_also_run_disabled_tests オプションを使用することで一時的に有効にすることもできます。

テストプログラム実行時のオプション

テストの選択

テストの一覧
--iutest_list_tests
上記オプションを指定すると、プログラムは検出したテストの一覧を出力します。
テストの部分的な実行
--iutest_filter=<filter>
上記オプション、または環境変数 IUTEST_FILTER を指定すると、<filter> にマッチしたテストが実行されます。
(テスト名は TestCaseName.TestName)

フィルターのフォーマットは、':' で区切られたワイルドカードパターンのリスト(ポジティブ)と
':' で区切られたパターンの先頭に '-' がついたリスト(ネガティブ)です。
無効テストの実行
iutest_c でも、DISABLED テストが使用できます。
テストケースもしくはテスト名の先頭に "DISABLED_" が ついたテストは無効テストとして通常の実行では無視されます。
--iutest_also_run_disabled_tests
上記オプション、または環境変数 IUTEST_ALSO_RUN_DISABLED_TESTS を指定すると、無効テストも実行されます。

テストを繰り返す

--iutest_repeat=<count>
上記オプション、または環境変数 IUTEST_REPEAT を指定すると、テストの繰り返し回数を設定できます。
<count> に負数を指定した場合、無限に繰り返します。

テストをシャッフルする

--iutest_shuffle
上記オプション、または環境変数 IUTEST_SHUFFLE を指定すると、ランダムな順序でテストを実行します。
これによって、テスト間に良くない依存関係がないか調べることができます。

XML レポート

--iutest_output=xml[:filepath]
上記オプション、または環境変数 IUTEST_OUTPUT を指定すると、XML 形式でテスト結果を出力します。
出力フォーマットは、 JUnit report に基づいており、 Jenkins など CI ツールで解析することができます。

Copyright (c) 2012-2013, Takazumi-Shirayanagi, All rights reserved.