■
個人的には、TDD(テスト駆動開発:Test Driven Development)ってのが好きなんですが、Mac + XCode が中心の生活に移ってからというもの、環境が思うように整わなかったのと、使い捨てのようなコードばかりを書いていたこともあってまともなテストを書いていませんでした.
# CppUnit を使わずに、自作の簡易テスト環境で小さなテストなら書いていました
が、今年の頭ぐらいからがきがきとプロトタイプの開発を行っていた案件が徐々に本格化してきてしまって、さすがにまともなテストが残っていないことが辛くなってきたわけです.
やっぱり、テストがあると開発の安心感が違うよね、、、
ってことで、XCode から CppUnit を利用できるようにしましたってお話です.
お品書きはこんな感じになります.
・ 環境
・ Homebrew の特徴
・ Homebrew から CppUnit をインストールする
・ XCode から CppUnit を利用する
・ 簡単なテストコード
・ まとめ
そいでは、さくっとまとめていきますのでよろしくお願いします.
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/