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_*_EQ
実行時の値の出力のために、actual に右辺値を使用できません。
また、expected には右辺値を使用できますが、実行時の値が出力されません。
どちらも実行時の値を出力したい場合、IUTEST_*_LVALUE_EQ を使用してください。
(※ただし、右辺値を使用できません。)
右辺値を使用したい場合は、IUTEST_*_RVALUE_EQ を使用してください。
(※左辺値も使用できます。ただし、実行時の値が出力されません。)
- IUTEST_*_STREQ
- IUTEST_*_STRNE
- IUTEST_*_STRCASEEQ
- IUTEST_*_STRCASENE
制限なく使用できます。
- IUTEST_*_FLOAT_EQ
- IUTEST_*_DOUBLE_EQ
expected に右辺値/左辺値、actual に左辺値が使用できます。
また、actual の実行時の値が出力されます。
- その他のアサーション
実装の都合上、IUTEST_*_EQ と同様の問題がありますが、
現バージョンでは、左辺値のみ利用できるアサーションとして提供しています。
そのため、右辺値を使用できません。
右辺値を利用したい場合は、一時変数に格納することで回避できます。
将来のバージョンアップで根本的解決を目指しておりますが、IUTEST_*_EQ と同様の提供方法になる可能性もあります。
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 を指定すると、ランダムな順序でテストを実行します。
これによって、テスト間に良くない依存関係がないか調べることができます。
--iutest_output=xml[:filepath]
上記オプション、または環境変数 IUTEST_OUTPUT を指定すると、XML 形式でテスト結果を出力します。
出力フォーマットは、 JUnit report に基づいており、 Jenkins など CI ツールで解析することができます。