Google Testを使ってみる

何もしてないというわけではないんですよ、一応は...

Google C++ Testing Framework

GTest (Google C++ Testing Framework)というライブラリがあります。

これは何かと言うと、名前の通りC++のテストをするためのフレームワークで、テストを割ときれい・簡単に実装することができます。

以前から存在は知っていたのですが、唐突に気が向いたので使ってみることにしました。

オレオレなライブラリの検証とかに使えるんじゃないですかね。

導入

GoogleTestのサイトからzipをDL。おもむろに展開してビルド。

$ unzip gtest-1.6.0.zip
$ cd gtest-1.6.0
$ cmake .
$ make

includeと、出来上がったlibgtest*.aをパスの通ったところへコピーライブラリファイルをインストールするのは推奨されないらしい。

$ sudo cp -r include/gtest /usr/local/include
$ sudo cp libgtest*.a /usr/local/lib

使う

関数・テストコードを書く。

File: test.cpp

#include <gtest/gtest.cpp>

int add(int a, int b){
  return a+b;
}

TEST(TestCase, Test1){
  ASSERT_EQ(5, add(2,3));
}

main文は要りません。libgtest_main.aに含まれています。このテストコードが重要で、それぞれのテストを独立に実行したりできます。

とは言っても、それだけなら自分で書いても良いのですがね。

コンパイルして実行。

$ g++ test.cpp -lgtest -lgtest_main -lpthread
$ ./a.out
Running main() from gtest_main.cc
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from TestCase
[ RUN ] TestCase.Test1
[ OK ] TestCase.Test1 (0 ms)
[----------] 1 test from TestCase (0 ms total)
[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (0 ms total)
[ PASSED ] 1 test.

とまあ、いい感じに結果が出力されます。試しに間違った関数を実装するときちんと失敗を教えてくれます。

複数の値に対するテストや、テンプレートパラメータに対してもコピペすること無くテストするマクロが用意されており、使い倒すほど便利そうな感じがしますね。

CMake

いちいちコンパイラにオプションを与えるのは面倒なのでCMakeを使います。というか私がMakefile書けません

CMakeから使う場合、CMakeLists.txtに

cmake_minimum_required(VERSION 2.8)
include(FindGTest)
add_executable(test test.cpp)
target_link_libraries(test pthread ${GTEST_BOTH_LIBRARIES})

と書いて終わりです。カンタン。

追記(2012/10/31)

コンパイル済みライブラリをインストールするのは推奨されないようです。

Google Test とテストコードを,それぞれ異なるコンパイラフラグでコンパイルすると,(例えば,Google Test では #if を利用しているので)同じクラス/関数/変数に別の定義があるように見える可能性があります. したがって,混乱しないためにも,コンパイル済みの Google Test ライブラリをインストールしないことをお勧めします.代わりに,プロジェクトごとに Google Test 自体をコンパイルして,Google Test とテストのコンパイルに確実に同じフラグが使われるようにしてください. opencv.jp内のFAQより