KIF の導入とテスト実行

はじめまして。Web 系企業で6,7年 QA という業務に携わっている今年三十路のモノです。日頃はスクラムチームにて主に iOS, Android のハイブリッドアプリのQAをしています。

今回、先日バージョンアップされたばかりのKIFを Quesプロジェクト にCocoaPodsでインストールし、簡単なテストを書いてそれを実行しようと思います。

Quesプロジェクト – 出来る事.
・テキストフィールドに “lion” と入力し、ボタンをタップするとアラートが表示される
・アラートで “YES” を選択すると、ライオンの画像が表示される
Quesプロジェクト – View.

Interface Builder
L Textfield
L Button
L ImageView (default:hidden)
Class file
L alertview
.

流れ

  • KIFってなに?
  • 実行環境
  • 導入
    • Xcodeの設定
    • Podfileの作成
    • アクセシビリティの設定
  • テストを書く
  • テスト実行
    • コマンドラインから実行
    • ショートカットで実行

KIFってなに?

モバイルクレジットカード決済サービスを展開しているSquare社が、無料で公開しているiOSのインテグレーションテストフレームワークです。テストはObjective-Cで記述する為、比較的自由度の高いテストを実現できます。

https://github.com/kif-framework/KIF

実行環境

  • Xcode5.1
  • Mac OS X10.9.2 Mavericks
  • CocoaPods0.29
  • KIF3.0

導入

Xcodeの設定

まずはXcodeの設定をします。
Ques.xcodeprojを開いて、以下の手順でtesting bundleを追加します。

  • “project and target list” で + を選択
  • “choose a template for your new project” で Cocoa Touch UnitTesting Bundle を選択し、次の画面へ
  • Product Name を QuesTests
  • Type は、XCTestを選択
  • Project, Target は変更せずにそのままで、Finish.

すると、ターゲットリストに “QuesTests” という testing bundle が表示され、

プロジェクトナビゲータには “QuesTests” というグループが作成されます。
テストファイルは主にこのグループ配下に作成していきます。

この時点で、”QuesTests” グループ内には仮のテストケースが書かれているクラスファイルが入っています。このテストケースは必ず fail を返すので、テストを実行する際は当該行をコメントアウトするかクラスファイル自体を削除します。

次に、追加した “QuesTests” という testing bundle をアプリケーションとリンクさせます。”project and target list” の “QuesTests” を選択し、”Build Setting” と “Test Host” を以下の様に設定します。

  • “Bundle Loader” を $(BUILT_PRODUCTS_DIR)/Ques.app/Ques に設定
  • “Test Host” を $(BUNDLE_LOADER) に設定

そして、一旦 Ques.xcodeproj を閉じます。

Podfileの作成

次に、KIF をインストールする為、Ques.xcodeproj と同じディレクトリに Podfile を作成します。

cd Ques/
vi Podfile

KIF3.0 は、OCUnit Framework を採用している KIF と、XCTest Framework を採用している KIF の2つのタイプが存在します。それぞれで Podfile に記述する内容が異なります。

XCTest タイプの KIF をインストールする場合、Podfile に以下を記述します。

target 'QuesTests' do
  pod 'KIF', '~>3.0'
end

OCUnit タイプの KIF をインストールする場合はこちら。

target 'QuesTests' do
  pod 'KIF/OCUnit', '~>3.0'
end
ちなみに、XCTest は iOS6 上で動きません。iOS6 でもテストを行いたい場合は、OCUnit タイプの KIF をインストールします。 しかし、Xcode5 から OCUnit が deprecated となり、OCUnit は今後削除される予定です。。

” Deprecations
OCUnit and the SenTestingKit framework are deprecated and will be removed from a future release of Xcode. Source code using OCUnit generates warnings while being compiled in Xcode 5.1. ”

詳細は コチラ.


今回は XCTest タイプの KIF をインストールします。
インストール出来たら、Podfile と同じディレクトリにある Ques.xcworkspace を開きます。

アクセシビリティの設定

KIF は、UIオブジェクトへのアクセスにアクセシビリティを利用します。
テストを書く前にUIオブジェクトにアクセシビリティを設定します。

アクセシビリティは、InterfaceBuilder とクラスファイルから設定する事が出来ます。

UIオブジェクトがInterfaceBuilder上で定義されている場合、
InterfaceBuilder の Identity Inspector > Accessibility > Label にて設定する事が出来ます。

また、tableview 等、”Accessibility” の無いUIオブジェクトも存在します。その場合は、InterfaceBuilderの Identity Inspector > User Defined Runtime Attributesから設定します。例えば以下のように設定します。

  • Key Path: accessibilityLabel
  • Type: String(Valueの型)
  • Value: hoge (任意のアクセシビリティラベル)

また、UIオブジェクトが InterfaceBuilder 上ではなく、クラスファイルで定義されているケースもあります。動的にオブジェクトを切り替えたりしている場合などです。
そのような場合、クラスファイルでアクセシビリティを設定します。
例えば以下の様に設定することが出来ます。

UIButton *btn;
[btn setAccessibilityLabel:@"Accessibility Label"];
今回、Ques プロジェクトのUIオブジェクトには以下の様にアクセシビリティを設定します。
  • Button(Show Alert)
    • accessibility : showalertbutton
  • Textfield(Input Text)
    • accessibility : textfield
  • ImageView(LionView)
    • accessibility : lionview
  •  AlertView
    • ButtonTitle : YES, NO
テストを書く
Xcode 側の設定も終わり、pod で KIF もインストールし、アクセシビリティの設定も終わったところで次はテストを書いていきます。
まず、”QuesTests” グループ 配下に、サブクラスが “KIFTestCase” の “QuesKIFTest” というクラスファイルを追加します。※追加の際、Targets の QuesTests にチェックを入れます。
次に、追加した QuesKIFTest.hに、KIF/KIF.h を import します
#import <KIF/KIF.h>
次に、 QuesKIFTest.mにメソッドを追加します。
メソッドは、頭に test をつけ、戻り値の型は void にします。

-(void) testShowLionView{
}

そして、-(void)testShowLionView にテストケースを追加します。
Quesプロジェクトで出来る事に対して、以下のようなテストケースを追加します。

-(void) testShowLionView{
//accessibilityがtextfieldのUIオブジェクトに"lion"と入力
[tester enterText:@"lion" intoViewWithAccessibilityLabel:@"textfield"];
//accessibilityがshowalertbuttonのUIオブジェクトをタップ
[tester tapViewWithAccessibilityLabel:@"showalertbutton"];
//accessibilityがYESのUIオブジェクトをタップ
[tester tapViewWithAccessibilityLabel:@"YES"];
//accessibilityがlionviewのUIオブジェクトが表示されたか?
[tester waitForViewWithAccessibilityLabel:@"lionview"];
}

テスト実行

テストケースも書けたところで、早速テストを実行します。
テストはコマンドラインまたはショートカットで実行でき、
シミュレータ、実機上にて動作します。

コマンドラインから実行
xcodebuild コマンドで実行します。
Ques.xcworkspace のあるディレクトリへ移動し、以下のコマンドを実行します。

シミュレータで実行する

例えば以下の場合、iPhoneRetina3.5inchモデル / iOS7.0 のシミュレータで、
KIFが走ります。

xcodebuild test -workspace Ques.xcworkspace
          -scheme Ques
          -destination “OS=7.0,name=iPhone Retina (3.5-inch)”
※ダウンロードしていない OS を指定した場合はエラーになります。事前に、Xcode の Preferences > Downloads > Components から必要なコンポーネントを ダウンロードします。
実機で実行する場合

実機で確認する場合は、 -destinationname に端末の名前を指定するだけでOKです。
例えば以下のようになります。

xcodebuild test -workspace Ques.xcworkspace
          -scheme Ques
          -destination “name=sfumiharu’s iPhone”

ちなみに、-destination は複数定義できたりするので、連続して復数の環境でテストを実行することが可能です。

ショートカットで実行
スキームが Ques であることを確認して、⌘U

テスト実行前に既にシミュレータもしくは実機に Ques がビルドされている場合、削除しましょう。エラーで KIF が走らなかったりします。

Xcodeのコンソールに出力されたテスト結果

2014-04-12 15:40:40.168 Ques[26853:70b] KIFTester loaded
Test Suite 'All tests' started at 2014-04-12 06:40:40 +0000
Test Suite 'QuesTests.xctest' started at 2014-04-12 06:40:40 +0000
Test Suite 'QuesKIFTest' started at 2014-04-12 06:40:40 +0000
Test Case '-[QuesKIFTest testShowLionView]' started.
Test Case '-[QuesKIFTest testShowLionView]' passed (9.943 seconds).
Test Suite 'QuesKIFTest' finished at 2014-04-12 06:40:50 +0000.
Executed 1 test, with 0 failures (0 unexpected) in 9.943 (9.943) seconds
Test Suite 'QuesTests.xctest' finished at 2014-04-12 06:40:50 +0000.
Executed 1 test, with 0 failures (0 unexpected) in 9.943 (9.943) seconds
Test Suite 'All tests' finished at 2014-04-12 06:40:50 +0000.
Executed 1 test, with 0 failures (0 unexpected) in 9.943 (9.945) seconds
以上です。最後の方は駆け足気味な感じになってしまいました。
KIF は導入が簡単で、テストは振る舞いベースで記述するので、ドキュメント(仕様書的な意味で)としても有効ではないでしょうか。

.

git に demo を上げておきました。KIF はインストール済みで、⌘U するとテストが動くようになっています。
https://github.com/sfumiharu/ques

.

それでは引き続き宜しくお願い申し上げます。

.

.

このエントリーをはてなブックマークに追加

1件のコメント

ただいまコメントは受け付けていません。