しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

KIF (iPhoneアプリのUI自動テストツール) を試してみた

KIFでUIの自動テストを試してみました。

アプリケーション作成

テスト用にアプリ作成をします。
今回はMaster-Detail Applicationを作ります。

f:id:llcc:20150809232811p:plain

インストール

インストールはPodfileに下の記述をしてpod installするだけで完了です。

target 'KifTestTests', :exclusive => true do
  pod 'KIF', '~> 3.0', :configurations => ['Debug']
end

target 'KifTestTests'の部分は下画像にあるTargetの名前に合わせます。

f:id:llcc:20150809233202p:plain

テストをしてみる

テストフォルダ上で新規ファイル追加をします。
SourceTest Case Classを選択します。
KIFTestCaseのサブクラスとしてファイルを作成します。

ファイルの中身は下のようにします。
ナビゲーションバーのプラスボタンを押すためにはAddという文字列を指定する必要があります。

f:id:llcc:20150809233610p:plain

テストはcmd+uで実行します。
実行すると下のように1行追加される事が分かります。

f:id:llcc:20150809233751p:plain

Addの部分をAddd等に変えるとちゃんとエラーが出てくれます。

f:id:llcc:20150809233833p:plain

Swiftでテストをする

Swiftでのテストは少しだけ設定が必要です。

最初にBridging Header#import <KIF/KIF.h>を書きます。
次にどこかのファイルで下のようなextensionを記述します。
SwiftだとObjective-cで使ってたtesterがうまく使えないので追記する必要があるようです。

extension XCTestCase {
    func tester(_ file : String = __FILE__, _ line : Int = __LINE__) -> KIFUITestActor {
        return KIFUITestActor(inFile: file, atLine: line, delegate: self)
    }
    
    func system(_ file : String = __FILE__, _ line : Int = __LINE__) -> KIFSystemTestActor {
        return KIFSystemTestActor(inFile: file, atLine: line, delegate: self)
    }
}

extension KIFTestActor {
    func tester(_ file : String = __FILE__, _ line : Int = __LINE__) -> KIFUITestActor {
        return KIFUITestActor(inFile: file, atLine: line, delegate: self)
    }
    
    func system(_ file : String = __FILE__, _ line : Int = __LINE__) -> KIFSystemTestActor {
        return KIFSystemTestActor(inFile: file, atLine: line, delegate: self)
    }
}

上記の2ステップをする事で下のようにSwiftでテストを書けました。

class SecondTests: KIFTestCase {
    func testAdd() {
        tester().tapViewWithAccessibilityLabel("Add")
    }
}

Cell選択による画面遷移

ついでにテーブルのCell押下時の挙動もテストします。

Cell押下のテストを書く前にStoryboard上のTableへ1つ設定を追加します。
下のようにユーザー定義のプロパティーを追加できるので、そこでaccessibilityIdentifierというキーを作ります。
valueは好きな文字列で構いません。

f:id:llcc:20150809235813p:plain

実際の下のようにCell押下のテストを書いていきます。
テストはtapRowAtIndexPathというメソッドを使います。
その第2引数に先ほど設定したaccessibilityIdentifierを入れます。

class SecondTests: KIFTestCase {
    func testAdd() {
        tester().tapViewWithAccessibilityLabel("Add")
        tester().tapRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0), inTableViewWithAccessibilityIdentifier: "MasterTable")
    }
}

実行するとしっかり詳細画面へ遷移してくれました。

f:id:llcc:20150810000055p:plain