今回の変更点は以下のとおりです。
- 追加
- 値のパラメータを operator + で連結できるように修正
- 値のパラメータを連結する ::iutest::Concat を追加
- テストフィクスチャの定義が省ける値のパラメータ化テストを追加(IUTEST_AP,IUTEST_INSTANTIATE_TEST_CASE_AP(Visual Studio では IUTEST_P,IUTEST_INSTANTIATE_TEST_CASE_P でも省略可能))
- IUTEST_TYPED_TEST,IUTEST_TYPED_TEST_P の別名マクロを追加(IUTEST_T, IUTEST_TP)
- xml 出力に timestamp を追加
- 前提条件の検証用マクロ IUTEST_ASSUME_* を追加
- Windows 向けメニュー登録ユーティリティを追加
- SSTP 通知リスナーを追加
- 修正
- 値のパラメータ化テストが日本語テスト名に対応していなかった問題を修正
- ビルドエラー修正
- バグ修正
バグ修正
いろいろと更新しているうちに、エンバグや把握していなかった不具合が見つかったので、修正しました。テストも増強したので、安定化したのではないかと思います。
SSTP 通知リスナーを追加
以前、ブログで書いた機能になります。「[iutest] テスト結果を「伺か」にしゃべらせてみた」
こちらはお遊び的な機能になってます。
以降から、大きな機能追加を紹介します。
前提条件の検証用マクロ IUTEST_ASSUME_* を追加
ASSERT,EXPECT,INFORM とは違うフレーバーになります。ASSUME では、検証に失敗した場合にテストをスキップします。
テストを特定の条件下でのみ実行したい場合に使用します。
例えば、整数型のサイズを条件としたときは、以下のように書きます。
struct hoge { int a; char b; };
IUTEST(Test, Size)
{
IUTEST_ASSUME_EQ(4, sizeof(int));
IUTEST_ASSERT_EQ(8, sizeof(hoge));
}
この機能は gtest モードでも利用可能です。
値のパラメータの連結に対応
値のパラメータを複数連結してパラメータを作成する機能を追加しました。これにより、より複雑なパラメーターを簡単に作成できるようになりました。
// true,false + 1,10
IUTEST_INSTANTIATE_TEST_CASE_P(A1, ConcatTest
, ::iutest::Concat(::iutest::Bool(), ::iutest::Values(1, 10)));
// operator + も利用可能
// 1-9 + true,false + 1, 10
IUTEST_INSTANTIATE_TEST_CASE_P(P5, ConcatTest
, ::iutest::Range(1, 10) + ::iutest::Bool() + ::iutest::Values(1, 10));
テストフィクスチャの定義が省ける値のパラメータ化テストを追加
値のパラメータ化テストを書くには、テストフィクスチャの定義が必須でした。しかしながら、ほとんどの場合、パラメータの型を決定するために定義するだけで、その作業は手間になっていました。
class BoolParamTest : public ::iutest::TestWithParam<bool> {};
IUTEST_P(BoolParamTest, Test)
{
bool param = GetParam();
}
IUTEST_INSTANTIATE_TEST_CASE_P(My1, BoolParamTest, ::iutest::Bool());
そこで、テストフィクスチャの定義が不要な値のパラメータ化テストを追加しました。
IUTEST_AP(BoolParamTest, Test)
{
bool param = GetParam<bool>();
}
IUTEST_INSTANTIATE_TEST_CASE_AP(My1, BoolParamTest, ::iutest::Bool());
パラメータの型は内部的には any となっており、GetParam Template 関数は unsafe_any_cast した結果を返す点に注意してください。
(非 Template の GetParam を使うと ::iutest::any が取得できます。)
また、Visual Studio の場合、通常の IUTEST_P でもテストフィクスチャの定義が不要になります。
もちろん、定義をした場合でも今まで通り使用できます。
(※ この実装には __if_exists を使用しています。__if_exists については、後日ブログにしたいと思います。 )
Windows 向けメニュー登録ユーティリティを追加
Windows 向けに main からのテスト実行ではなく、メニューバーから任意のテストを実行するユーティリティを追加しました。こちらは、GUI に関わるテストや統合されたアプリケーションでテストを行いたい場合に使うことを想定しています。
(io テストのような低レベルなものや、コンソールで完結できるものは通常どおり main から実行しましょう)
ようはランチャーのようなものです。
#include <util/iutest_util_menu.hpp>
// TestMenu ユーティリティのインスタンスを作る
// コンストラクタにはメニューIDの先頭の番号を指定します
static ::iuutil::TestMenu s_test_menu(4000);
/* ~中略~ */
hWnd = CreateWindow( // ...
/* ~中略~ */
// ウィンドウ作成後、ウィンドウのメニューハンドルを渡して Create
s_test_menu.Create( GetMenu(hWnd) );
}
/* ~中略~ */
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
// メッセージハンドラに処理を追加
s_test_menu.OnCommand(wmId);
return DefWindowProc(hWnd, message, wParam, lParam);
こちらは実行すると以下のようにメニューが自動生成されます。

テストの出力は標準出力に吐かれるので、コンソールウィンドウを作っておくと良いかもしれません。
今後の予定
しばらくは、 C言語版の iutest_c に集中しようかな~と思います。iutest でバグがあった場合は対応します。
バグがあったら是非報告してくださいm(__)m
