web-dev-qa-db-ja.com

Xcode 7 UIテストで各テストの後にアプリケーションデータをリセットするにはどうすればよいですか?

AppleはXcode7で新しいUIテストを導入しましたが、テストがアプリを起動するたびに苦労します。それは、アプリケーションが以前に持っていたデータから始まります。これは、テストを独立させることはできず、他のテストの影響を受ける可能性があることを意味します。

テストを実行しているアプリケーションはテストされたアプリケーションのバンドルにアクセスできないため、ユーザーのデフォルトやその他のデータにアクセスすることはできません。スクリプトは、テストの前または後に実行できるため、問題外です。また、iOSでNSTaskを実行して、各テストスイートの前にスクリプトを実行する方法はありません。

各テストスイートの前にアプリケーションデータをリセットする方法はありますか?

23
Tomáš Linhart

単純な方法ではありません。ただし、いくつかの回避策があります。

XCUIApplicationは、アプリケーションの動作を変更する可能性のあるコマンドライン引数と環境変数を設定できます。

main.mファイルの簡単な例:

int main(int argc, char * argv[]) {
#if DEBUG
    // Reset all data for UI Testing
    @autoreleasepool {
        for (int i = 1; i < argc; ++i) {
            if (0 == strcmp("--reset-container", argv[i])) {
                NSArray *folders = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
                NSFileManager *fm = [[NSFileManager alloc] init];
                for (NSString *path in folders) {
                    [fm removeItemAtPath:path error:nil];
                }
                // Also remove documents folder if necessary...
            }
        }
    }
#endif
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil,
                                 NSStringFromClass([AppDelegate class]));
    }
}

そして-[XCTestCase setUp]に追加:

XCUIApplication *app = [[XCUIApplication alloc] init];
app.launchArguments = @[@"--reset-container"];
[app launch];
21
Mats

_application:didFinishLaunchingWithOptions:_内のUITests用にアプリを準備しても問題がない場合は、次の操作を実行できます。

XCTestCaseを拡張するテストクラスのsetUp()メソッドに、次のコードを追加します。

_let application = XCUIApplication()
application.launchEnvironment = ["UITESTS":"1"]
application.launch()
_

次に、_application:didFinishLaunchingWithOptions:_で、次のコードを使用してフラグを確認できます。

_func application(_ application: UIApplication,
                 didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {

    let env = ProcessInfo.processInfo.environment
    if let uiTests = env["UITESTS"], uiTests == "1" {
        // do anything you want
    }
    // further set up code
}
_

もちろん、それがあなたの選択肢であるなら。

注:_"1"_フラグの引数として_"UITESTS"_を設定する代わりに、さまざまなテストケースまたはテストメソッドにさまざまな値を指定できます(ただし、そのような場合は、テストメソッドからアプリケーションを起動する必要があります。 setUp()

注2:フラグを処理するコードを_#if DEBUG_ブロックにラップすることをお勧めします。

6
manicaesar

スプリングボードと設定アプリにアクセスするために、いくつかのプライベートヘッダーを使用してアプリケーションデータをリセットする必要がありました。

最初に、スクリプトの実行フェーズを追加して、テストの開始時に削除しました。

/usr/bin/xcrun simctl uninstall booted com.mycompany.bundleId

その後、私が書いたソリューションを使用して heretearDown呼び出しで実行されるテストスクリプトを使用して削除し、すべてのテストの後にリセットします。

4
odm

私の場合、権限もリセットする必要がありました。また、テストでアプリを削除して設定に移動するだけで、アプリを削除してシステム権限をリセットするオプションがあります。

このS.O.ですでに回答済みスレッド: Swift Xcode7のXCTestUI)のテスト間でアプリをリセットする方法はありますか?

0
Eli Kohen