Skip to content

Instantly share code, notes, and snippets.

@kitasuke
Last active December 28, 2015 00:52
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kitasuke/ed6f90e83df3c0653cbf to your computer and use it in GitHub Desktop.
Save kitasuke/ed6f90e83df3c0653cbf to your computer and use it in GitHub Desktop.
KIF導入

KIF iOS Integration Testing Framework

特徴

導入方法

テスト用ターゲットの追加

テスト用のターゲットを作成する必要があります。 ユニットテストを有効にした場合は、MyApplication_Testsという名前のターゲットが既に存在しているかもしれません。 その場合に、もしそのターゲットをユニットテスト用に使用しないのであれば、そのターゲットをKIF用に使用しても構いません。 それ以外の場合は、以下の手順で新規にターゲットを作成してください。

  1. Xcode上でプロジェクトやターゲット選択欄から、ターゲットの追加を押す
  2. iOS -> Other -> Cocoa Touch Unit Testing Bundleを選択して、IntegrationTestsなどの名前を付ける
  3. ターゲット名を入力して、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 MacrosKIF_XCTEST=1を追加します。 OCUnitを使用している場合は、代わりにKIF_SENTEST=1を追加してください。

KIFはカテゴリ機能を使用しているので、Other Linker Flags-ObjCフラグを追加してください。

プロジェクト設定

Buid PhasesTarget Dependanciesから+ボタンを押して、あなたのアプリケーションを追加してください。

次に、bundle loaderの設定です。 Build SettingsLinking内にあるbundle loader$(BUILT_PRODUCTS_DIR)/My App.app/My Appを追加してください。 My Appはあなたのアプリケーション名に置き換えてください。 そして、Unit Testing内のTest Host$(BUNDLE_LOADER)を追加してください。 また、Wrapper Extensionxctestとなっていることを確認してください。

最後に、Edit SchemeからTestスキームへ行き、+ボタンを押してテスト用ターゲットを追加してください。

使用例

KIF用のプロジェクト設定が完了したら、実際にテストコードを書いてみましょう。
KIFには2つのメインクラスがあります。 XCTestCaseを継承しているテストケース管理クラスのKIFTestCaseと、UIテストを管理するKIFUITestActorクラスです。 XCTestクラスがテストケース用のクラスを呼び込み、テストを実行します。 このテストの中で、ユーザーインタラクションに相当するUI操作を行います。
最も一般的な3つのテストアクションはtap this view, enter text into this viewwait 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:@"user@example.com" 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で実行してみましょう。

他のテストフレームワークとの組み合わせ

トラブルシューティング

シミュレーター起動後に10秒タイムアウトエラー

XCTestが有効なテストホストを保持していない時に発生します。 Bundle LoaderとTest Host設定をもう一度良く読み、もう一度試してみてください。

Viewが見つからずエラー

ほとんどの場合が、Viewのアクセシビリティラベルの設定が不十分な場合です。 もしViewがxibファイルで定義されている場合は、インスペクター上で設定可能です。 コードで生成している場合は、accessibilityLabel attributeのセットを行ってください。

userDefinedRuntimeAttributesの設定例

初回実行時のUnrecognized selectorエラー

初回実行時に以下のエラーが発生する場合がある。

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で必要なカテゴリメソッドにアクセス出来ないためです。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment