個人的には、TDD(テスト駆動開発:Test Driven Development)ってのが好きなんですが、Mac + XCode が中心の生活に移ってからというもの、環境が思うように整わなかったのと、使い捨てのようなコードばかりを書いていたこともあってまともなテストを書いていませんでした.
# CppUnit を使わずに、自作の簡易テスト環境で小さなテストなら書いていました

が、今年の頭ぐらいからがきがきとプロトタイプの開発を行っていた案件が徐々に本格化してきてしまって、さすがにまともなテストが残っていないことが辛くなってきたわけです.

やっぱり、テストがあると開発の安心感が違うよね、、、
ってことで、XCode から CppUnit を利用できるようにしましたってお話です.

お品書きはこんな感じになります.

・ 環境
・ Homebrew の特徴
・ Homebrew から CppUnit をインストールする
XCode から CppUnit を利用する
・ 簡単なテストコード
・ まとめ


そいでは、さくっとまとめていきますのでよろしくお願いします.

環境

Max OS X : 10.7.3
XCode : Version 4.3.2 (4E2002)
Homebrew : 0.9

Homebrew の特徴

入手は、以下のページから行えるらしい.
# 私は、以前 Gauch をインストールして遊んでいたので、インストールの手順は割愛

http://mxcl.github.com/homebrew/

「Homebrewって何?」って人は、MacPorts とか Cygwin とかを思い浮かべれば良い.
ま、mac 向けの パッケージ管理システムって位置づけらしい.
mac 環境では MacPorts のユーザが多いらしいが、最近(?)ではHomebrew を導入するひとが多くなっているようだ.
Homebrew の特徴は、MacPorts と比べてパッケージ間の依存関係が低く、OS X に標準で用意されているものは、極力 OS 標準のものを使おうとするという特徴があるようです.

Homebrew から CppUnit をインストールする

Homebrew を利用する際に最低限覚えておきたいコマンドを一覧にしておく.

brew update インストールされているパッケージと、Homebrew 自体をアップデートする
brew search $(NAME) インストール可能な$(NAME)を検索する
brew install $(NAME) $(NAME)をインストールする
brew list インストールされているパッケージを一覧表示する
brew uninstall $(NAME) $(NAME)をアンインストールする

この程度を利用できれば、当面は問題ないと思う.
CppUnit をインストールする実例を示すと、以下のようになる.($ はプロンプト)

$ brew search cppunit
cppunit

$ brew install cppunit
==> Downloading http://downloads.sourceforge.net/project/cppunit/cppunit/1.12.1/cppunit-1.12.1.tar.
############################################################################################ 100.0%
==> ./configure --prefix=/usr/local/Cellar/cppunit/1.12.1 --disable-debug
==> make install
Warning: m4 macros were installed to "share/aclocal".
Home-brew does not append "/usr/local/share/aclocal"
to "/usr/share/aclocal/dirlist". If an autoconf script you use
requires these m4 macros, you'll need to add this path manually.
==> Summary
/usr/local/Cellar/cppunit/1.12.1: 91 files, 1.4M, built in 23 seconds

$ brew list
cppunit     gauche

homebrew では、 /usr/local 以下に対して必要なファイルをインストールする.
上の例では、"/usr/local/Cellar/cppunit/1.12.1" にインストールが行われている.

とはいえ、インストール時に /usr/local/include/cppunit や /usr/local/libcppunit.a のようなシンボリックリンクが作成されているので、直接参照するのでは無く、シンボリックリンクを利用すれば良い.

XCode から CppUnit を利用する

XCodeからCppUnitを利用するにあたって、テストコードのプロジェクトの設定に以下を書き加える.

Header Search Paths : /usr/local/include
Library Search Paths : /usr/local/lib
Other Linker Flag : -L/usr/local/lib -lcppunit -ldl

最初はこのあたりがわからずに、Finder から /usr/local/lib/libcppunit.a をプロジェクトに突っ込んで TARGET の [Build Phase]からcppunit のライブラリをリンクするようにしてみたりしていたのだが、実行時に dylib の参照とかで落ちてしまっていた.

簡単なテストコード

動作確認用のコードとして、以下のコードをこしらえた.

#include <cppunit/TestCase.h>
#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/ui/text/TestRunner.h>
#include <cppunit/TestResultCollector.h>
#include <cppunit/CompilerOutputter.h>

class SampleTest
    : public CppUnit::TestFixture
{
  public:
    CPPUNIT_TEST_SUITE( SampleTest );
    CPPUNIT_TEST( testSample );
    CPPUNIT_TEST_SUITE_END();

  public:
    /// テスト開始前の初期化処理
    virtual void setUp()
    {
    }

    /// テスト終了の解放処理
    virtual void tearDown()
    {
    }
  public:
    void testSample()
    {
        CPPUNIT_ASSERT( false );
    }
};

int main(int argc, const char * argv[])
{
    CppUnit::TextTestRunner a_runner;
    CppUnit::Outputter* a_outputter = CppUnit::CompilerOutputter::defaultOutputter( &a_runner.result(), std::cout );
    a_runner.setOutputter( a_outputter );
    a_runner.addTest( SampleTest::suite() );
    a_runner.run();

    return 0;
}

以前は、windows環境でCppUnitを利用していた点もあり、XmlOutputter を利用して出力をおこなっていたが、mac環境に移ってきて、XML + XSL をはいたところで便利じゃ無いことに気がついたので、
CompilerOutputter に出力を行うようにした.


ちなみに、XCode の超入門なのかもしれないが、XmlOutputter を利用した見たときに、ファイルの出力先っちうか、作業ディレクトリがどこになっているのかがわからずにちと困った.

細かなパスはプロジェクトによって異なるが、ライブラリ以下の次のようなパスが実行ファイルの出力先および作業ディレクトリになっている

~/Library/Developer/Xcode/DerivedData/CppUnitTest_brew-euekaqxnlifyhccjeervnrkulgfj/Build/Products/Debug/

まとめ

Homebrew の簡単な使い方と、Homebrew を利用して CppUnit をインストールする方法を書きました.
また、XCode 上から CppUnit を利用する方法を書きました.

これで、やっとまともなテスト環境が手に入ったようなので、安心して開発が継続できそうです.

、、、ところで、いまどき単体テストを利用していないプロジェクトなんて無いですよね?