Google Testのアサーションをいろいろ使ってみる [Google Test]
前回に引き続き,Google Testを試してみる.
Google Testにはいろいろなアサーションが用意されてるので,それを試してみる.
前回と同様に適当なディレクトリにassert_projというディレクトリを作って,ファイル構成は以下のようにしてやる.なお,今回はアサーションのテストだけしかしないので,作成するファイルはCMakeLists.txtとassert_unittest.cppだけだ.
CMakeLists.txt
assert_unittest.cpp
じゃあビルド.前回と同様,assert_buildディレクトリを作ってビルド.
これで,assert_testバイナリが生成される.
実行は,
でOK.ARGS=-Vにすると詳細が表示されるんだけど,テストに失敗したときだけ詳細が表示されればいいんだったら,ARGS=--output-on-failureにするといい.ま,テスト成功のときはシンプルな表示で失敗のときにいろいろ表示されるほうが使いやすいかも.
アサーションの説明は,Google Test ドキュメント日本語訳の入門ガイドにあるアサーションあたりを読むと分かると思う.
ま,それだけだと寂しいので,テストの内容をいくつか,ざっくり書いとく.
TEST(TestAssert, Message)
アサーションに失敗したときにメッセージを出力するもの.flagがfalseのときに失敗して,「test failed at index 1」というメッセージが追加で表示される.成功のときはメッセージは表示されない.
TEST(TestAssert, Class)
値の比較をするアサーションは,組み込み型ならそのまま使える.もしユーザ定義型でも使いたい場合は,比較演算子を用意してやれば使える.今回の場合だと,EXPECT_EQとEXPECT_NEを使うので,==演算子と!=演算子を用意してやればよい.
TEST(TestAssert, CStr)
C言語文字列を比較したいときは,EXPECT_EQではなく,EXPECT_STREQを使う.EXPECT_EQだとポインタの比較になってしまい文字列そのものの比較にならない.
とりあえず今回はここまで.
お試しあれ.
Google Testにはいろいろなアサーションが用意されてるので,それを試してみる.
前回と同様に適当なディレクトリにassert_projというディレクトリを作って,ファイル構成は以下のようにしてやる.なお,今回はアサーションのテストだけしかしないので,作成するファイルはCMakeLists.txtとassert_unittest.cppだけだ.
assert_proj/ ├── CMakeLists.txt └── test └── assert_unittest.cpp
CMakeLists.txt
cmake_minimum_required(VERSION 2.6) project(assert_test) enable_testing() find_package(Threads) 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) add_executable(assert_test test/assert_unittest.cpp) target_link_libraries(assert_test gtest gtest_main) target_link_libraries(assert_test ${CMAKE_THREAD_LIBS_INIT}) add_test(NAME assert_test COMMAND assert_test)
assert_unittest.cpp
#include <gtest/gtest.h> // message output test TEST(TestAssert, Message) { bool flag[2] = {true, false}; for (int i = 0; i < 2; i++) { EXPECT_TRUE(flag[i]) << "test failed at index " << i; } } // bool test TEST(TestAssert, AssertTrue) { EXPECT_TRUE(true); ASSERT_TRUE(true); } TEST(TestAssert, AssertFalse) { EXPECT_FALSE(false); ASSERT_FALSE(false); } // value test TEST(TestAssert, Value) { int expected = 2; int actual = 2; EXPECT_EQ(expected, actual); // expected == actual int val1, val2; val1 = val2 = 3; EXPECT_NE(val1 , val2+1); // val1 != val2 EXPECT_LE(val1 , val2 ); // val1 <= val2 EXPECT_GE(val1 , val2 ); // val1 >= val2 EXPECT_LT(val1 , val2+1); // val1 < val2 EXPECT_LE(val1 , val2+1); // val1 <= val2 EXPECT_GT(val1+1, val2 ); // val1 > val2 EXPECT_GE(val1+1, val2 ); // val1 >= val2 } // class test class Point { private: int x_; int y_; public: Point(int x, int y) : x_(x), y_(y) {} bool operator==(const Point& obj) const { return (x_ == obj.x_) && (y_ == obj.y_); } bool operator!=(const Point& obj) const { return !(*this == obj); } }; TEST(TestAssert, Class) { Point a(0, 0); Point b(0, 1); EXPECT_EQ(a, a); EXPECT_NE(a, b); } // c string test TEST(TestAssert, CStr) { char str1[] = "aaa"; char str2[] = "aaa"; EXPECT_NE(str1, str2); EXPECT_STREQ(str1, str2); // "aaa" vs "aaa" strcpy(str2, "Aaa"); EXPECT_STRNE(str1, str2); // "aaa" vs "Aaa" EXPECT_STRCASEEQ(str1, str2); // "aaa" vs "Aaa" strcpy(str2, "bAA"); EXPECT_STRCASENE(str1, str2); // "aaa" vs "bAA" }
じゃあビルド.前回と同様,assert_buildディレクトリを作ってビルド.
mkdir assert_build cd assert_build/ cmake ../assert_proj/ make
これで,assert_testバイナリが生成される.
実行は,
make test ARGS=--output-on-failure
でOK.ARGS=-Vにすると詳細が表示されるんだけど,テストに失敗したときだけ詳細が表示されればいいんだったら,ARGS=--output-on-failureにするといい.ま,テスト成功のときはシンプルな表示で失敗のときにいろいろ表示されるほうが使いやすいかも.
アサーションの説明は,Google Test ドキュメント日本語訳の入門ガイドにあるアサーションあたりを読むと分かると思う.
ま,それだけだと寂しいので,テストの内容をいくつか,ざっくり書いとく.
TEST(TestAssert, Message)
アサーションに失敗したときにメッセージを出力するもの.flagがfalseのときに失敗して,「test failed at index 1」というメッセージが追加で表示される.成功のときはメッセージは表示されない.
TEST(TestAssert, Class)
値の比較をするアサーションは,組み込み型ならそのまま使える.もしユーザ定義型でも使いたい場合は,比較演算子を用意してやれば使える.今回の場合だと,EXPECT_EQとEXPECT_NEを使うので,==演算子と!=演算子を用意してやればよい.
TEST(TestAssert, CStr)
C言語文字列を比較したいときは,EXPECT_EQではなく,EXPECT_STREQを使う.EXPECT_EQだとポインタの比較になってしまい文字列そのものの比較にならない.
とりあえず今回はここまで.
お試しあれ.