アップデート
この記事は古いバージョンを対象にしています。Xcode 11以降については、以下の記事をご覧ください。
[clink url=”https://www.rk-k.com/archives/4007″]
概要
「googletest」はGoogleが公開しているC++のユニットテストのフレームワークです。Linux, Mac OS X, Windows, Cygwin, Window CE, Symbianなど色々なプラットフォームに対応しています。
これは試してみたい。そんな衝動に駆られ、試してみました。私の環境はOS X 10.8.4 + Xcode 4.6.3です。ちなみに、公開されているドキュメントでは、Xcodeの場合は別の手順(フレームワークを作る方法)も書かれていました。
ちなみにシェルツールとして実行するので、OS Xのシェルツールとしてビルドになります。
iOS向けの場合は、Xcode組み込みのテストフレームワークを使って、Objective-Cとしてテストする方が良さそうです。
セットアップ
まずは、「googletest」をダウンロードします。「googletest」は「Google Code」で公開されています。URLは次の通り。
http://code.google.com/p/googletest/
この記事を書いている時点での最新バージョンは1.6.0です。ですので、この記事は、1.6.0に基づいて書いています。
Xcodeで使う場合には、少し手順があります。他の環境と同じようにスタティックライブラリをビルドするという方法でも、もちろんできますが、フレームワークを作るようにした方が、SDKやコンパイラの変更などが簡単です。
詳しいことは、ここに書かれています。
http://code.google.com/p/googletest/wiki/XcodeGuide
ダウンロードしたアーカイブを展開すると、「xcode」というディレクトリがあるので、その中の「gtest.xcodeproje」を開きます。
次に、使えるようにするために設定します。ナビゲータエリアから「gtest」を選択して、プロジェクトの設定を開きます。
次に「Editor」メニューから「Validate Settings」を選択し、設定を最新の開発環境に合わせた設定にアップデートします。
次にいくつか設定を変更します。このとき、ターゲットではなく「PROJECT」の「gtest」(プロジェクトファイル)が選択されていることを確認してから操作します。
■OS X向けの場合
Base SDKを使用するSDKに変更。常に最新なら「Latest OS X」を選択
Architecturesを「Standard (32/64-bit Intel)に変更
Compiler for C/C++/Objective-Cから「Default Compiler (Apple LLVM compiler 4.2)」を選択
「gtest-internal-intl.h」の「pretty_」変数がエラーになるので、コメントアウト
■ビルド
「Product」メニューから「Archive」を実行します。
終わったらオーガナイザウインドウで「Distribute」ボタンをクリック。
「Save Built Products」を選択して、ビルドしたフレームワークを出力します。
■配置
出力したフォルダの中にある「gtest.framework」を「/Library/Frameworks」にコピーすれば完了です。
■使ってみる
プロジェクトを作って使ってみます。既存のプロジェクトを使いたいときは、ターゲットを追加します。
プロジェクトのテンプレートは、OS XのApplicationから「Command Line Tool」を選択します。
Typeは「C++」を選択します。
作ったプロジェクトの設定を開いて、「Build Phases」で「gtest.framework」を追加します。
次に、ターゲットの設定で「Build Settings」の「Framework Search Paths」に「/Library/Frameworks」を追加します。プロジェクトの準備はこれで完了です。
次に動くか確認します。次のようなものをmain.cppに書いてみました。動くかどうかをみたいだけなので、絶対に失敗するコードです。
#define GTEST_HAS_TR1_TUPLE 0 #include "gtest/gtest.h" namespace { class MyTest : public ::testing::Test { protected: MyTest() { } virtual ~MyTest() { } virtual void SetUp() { } virtual void TearDown() { } }; } int something(int i) { return i; } TEST_F(MyTest, MyTestSuite) { EXPECT_EQ(0, something(1)); } int main(int argc, const char * argv[]) { ::testing::InitGoogleTest(&argc, (char **)argv); return RUN_ALL_TESTS(); } [/cc]
100%失敗するコードです。関数「something」は渡されたものをそのまま返すだけですので、1を渡せば1が返る。しかし、0が返ることを期待するテスト。実行すると、次のように表示されます。
[==========] Running 1 test from 1 test case. [----------] Global test environment set-up. [----------] 1 test from MyTest [ RUN ] MyTest.MyTestSuite /Users/akira/Desktop/Sample/Sample/main.cpp:38: Failure > [ FAILED ] MyTest.MyTestSuite (0 ms) [----------] 1 test from MyTest (0 ms total) [----------] Global test environment tear-down [==========] 1 test from 1 test case ran. (0 ms total) [ PASSED ] 0 tests. [ FAILED ] 1 test, listed below: [ FAILED ] MyTest.MyTestSuite 1 FAILED TEST[/cc]
予定通り、失敗が検出されました。関数「something」に渡す引数を0にします。今度は成功するので、成功したログが出力されればOKです。
[==========] Running 1 test from 1 test case. [----------] Global test environment set-up. [----------] 1 test from MyTest [ RUN ] MyTest.MyTestSuite [ OK ] MyTest.MyTestSuite (0 ms) [----------] 1 test from MyTest (0 ms total) [----------] Global test environment tear-down [==========] 1 test from 1 test case ran. (0 ms total) [ PASSED ] 1 test. [/cc]
これで、Xcodeから「googletest」が使用できるようになりました。