「googletest」をXcodeで使う

アップデート

この記事は古いバージョンを対象にしています。Xcode 11以降については、以下の記事をご覧ください。

概要

「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」が使用できるようになりました。

投稿者プロフィール

林 晃
林 晃macOS/iOSアプリ/SDK/ミドルウェア開発が専門の開発者
アールケー開発代表。macOS/iOSアプリ/SDK/ミドルウェア開発が専門の開発者。ObjC/Swift/C++使い。豊富な開発実務経験を基に、教育コンテンツ開発、技術書執筆、技術指導、技術セミナー講師、企業内研修講師、行政・自治体職員研修講師も行います。

基礎から学ぶMetal


「基礎から学ぶMetal」を執筆しました。本書はMetalを使ってGPUプログラミングを行うための最初のステップを解説するMetalの解説書です。

私が初めてGPUプログラミングを行ったとき、どこから手をつけて、学んでいけば良いのか分からず呆然としました。もし、あのとき、これを教えてくれればという部分を解説しました。本書で解説している部分はMetalの基礎となる部分で、Metalを使うときに必ず触れることになる部分です。

詳細

基礎から学ぶSwiftUI


「基礎から学ぶ SwiftUI」というタイトルの本を執筆しました。

SwiftUIの入門書です。

SwiftUIのコンセプトは「ユーザーインターフェイスを作るための最短パスを提供する」「一度学べば(Appleのプラットフォームの)どこにでも適用できる」です。

SwiftUIの概要から始まって、一つ一つのテクノロジートピックに注目しながらSwiftUIとは何か?どんなことができるのか?どのようなコードを書けば良いのかなどを丸々一冊使って解説しています。

詳細

最近の著書

  1. 基礎から学ぶ SwiftUI

最近の記事