[iOS] CocoaPods を導入して GHUnit と OCMock を使って単体テストを書く

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

このたび業務で iOS のテストを書くことになりました。まずは導入としてライブラリ管理ツール「CocoaPods」の導入、そして単体テスト用のライブラリ「GHUnit」と「OCMock」をインストールするまでの手順をメモしておこうと思います!

CocoaPods を導入する

まず Ruby の動作環境が必要です。プリインストールされている Ruby をそのまま使っても構いませんが、最新バージョンの Ruby を使ったほうが良いと思います。Ruby のインストール手順は以下のエントリにまとまっているので参考にしてください。

rbenvとruby-buildで複数バージョンのrubyをインストール | Developers.IO

Ruby のインストールが完了したら以下のコマンドで CocoaPods をインストール・セットアップします。

gem install cocoapods
cd /path/to/MyApp # プロジェクトフォルダに移動する
pod setup
vim Podfile # Podfile を作成する
pod install

Podfile はプロジェクト直下に置きます。この中にアプリケーションに追加したいライブラリを書いて pod install を実行するとライブラリをインポートしてくれます。以下のように記述します。

Podfile

platform :ios
pod 'JSONKit'

pod install を実行すると アプリ名.xcworkspace というファイルができていると思います。今後 Xcode でプロジェクトを開くときは アプリ名.xcodeproj ではなく アプリ名.xcworkspace から開くようにします。

unit_test01

プロジェクトを開き、以下のように表示されていれば無事にインストール完了です。

unit_test02

GHUnit と OCMock を使う

Target を作成する

まずは単体テスト用の Target を作成します。まずはプロジェクトを選択して「Add Target」をクリックします。

unit_test03

テンプレートは「Empty Application」にします。

unit_test04

ProjectName は「GHUnit」にします。ここは好きな名前でOKです。また「Use Core Data」「Use Automatic Reference Counting」「Include Unit Tests」のチェックを外します。

unit_test05

これで Target が作成されるので、次に下図で選択されている不要なファイルを削除します。

unit_test06

次に「Build Settings」の「Other Linker Flags」に -all_load と -ObjC を追加します。

unit_test07

最後に「Build Phases」の「Link Binary With Libraries」に「QuartzCore.framework」を追加して終わりです。

unit_test08

GHUnit と OCMock をインポートする

次に Podfile を編集し、GHUnit と OCMock をインストールしましょう。Podfile の記述方法がポイントで、以下のように GHUnit のみにインポートされるようにします。こうすることでアプリケーション本体にテスト用のライブラリが入らなくなります。

Podfile

platform :ios

target :GHUnit do
    pod 'GHUnitIOS'
    pod 'OCMock'
end

pod install をコマンドで実行するとライブラリがインポートされます。

pod install

テストを書いてみる

適当にテストを書いてみましょう。まず新規クラスを作ります。テストクラスは「GHTestCase」を継承します。

unit_test09

「Targets」は「GHUnit」のみにチェックが入るようにします。

unit_test10

あとはテストを書いていきます。まずはヘッダファイルで OCMock をインポートします。

SampleTest.h

#import "GHTestCase.h"
#import "OCMock.h"

@interface Sample : GHTestCase

@end

次に実装ファイルに実際のテストを簡単に書いてみます。

SampleTest.m

#import "Sample.h"

@implementation Sample
- (void)test_sample
{
    id mock = [OCMockObject mockForClass:NSString.class];
    [[[mock stub] andReturn:@"SAMPLE"] uppercaseString];
    GHAssertEqualStrings(@"SAMPLE", [mock uppercaseString], @"match");
}
@end

一行目では NSString クラスのモックを作っています。二行目では andReturn メソッドを使って NSString#uppercaseString メソッドの戻り値を強制的に @"SAMPLE" としています。三行目ではモックに対して uppercaseString を呼び出し GHAssertEqualStrings で比較しています。
あとは実行してみます。テストを実行するには「Scheme」を「GHUnit」に変更して Run してください。

unit_test11

下図のような画面が表示されます。「Run」をタップするとテストが実行されます。

unit_test12

まとめ

CocoaPods を使うとライブラリを簡単に導入できるので、すぐ単体テストを書き始められますね。iPhone アプリ開発には必須だと思うので、もし導入方法を忘れちゃったときの備忘録にしてもらえればと思います。GHUnit と OCMock の使いかたの詳細はまた別に執筆したいと思います。

参考

  • main.m の修正が抜けているような?