スマートデバイスアプリ開発のあれやこれや

KIFでiOSアプリケーションのUIテストを自動化する

iOSネイティブアプリケーションのUIテストの自動化方法をまとめます。
最近のUIテスト自動化ツールとして代表的なものは↓です。

  • Calabash
  • KIF
  • MonkeyRunner


MonkeyRunnerは触ったことがないのでコメント出来ませんが
CalabashはRubyでコードを書く必要があって慣れないので
今回はKIFを使うパターンを紹介します。
※XCTestでのテストに慣れているならKIFの方がとっつき易いと思います。

検証環境は以下の通りです。

1. KIFインストール用のPodfileを作成する

CocoaPodsを使ってインストールしていきます。
公式サイトに習い、定義ファイル(Podfile)は以下のように書きます。

target 'テスト対象ターゲット', :exclusive => true do
  pod 'KIF', '~> 3.0', :configurations => ['Debug']
end


「テスト対象ターゲット」の部分はお手元の環境に合わせましょう。
作成したPodfileはテスト対象プロジェクトの直下に保存します。

2. KIFをインストールする

ターミナルを起動して、テスト対象プロジェクトの直下に移動します。
その状態でCocoaPodのインストールコマンドを実行します。

pod install


Xcodeワークスペースファイルが作成されていれば成功です。

3. テストクラスを作成する

作成されたXcodeワークスペースファイルをXcodeで開きます。
Xcodeプロジェクトは開かないように注意です!

テストクラスを作成していきます。

#import <UIKit/UIKit.h>
#import <XCTest/XCTest.h>
#import <KIF/KIF.h>


@interface KifAppTests : KIFTestCase

@end

@implementation KifAppTests

- (void)setUp {
    [super setUp];
    // Put setup code here. This method is called before the invocation of each test method in the class.
}

- (void)tearDown {
    // Put teardown code here. This method is called after the invocation of each test method in the class.
    [super tearDown];
}

- (void)testExample {
    // ここにテストコードを実装していくよ!
}


まずはKIFの必要クラスをインポートしていきます。
(KIF/KIF.hの部分ですね!)

続いて、テストクラスの継承元クラスを設定します。
KIF用のテストクラスになるので、継承元クラスは”KIFTestCase”を使います。

4. テストコードを実装する

KIFTestCaseクラスが提供するインスタンス(tester)を使って
画面操作を行うコードを実装していきます。
画面項目の同定にはAccesiblility Labelの情報を使います。
そのため、事前に操作対象の部品にラベルを設定しておいてください。


f:id:cross-xross:20150531150357p:plain


ボタンであれば、ラベルなしでもボタンの表示名ベースで特定可能です。


(1) 画面項目をタップする
画面項目をタップする場合のテストコードの書き方です。

- (void)testExample {
    [tester tapViewWithAccessibilityLabel:@"Button"];
}


引数で指定したAccessibility Labelを持つ項目をタップします。


(2) 画面項目に値を入力する
画面項目に値を入力する場合のテストコードの書き方です。

- (void)testExample {
    [tester enterText:@"hogehoge" intoViewWithAccessibilityLabel:@"input"];
}


第1引数に入力したいテキストを入力します。
第2引数にテキストを入力する項目のAccesibility Labelを指定します。

5. テストを実行する

XCTest実行時と同じようにテストターゲットを実行します。
実装した処理に従ってシミュレータの操作が自動化されていれば成功です。


実際に使ってみた感想です。


良いところ

  • XCTestと同じ感覚でUIテストの自動化コードを書ける
  • 導入が簡単である
  • 実機でもシミュレータでも実行できる


悪いところ

  • テストケース実行後に画面が初期状態に戻らない


予めリセット処理をアプリケーションごとに実装しておけば
良いだけなのですがちょっと面倒臭いような気がします。