2013年10月28日月曜日

iutest v1.7.0 をリリースしました

iutest v1.7.0 をリリースしました。
今回の変更点は以下のとおりです。

  • 追加
    • 値のパラメータを 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());
パラメータを取り出す際は、GetParam Template 関数に型を指定して取り出します。
パラメータの型は内部的には 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

0 件のコメント:

コメントを投稿