2014年11月14日金曜日

Travis CI で Google Test を使う

自作テスティングフレームワークのテストを Travis CI でやっていますが、Google Test を使った場合のテストもするようにしました。

対応したときに参考にしたところ:

参考サイトに書かれていることそのまんまです。
なんの新規性もありません(汗)
.travis.yml はこんな感じ → https://github.com/srz-zumix/iutest/blob/master/.travis.yml
Makefile が汚いので誰か直してくれないかなぁー

兎にも角にも、これで gtest 互換のテストも自動化できました。
せっかくなので、「Travis CI で iutest を使う」というエントリーでも書こうかな。

2014年11月4日火曜日

[Visual Studio] GUID 挿入コマンド

仕事で GUID を挿入することが頻繁にあるのですが、いちいちツールメニューの GUID 作成ダイアログを開いてコピーするってのが面倒なので、ショートカットキーで挿入する拡張機能を探してみました。
GuidInserter2
拡張機能を「GUID」で検索して最初に出たのが GuidInserter2。
https://visualstudiogallery.msdn.microsoft.com/270f94f9-4631-4d95-8407-7954acd11bd7?SRC=VSIDE

インストールができたら、あとは「Ctrl+K, Ctrl+J」とコマンドを入力すれば、GUID が挿入されます。
ツールメニューに「GuidInserter2Settings」が追加されていますので、そちらからフォーマットを選択できます。

Insert Identifiers
少し下に出てきたのが Insert Identifiers。
https://visualstudiogallery.msdn.microsoft.com/22795583-5cc9-4681-af8e-6084f3441655?SRC=VSIDE

こちらは、「Alt+I, G」で GUID を挿入します。
フォーマットは、00000000-0000-0000-0000-000000000000 だけのようです。

最後に
個人的に、Insert Identifiers は「Alt+I, G」が押しにくいのと、フォーマットが選べないので却下。
GuidInserter2 を使うことにしました。

2014年10月21日火曜日

[gtest] 複数要素を持つパラメータでテストを書く

Google Test で値をパラメータとして扱う際に、パラメータに複数の要素を含めたい場合の書き方を説明します。

構造体をパラメータ化
ぱっと思いつく簡単な方法として構造体を使う方法があります。
struct Param
{
    int x;
    float y;
};

::std::vector<Param> make_param()
{
    ::std::vector<Param> v;
    for( int i=0; i < 5; ++i ) v.push_back(Param{ i, i*0.5f });
    return v;
}

class Test : public testing::TestWithParam<Param> {};
INSTANTIATE_TEST_CASE_P(A, Test, testing::ValuesIn(make_param()));

TEST_P(Test, A)
{
    Param p = GetParam();
    ::std::cout << p.x << ", " << p.y << ::std::endl;
}

ただ、これだと構造体の定義やパラメータの生成がやや面倒です。

tuple パラメータ
tuple をパラメータの型として扱う方法です。
class Test : public testing::TestWithParam< ::std::tuple<int, float> > {};
INSTANTIATE_TEST_CASE_P(A, Test, testing::Values(
    ::std::make_tuple(0, 0*0.5f)
    , ::std::make_tuple(1, 1 * 0.5f)
    , ::std::make_tuple(2, 2 * 0.5f)
    , ::std::make_tuple(3, 3 * 0.5f)
    , ::std::make_tuple(4, 4 * 0.5f)
    ));

TEST_P(Test, A)
{
    ::std::tuple<int, float> p = GetParam();
    ::std::cout << ::std::get<0>(p) << ", " << ::std::get<1>(p) << ::std::endl;
}

構造体の分だけ、すこ~しだけ簡単になった?気がします。
パラメータの構築は最初の例のように vector を返す関数で作ってもいいです。お好みでどうぞ。

iutest の場合
恒例の宣伝。
自作テスティングフレームワークである iutest では以下のようなに ::std::get を省略した書き方もできます。
class Test : public ::iutest::TestWithParam< ::std::tuple<int, float> > {};
IUTEST_INSTANTIATE_TEST_CASE_P(A, Test, ::iutest::Values(
    ::std::make_tuple(0, 0*0.5f)
    , ::std::make_tuple(1, 1 * 0.5f)
    , ::std::make_tuple(2, 2 * 0.5f)
    , ::std::make_tuple(3, 3 * 0.5f)
    , ::std::make_tuple(4, 4 * 0.5f)
    ));

IUTEST_P(Test, A)
{
    ::std::cout << GetParam<0>() << ", " << GetParam<1>() << ::std::endl;
}
[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ