2013年9月25日水曜日

KIF を使ってみる

iOS用の結合テストフレームワーク KIF を使ってみた。
ちなみに KIF は、「Keep It Functional」と言う事らしい。

KIF
https://github.com/kif-framework/KIF

Web で情報を集めてインストール等を行ってみたが、どうやらバージョンが違うらしく、
その通りにやってもエラーが出たので、半ば折れかけになってしまった。
公式の英語を頑張って見れば何とかなったので残しておく。

ちなみに今回インストールするバージョンは、 2.0 系
なお、ここでは、テスト被対象を、「製品ターゲット」とし、テストユニットのプロジェクトを「テストターゲット」として記述していく。

1. 製品プロジェクト(製品ターゲット)の作成
今回も適当に Single View Application のプロジェクトを作成する。

2. テストターゲットの作成
プロジェクトナビゲータを開き、下部にある「Add Target」ボタンを押す。
ターゲットの選択が出るので、iOS -> Other を選択し、
「Cocoa Touch Unit Testing Bundle」 を選択する。

プロジェクト名は、任意。
今回は、「Integration Tests」とした。

これで作成した名前と同じフォルダがナビゲータに作成されている。
このフォルダ内にあるファイル(.m/.h)は不要なため削除する。

ここで、一旦 Xcode を閉じる。

3. KIF のインストール
KIF のインストールは、前回使い方を学んだ CocoaPods を使用する。
ターミナルを開き、上記で作成したフォルダまで移動する。

ここに、CocoaPods用のファイル「Podfile」を作成する。
    $ vim Podfile
    platform :ios, '6.0'
    target 'Integration Tests', Integration Tests
        pod 'KIF', '~> 2.0.0'
    end
以下のコマンドでインストールする。
    $ pod install
これで、CocoaPods 用のプロジェクトファイルが作成されるので、
作成されたプロジェクトファイルで Xcode で起動する。

4. テスト用プロジェクトの設定
プロジェクトナビゲータから TARGETS で、作成したテストターゲットを選択。

次に、Build Settings をクリックする。
検索窓等を使って Bundle Loader を検索する。
この設定値が空なら、以下の項目を入力設定する。
    $(BUILT_PRODUCTS_DIR)/アプリ名.app/アプリ名
同じく、検索窓等を使用して Target Host に以下の値をセットする。
    $(BUNDLE_LOADER)
次に、Build Phases の Target Dependencies に、テストターゲットを追加する。

最後に、Scheme -> Edit Scheme で、
Build の項目に「+」で、テストターゲットを追加
Test の項目に「+」で、テストターゲットを追加
(この設定で、製品ターゲットを Scheme で選択している状態でも Command + U でテストが走るようになる)

5. テストファイルの作成
ここで、テストを記述するファイルを追加する。
テストターゲットのフォルダに、任意のクラスファイルを作成する。

作成した中でヘッダーファイルには、「KIF/KIF.h」 をインポートする。
    #import <KIF/KIF.h>

    @interface hogeTests : KIFTestCase
    @end
実装ファイルには、以下の内容でメソッドを追加する。
    #import "hogeTests.h"

    // 実行前
    -(void) beforeAll {
    }
    // 都度実行前
    -(void) beforeEach {
    }
    // 都度実行後
    -(void) afterEach {
    }
    // 実行後
    -(void) afterAll {
    }
    // テスト
    -(void) testXXX {
        // Accessibility Label が「SignIn」の UIView をタップ
        [tester tapViewWithAccessibilityLabel:@"SignIn"];
    }
以上で、テストを実行すればテストが動くはず。

ちなみに、1.0 系では KIFTestController を継承して作成するが、2.0 では、このクラスが KIFTestCase になっており、
またシナリオという考えから普通のテストと同じ test~ に変わっている。
シナリオについては、ファイル毎に分ければ良いという事だろうか。

1.0系と、2.0系とのテストケースの記述違いについては、以下を参照

変更点ぽい物
https://github.com/kif-framework/KIF/releases/

あと、UIView などの操作は、「Accessibility Label」 を使用(ラベルを元にコントロールを探す)しているので、
付けていなかった場合はつける事(storyboard で付けるかコードで付ける)。

テストで使えるメソッドについては、インストールされた KIF のソースを見ればメソッドが書かれているので頑張って自分で実装したいメソッドを探し利用する。
また、「SenTestingKit」 も継承しているので、OCUnit での記述はそのまま生かせる。

最後に
感想としては、設定については OCUnit と同じ感じなので普段から利用している人にしたら楽に設定が出来るのではないかと思った。
また、はじめにも書いたがバージョンの違いで全く使い方が違うので迷わない事。
Ver1.0 では、シナリオとか書いてあったのに 2.0 系では全く無くなっていたのは困った。

駆け足で書いて、かつ毎度の事ながらスクリーンショットが無いので把握しづらいとは思う。
とりあえず使える状態に持って行くまでが面倒だが、これも一度設定すれば開発終了まで使えるので、設定の価値は有ると思う。

0 件のコメント:

コメントを投稿