Passion+Action+Sincerely=Success!

週末にのみ趣味でコーディングするおやじの備忘録

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

スクリーンショット 2014-11-03 13.16.18

3. 適切な名前をつけて"Finish"をクリック。

スクリーンショット 2014-11-03 13.16.57

こんな感じで、Unit Test Targetがprojectに追加されていればOK。以下の例では、MyLocationsTestsが、Unit Test Targetだ。
スクリーンショット 2014-11-03 13.17.12

(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...

スクリーンショット 2014-11-03 14.12.47

2. Projectと同じ名前のSchemeがあると思うので、それをShared設定してください。

スクリーンショット 2014-11-03 14.13.12

3. 今度は、Edit Schemeする。

スクリーンショット 2014-11-03 14.27.35

4. 左側のPaneからTestを選択し、Unit Test Target (MyLocationsTests)がリストされており、右端のTestフィールドにチェックが入っていることを確認する。もしなければ、"+"を押して追加しよう。以下のようになっていればOKだ。

スクリーンショット 2014-11-03 14.29.49

(6) テストを書く

やっと、環境が構築できたので、試しに何かのテストを書いてみよう。

1. Test caseをprojectに追加する。すでに.mファイルが、存在する場合は必要ない。

多分、ここまでで、MyLocationsTests.mがMyLocationsTestフォルダに存在するので、それを使えば良い。もし存在しないなら、以下のようにしてファイルを作成する。

File -> New -> File -> Test Case Class

以下のようにすれば、Unit Test TargetのMyLocationsTestsフォルダに、SampleTest.mが作成されるはずだ。

スクリーンショット 2014-11-03 14.58.34 スクリーンショット 2014-11-03 14.59.18

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つめのテストでエラーになる。
すると、デスクトップ上に、以下のような画面が表示される。

スクリーンショット 2014-11-03 15.06.04

この画面をクリックすると、以下のようなテスト結果が表示されるぜ。テストでFailした箇所がわかるので、Debugしよう。

スクリーンショット 2014-11-03 15.08.56

デバッグ後、再度、Command-Uでテストを実行すると、以下のようになり、2つのテストケースがパスしたことがわかる。

スクリーンショット 2014-11-03 15.11.04

スクリーンショット 2014-11-03 15.11.13

 

やったー。これで、iOSのUnitTestをKiwiで組み込み成功したぜ。次は、いよいよJenkinsで、Gitにコードをコミットするたびに、自動的にビルドとテストを実行させるぜ!