iOSアプリのUnitTestテストをKiWiで実現するぜ!
前回の投稿までで、MacにJenkins環境を構築できたので、次にiOSアプリの自動テストをJenkinsに組み込みたい。BDD(Behavior Driven Development) FrameworkのKiwiを導入することにしたぜ!Kiwiは、BDD framework for Objective-Cで、詳しい解説は、ここにあるぞ。
(1) まずは、CocoaPodsをインストールする。これはiOSプロジェクトに、Kiwiを組み込むために必須。
まずは、CocoaPodsをインストール。
$ [sudo] gem install cocoapods $ pod setup
(2) 次に、Unit Test Targetをセットアップ。
Project Navigatorで、Projectを選択した際に、既にUnit Test Targetが存在するなら、このステップは不要。
なければ、Unit Test Targetを追加しておこう。
1. Project Navigatorで、Projectを選択。
2. 以下で、Cocoa Touch Unit Testing BundleをProjectに追加。
File -> New -> Target... -> Other -> Cocoa Touch Unit Testing Bundle
3. 適切な名前をつけて"Finish"をクリック。
こんな感じで、Unit Test Targetがprojectに追加されていればOK。以下の例では、MyLocationsTestsが、Unit Test Targetだ。
(3)Podsのインストール
次にiOS project用のPodfileを作成する。このファイルには、CocoaPodsが管理すべきlibraryを記載する。
1. まず、Xcodeプロジェクトを終了させる。
2. .xcodeprojがあるのと同じディレクトリにPodfileという名前のファイルを作成し、以下のように記載する。
前のステップまでに作成したUnit Test Targetの名前を使う必要がある(この例では、MyLocationsTest)。
# Podfile # Uncomment this line to define a global platform for your project platform :ios, '7.0' source 'https://github.com/CocoaPods/Specs.git' target 'MyLocationsTests' do pod "Kiwi" end
3. Podsのインストール。
以下を実行すると、CocoaPodsが必要なlibraryをダウンロードし、設定してくれる。
$ pod install
4.今後は、xcode projectをオープンする、.xcworkspaceを使う。
$ open myproject.xcworkspace
(4) Unit Test Targetの設定
Build settingタブを選択し、Other Linker flagsに、-ObjC -framework SenTestingKit を設定しよう。これがないとWikiが動かないぞ!
(5) Schemesの設定
Xcodeは、Schemeと呼ばれる仕組みを使って、どのTargetをどんな設定でビルドするかを決定している。
1. Scheme Managementを開く。
Product -> Scheme -> Manage Schemes...
2. Projectと同じ名前のSchemeがあると思うので、それをShared設定してください。
3. 今度は、Edit Schemeする。
4. 左側のPaneからTestを選択し、Unit Test Target (MyLocationsTests)がリストされており、右端のTestフィールドにチェックが入っていることを確認する。もしなければ、"+"を押して追加しよう。以下のようになっていればOKだ。
(6) テストを書く
やっと、環境が構築できたので、試しに何かのテストを書いてみよう。
1. Test caseをprojectに追加する。すでに.mファイルが、存在する場合は必要ない。
多分、ここまでで、MyLocationsTests.mがMyLocationsTestフォルダに存在するので、それを使えば良い。もし存在しないなら、以下のようにしてファイルを作成する。
File -> New -> File -> Test Case Class
以下のようにすれば、Unit Test TargetのMyLocationsTestsフォルダに、SampleTest.mが作成されるはずだ。
2. Unit Test TargetのMyLocationsTestsフォルダにある、.mファイルに、以下のようなテストを書く。
#import "Kiwi.h" SPEC_BEGIN(MathSpec) describe(@"Math", ^{ it(@"is correctly answered", ^{ NSUInteger a = 16; NSUInteger b = 26; [[theValue(a + b) should] equal:theValue(42)]; }); }); describe(@"Math", ^{ it(@"is wonglyy answered", ^{ NSUInteger a = 20; NSUInteger b = 10; [[theValue(a - b) should] equal:theValue(9)]; }); });
3. テストを実行する。
以下で実行するか、デフォルトホットキーの Command-Uで、テストを実行する。
Product -> Test
ビルドが開始され、Simulator上でアプリが起動した後、さらに、テストが自動的に実行される。
この例では、2つめのテストでエラーになる。
すると、デスクトップ上に、以下のような画面が表示される。
この画面をクリックすると、以下のようなテスト結果が表示されるぜ。テストでFailした箇所がわかるので、Debugしよう。
デバッグ後、再度、Command-Uでテストを実行すると、以下のようになり、2つのテストケースがパスしたことがわかる。
やったー。これで、iOSのUnitTestをKiwiで組み込み成功したぜ。次は、いよいよJenkinsで、Gitにコードをコミットするたびに、自動的にビルドとテストを実行させるぜ!