SSブログ

Google Testの上級ガイドにある「その他のアサーション」を試してみる [Google Test]

Google Testには本当にいろいろなアサーションが用意されている.
詳細は,「上級ガイド — Google Test ドキュメント日本語訳」に記載されてるので,そっちを参照してもらうとして,とりあえずその上級ガイドにある,「その他のアサーション」についていくつか試してみた.

で,詳細を説明しようと思ったけど,まぁ上級ガイドに書かれてることを試そうなんて人は,上記のドキュメントを読めば内容は理解できると思うので,とりあえず試したコードとメモ程度の内容だけ示しておくにとどめとく.ってまぁ説明するのが面倒なのと,実際のところ説明って言っても結局ドキュメントに書かれてることそのままになっちゃうからなんだけど.

というわけで,まずはディレクトリ構成.まぁいつもと同じなんだけど...
gtest_advanced_proj/
├── CMakeLists.txt
├── compiler_settings.cmake
└── test
    └── advanced_unittest.cpp


compiler_settings.cmakeは以前から変更が無いので省略して,それ以外のファイルを示すと,

CMakeLists.txt.
cmake_minimum_required(VERSION 2.6)
project(gtest_advanced_test)

include (compiler_settings.cmake)

enable_testing()
set(CMAKE_INCLUDE_CURRENT_DIR ON)
message(STATUS GTEST_DIR=$ENV{GTEST_DIR})

include_directories($ENV{GTEST_DIR}/include)
link_directories($ENV{GTEST_DIR}/lib)

cxx_test(gtest_advanced_test "" test/advanced_unittest.cpp)


test/advanced_unittest.cpp
#include <gtest/gtest.h>

TEST(AdvancedTest, Succeed)
{
    SUCCEED();
}

TEST(AdvancedTest, Fail)
{
    FAIL() << "FAIL() is always fail.";   // 常に失敗
}

bool do_something(int x, int y)
{
    return x == y;
}

TEST(AdvancedTest, Predicate)
{
    int a = 3;
    int b = 5;
    EXPECT_PRED2(do_something, a, b);
    EXPECT_TRUE(do_something(a, b));
}

namespace testing {
AssertionResult AssertionSuccess();
AssertionResult AssertionFailure();
}

::testing::AssertionResult IsEven(int n)
{
    if ((n % 2) == 0) {
        return ::testing::AssertionSuccess();
    } else {
        return ::testing::AssertionFailure() << n << " is odd";
    }
}

bool IsEvenSimple(int n)
{
    return (n % 2) == 0;
}

int add(int x, int y)
{
    return x + y;
}

TEST(AdvancedTest, AssertionResult)
{
    EXPECT_TRUE(IsEven(add(3, 2)));
    EXPECT_TRUE(IsEvenSimple(add(3, 2)));
}

::testing::AssertionResult AssertDoSomething(const char* m_expr,
                                             const char* n_expr,
                                             int m,
                                             int n)
{
    if (do_something(m, n)) {
        return ::testing::AssertionSuccess();
    } else {
        return ::testing::AssertionFailure()
            << m_expr << " and " << n_expr << " ( " << m << " and " << n << ")"
            << " are not same.";
    }
}

TEST(AdvancedTest, PredicateFormat)
{
    int a = 5;
    int b = 8;
    EXPECT_PRED_FORMAT2(AssertDoSomething, a, b);
}

TEST(AdvancedTest, Float)
{
    float x = 0.1;
    float y = 0.01;
    EXPECT_EQ(x, y * 10) << "using EXPECT_EQ()";
    EXPECT_FLOAT_EQ(x, y * 10) << "using EXPECT_FLOAT_EQ()";
}

template <typename T> class Foo {
    public:
        void Bar() {
            ::testing::StaticAssertTypeEq<int, T>();
        }
};

void Test1()
{
    // 以下は::testing::StaticAssertTypeEqによりコンパイルエラーを発生させてくれる
    // コンパイルできなくなり,他のテストを試せなくなるのでコメントアウト
    /*
     * Foo<bool> foo;
     * foo.Bar();
     */
}


で,内容だけど,前半は主にテスト結果をいかに分かりやすくするかって感じのいろいろな機能で,エラーのときの表示を指定する方法なんかが書かれてる.これらは分かりやすいテストを書くには必要だし,あると便利なんだろうけど,まぁ面倒であまり使わない気もする...
あとは浮動小数点のテストと型の一致テストがちょろっと書かれてる.こっちはそこそこ使うかも.

んー,手抜きだな,今回は特に... まぁ,お試しあれ.
タグ:gtest
nice!(0)  トラックバック(0) 
共通テーマ:日記・雑感

nice! 0

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。