以前、「フレームワークのテストとデバッグ」ということで、SenTestingKitフレームワークを使ったテキスト版TestRunnerについて紹介した訳だが、これがMacOSX10.5から使えなくなっていることが分かった。
調べて見ると、SenTestingKitフレームワークが/System/Library/Frameworksから無くなって、/Developer/Library/Frameworksに移動している。
フレームワークが消滅した訳ではないが、/Developer/Library/Frameworksは、実行時のライブラリ検索パスに入ってないらしく、ビルドはできても実行できない。
そして、XCodeのテスト機能は、依然としてビルド時に実行されてしまうため、そこからデバックに繋げることができない。
そういう訳で、テキスト版TestRunnerを自前で作って見ました。
特別なフレームワークは使っていませんが、作ってみると以外と簡単でした。
CocoaのNSAssertを拡張する形で作っており、Objective-Cのruntime APIを使って、テストケースを自動的に検索するため、テストは[TestRunner run];の1文で実行できます。
また、Objective-C++の関数オーバーロードを利用しているため、assertEquals()一つで、id, int, floatなど複数の型に対応し、テストが書きやすくなっています。
それと、テスト時間の計測に最初は、mach_time APIを利用していたのだけど、これが PowerPC Macでは使えるのに、Intel Macだと何故か使えないんですよね。同じバージョンのOSなのに、困ったものです。
しかたがないので、CoreServicesのAbsoluteTime APIに変更しました。ADCのドキュメントの方でも、mach_time APIよりもAbsoluteTime APIの方を優先して使うような感じのことが書かれていました。
でも、AbsoluteTime APIは、64bitをサポートしてない感じで、微妙に使いづらい。