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
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の情報を使います。
そのため、事前に操作対象の部品にラベルを設定しておいてください。
ボタンであれば、ラベルなしでもボタンの表示名ベースで特定可能です。
(1) 画面項目をタップする
画面項目をタップする場合のテストコードの書き方です。
- (void)testExample { [tester tapViewWithAccessibilityLabel:@"Button"]; }
引数で指定したAccessibility Labelを持つ項目をタップします。
(2) 画面項目に値を入力する
画面項目に値を入力する場合のテストコードの書き方です。
- (void)testExample { [tester enterText:@"hogehoge" intoViewWithAccessibilityLabel:@"input"]; }
第1引数に入力したいテキストを入力します。
第2引数にテキストを入力する項目のAccesibility Labelを指定します。
5. テストを実行する
XCTest実行時と同じようにテストターゲットを実行します。
実装した処理に従ってシミュレータの操作が自動化されていれば成功です。
実際に使ってみた感想です。
良いところ
- XCTestと同じ感覚でUIテストの自動化コードを書ける
- 導入が簡単である
- 実機でもシミュレータでも実行できる
悪いところ
- テストケース実行後に画面が初期状態に戻らない
予めリセット処理をアプリケーションごとに実装しておけば
良いだけなのですがちょっと面倒臭いような気がします。