[iOS] CocoaPods を導入して GHUnit と OCMock を使って単体テストを書く
はじめに
このたび業務で 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 から開くようにします。
プロジェクトを開き、以下のように表示されていれば無事にインストール完了です。
GHUnit と OCMock を使う
Target を作成する
まずは単体テスト用の Target を作成します。まずはプロジェクトを選択して「Add Target」をクリックします。
テンプレートは「Empty Application」にします。
ProjectName は「GHUnit」にします。ここは好きな名前でOKです。また「Use Core Data」「Use Automatic Reference Counting」「Include Unit Tests」のチェックを外します。
これで Target が作成されるので、次に下図で選択されている不要なファイルを削除します。
次に「Build Settings」の「Other Linker Flags」に -all_load と -ObjC を追加します。
最後に「Build Phases」の「Link Binary With Libraries」に「QuartzCore.framework」を追加して終わりです。
GHUnit と OCMock をインポートする
次に Podfile を編集し、GHUnit と OCMock をインストールしましょう。Podfile の記述方法がポイントで、以下のように GHUnit のみにインポートされるようにします。こうすることでアプリケーション本体にテスト用のライブラリが入らなくなります。
Podfile
platform :ios target :GHUnit do pod 'GHUnitIOS' pod 'OCMock' end
pod install をコマンドで実行するとライブラリがインポートされます。
pod install
テストを書いてみる
適当にテストを書いてみましょう。まず新規クラスを作ります。テストクラスは「GHTestCase」を継承します。
「Targets」は「GHUnit」のみにチェックが入るようにします。
あとはテストを書いていきます。まずはヘッダファイルで 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 してください。
下図のような画面が表示されます。「Run」をタップするとテストが実行されます。
まとめ
CocoaPods を使うとライブラリを簡単に導入できるので、すぐ単体テストを書き始められますね。iPhone アプリ開発には必須だと思うので、もし導入方法を忘れちゃったときの備忘録にしてもらえればと思います。GHUnit と OCMock の使いかたの詳細はまた別に執筆したいと思います。