最近初めてiPhoneアプリでテストを書く機会がありました。テストを書くならこの際ユニットテストだけではなく画面遷移を含めたテストも書いてみようと思い、環境を整えてみました。
テストフレームワークの選択肢
- kif-framework/KIF
- inkling/Subliminal
- Testing With Frank — Painless iOS and Mac Testing With Cucumber
- allending/Kiwi
ざっと調べた感じ、受け入れテストに使えるテストフレームワークは以上のような感じ。ですが、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要素を選択した状態でインスペクタから設定可能です。こんな感じ。
全体としては次の図のような感じの画面構成にしました。赤文字は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を扱ったりできるようです。そこまでカバーしきれていないので今後使うことがあったらまとめるかも。