PIYO - Tech & Life -

XCode5対応!KIFでiPhoneアプリの受け入れ(統合)テスト

Test iOS Xcode

最近初めてiPhoneアプリでテストを書く機会がありました。テストを書くならこの際ユニットテストだけではなく画面遷移を含めたテストも書いてみようと思い、環境を整えてみました。

テストフレームワークの選択肢

ざっと調べた感じ、受け入れテストに使えるテストフレームワークは以上のような感じ。ですが、FrankやKiwiはCucumberベースで癖がありそうだったり設計思想が大掛かりな感じがして回避しました。この中では一番シンプルなKIFを選択しました。ちなみにKIFは決済サービスsquareで使用されているフレームワークらしいです。

2013/12/12追記:KiwiはUIのテストは想定されてないっぽいです。

KIF環境のセットアップ

セットアップについてはここ(kif-framework/KIF )が詳しいけど、一応メモ。

テスト用のターゲットを追加する

XCodeでこうやって

ターゲット追加

こうやって

ターゲット追加

ドーン

ターゲット追加

githubのREADMEでは最後にBuildSettingsをいじりますが、3番の箇所でタイプをOCUnitに変更しておけばその変更も不要になります。

CocoaPodsでインストール

CocoaPodsからインストールする方法とgithubからインストールする方法の両方が紹介されていますが、圧倒的にCocoaPodsを使う方が楽です。CocoaPods インストールとか検索して、CocoaPodsだけは入れとくべき。

CocoaPodsが入ったらプロジェクトのルートディレクトリにPodfileを作ります。

# Podfile
# IntegrationTestsの部分は先ほど追加したテストターゲットの名前に置き換える
target 'IntegrationTests', exclusive:true do
  pod 'KIF', '~> 2.0'
end

そしたらCocoaPodsでインストール。

$ pod install

KIFを使用した最低限のテスト

画面遷移を作る

最低限のテストコードを書くためにStoryboardを使って画面遷移をちゃちゃっと作っておきます。

ここが重要なところなのですが、KIFを使う上ではUIの要素が持つAccessibilityLabelに名前をつけておく必要があります。AccessibilityLabelをキーにして、タップさせたり要素の有無を確認したりするので。

AccessibilityLabelはStoryboard上でUI要素を選択した状態でインスペクタから設定可能です。こんな感じ。

AccessiblityLabel

全体としては次の図のような感じの画面構成にしました。赤文字はAccessibilityLabelに設定した内容です。

画面遷移

テストコードを書く

ターゲットを追加したときに新たに作られたIntegrationTestsグループの中に新しくファイルを作成します。New FileからObjective-C test case classを選びNavigationTestsなどといった名前にします。

出来たファイルに次のように書きます。

#import <KIF/KIF.h>

@interface NavigationTests : KIFTestCase
@end

@implementation NavigationTests

- (void)test
{
    [tester waitForViewWithAccessibilityLabel:@"FirstPageLabel"];
    [tester tapViewWithAccessibilityLabel:@"NextPageButton"];
    [tester waitForViewWithAccessibilityLabel:@"SecondPageLabel"];
    [tester tapViewWithAccessibilityLabel:@"Back"];
    [tester waitForViewWithAccessibilityLabel:@"FirstPageLabel"];
}

@end

testメソッドを見るとわかりますが、先ほど指定したAccessibilityLabelを使っています。各行は次のような内容です。

  • “FirstPageLabel”という名前を付けたViewが現れるのを待つ
  • “NextPageButton”という名前を付けたViewをタップする
  • “SecondPageLabel”という名前を付けたViewが現れるのを待つ
  • “Back”という名前を付けたViewをタップする
  • “FirstPageLabel”という名前を付けたViewが現れるのを待つ

BackというAccessibilityLabelは名づけた覚えはないと思いますが、これはiOSが標準でつけているものだそうです。他にもアラートなどのボタンにAccessibilityLabelがついています。

実行

XCodeからコマンドキー+Uで実行可能です。

このテストケースは何も例外が発生しなければ成功として扱われます。waitForXXXで10秒待っても想定したViewが表示されないなどの場合は例外が発生しテストが失敗します。

以上が、KIFを用いた最低限のテストでした。

他にもView指定の方法がいろいろあったり、Scenarioを扱ったりできるようです。そこまでカバーしきれていないので今後使うことがあったらまとめるかも。