テスト用のターゲットを作成する必要があります。 ユニットテストを有効にした場合は、MyApplication_Testsという名前のターゲットが既に存在しているかもしれません。 その場合に、もしそのターゲットをユニットテスト用に使用しないのであれば、そのターゲットをKIF用に使用しても構いません。 それ以外の場合は、以下の手順で新規にターゲットを作成してください。
- Xcode上でプロジェクトやターゲット選択欄から、ターゲットの追加を押す
- iOS -> Other -> Cocoa Touch Unit Testing Bundleを選択して、IntegrationTestsなどの名前を付ける
- ターゲット名を入力して、Use Automatic Reference Countingをチェックする
CocoaPodsからKIFをインストールするために、Podfileを下記のように作成してください。
target 'IntegrationTests', :exlusive => true do
pod 'KIF', '~> 3.0'
end
:exlusive => true do
オプションは、指定されたターゲットのみ依存する設定です。
最後にpod install
コマンドを実行してKIFをインストールしましょう。
OCUnitとKIFを併用している場合は、下記のようなPodfileとなります。
target 'Acceptance Tests', :exclusive => true do
pod 'KIF/OCUnit', '~> 3.0'
end
プロジェクト設定からテスト用ターゲットを選択して、Build Phasesタブを選択します。 Link Binary With Libraries内で、+ボタンを押してlibKIF.aを追加します。 同じ手順でCoreGraphics.frameworkも追加します。
次にPreprocessor MacrosにKIF_XCTEST=1を追加します。 OCUnitを使用している場合は、代わりにKIF_SENTEST=1を追加してください。
KIFはカテゴリ機能を使用しているので、Other Linker Flagsに-ObjC
フラグを追加してください。
Buid PhasesのTarget Dependanciesから+ボタンを押して、あなたのアプリケーションを追加してください。
次に、bundle loaderの設定です。 Build SettingsのLinking内にあるbundle loaderに$(BUILT_PRODUCTS_DIR)/My App.app/My App
を追加してください。
My Appはあなたのアプリケーション名に置き換えてください。
そして、Unit Testing内のTest Hostに$(BUNDLE_LOADER)
を追加してください。
また、Wrapper Extensionがxctestとなっていることを確認してください。
最後に、Edit SchemeからTestスキームへ行き、+ボタンを押してテスト用ターゲットを追加してください。
KIF用のプロジェクト設定が完了したら、実際にテストコードを書いてみましょう。
KIFには2つのメインクラスがあります。 XCTestCase
を継承しているテストケース管理クラスのKIFTestCase
と、UIテストを管理するKIFUITestActor
クラスです。
XCTestクラスがテストケース用のクラスを呼び込み、テストを実行します。 このテストの中で、ユーザーインタラクションに相当するUI操作を行います。
最も一般的な3つのテストアクションはtap this view
, enter text into this view
とwait for this view
です。
それぞれのステップは、KIFUITestActor
上にfactory methodとしてKIF内に実装されています。
KIFは、iOSにおける組み込み式アクセシビリティ機能上に乗っかりテストを実行するので、アプリがアクセシビリティ機能をしっかり網羅していることが重要になります。
まず最初に、いくつかの機能をテストするために、テストクラスを作成しましょう。 今回はログインテスト用のLoginTests
クラスを作成します。KIFTestCase
を継承させて、<KIF/KIF.h>
をインポートしてください。
KIFTestCase
のサブクラスとなるLoginTests
クラスは以下のようになるでしょう。
LoginTestCase.h
#import <KIF/KIF.h>
@interface LoginTests : KIFTestCase
@end
LoginTestCase.m
#import "LoginTests.h"
#import "KIFUITestActor+EXAdditions.h"
@implementation LoginTests
- (void)befoerAll
{
}
- (void)beforeEach
{
[tester navigateToLoginPage];
}
- (void)afterEach
{
[tester returnToLoggedOutHomeScreen];
}
- (void)afterAll
{
}
- (void)testSuccessfulLogin
{
[tester enterText:@"[email protected]" intoViewWithAccessibilityLabel:@"Login User Name"];
[tester enterText:@"thisismypassword" intoViewWithAccessibilityLabel:@"Login Password"];
[tester tapViewWithAccessibilityLabel:@"Log In"];
// Verify that the login succeeded
[tester waitForTappableViewWithAccessibilityLabel:@"Welcome"];
}
@end
ほとんどのテスト用アクションは、KIFフレームワークによって既に実装されています。
この例では、-navigateToLoginPage
と-returnToLoggedOutHomeScreen
がカスタムアクションとなっています。
上記のようなステップの追加は、KIFUITestActor
カテゴリ内のfactory methodを使用して簡単に行われます。
*アクセシビリティはXcodeの右パネルから設定可能です。
またはソースコード上からでも可能です。
accessibilityLabelの設定例
KIFUITestActor+EXAdditions.h
#import <KIF/KIF.h>
@interface KIFUITestActor (EXAdditions)
- (void)navigateToLoginPage;
- (void)returnToLoggedOutHomeScreen;
@end
KIFUITestActor+EXAdditions.m
#import "KIFUITestActor+EXAdditions.h"
@implementation KIFUITestActor (EXAdditions)
- (void)navigateToLoginPage
{
[self tapViewWithAccessibilityLabel:@"Login/Sign Up"];
[self tapViewWithAccessibilityLabel:@"Skip this ad"];
}
- (void)returnToLoggedOutHomeScreen
{
[self tapViewWithAccessibilityLabel:@"Logout"];
[self tapViewWithAccessibilityLabel:@"Logout"]; // Dismiss alert.
}
@end
これで全ての準備が整ったので、インテグレーションテストを⌘U
で実行してみましょう。
XCTestが有効なテストホストを保持していない時に発生します。 Bundle LoaderとTest Host設定をもう一度良く読み、もう一度試してみてください。
ほとんどの場合が、Viewのアクセシビリティラベルの設定が不十分な場合です。 もしViewがxibファイルで定義されている場合は、インスペクター上で設定可能です。 コードで生成している場合は、accessibilityLabel attributeのセットを行ってください。
userDefinedRuntimeAttributesの設定例
初回実行時に以下のエラーが発生する場合がある。
2011-06-13 13:54:53.295 Testable (Integration Tests)[12385:207] -[NSFileManager createUserDirectory:]: unrecognized selector sent to instance 0x4e02830
2011-06-13 13:54:53.298 Testable (Integration Tests)[12385:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSFileManager createUserDirectory:]: unrecognized selector sent to instance 0x4e02830'
もしくは、違う種類のUnrecognized selectorエラーが発生した場合も、-ObjCフラグの設定が正しく行えているか確認してください。 KIFで必要なカテゴリメソッドにアクセス出来ないためです。