web-dev-qa-db-ja.com

Xcode 7UIテストターゲットからホストアプリコードにアクセスする

IOSプロジェクトを開発していて、UIテストターゲットからホストアプリのコードにアクセスする必要がありますが、リンクエラーが表示されていることがわかりました。試みたときに未定義のシンボルです。このターゲットのテストホストとバンドルローダーがすべて空であることがわかったので、それらをホストアプリに設定すると、リンクエラーを乗り越えることができました。ただし、実行時にXCUIApplication.launch()を呼び出すと失敗します。このUIテストターゲットからホストアプリのコードにアクセスする方法を誰かが理解しましたか?これを行うことができなければ、私たちはすべてのUIテストを行うことを余儀なくされます。これは非常に不安定です。テストシナリオでは、UI以外の手順を実行する必要があります。私は自分のプロジェクトにSwiftを使用しています。

24
user412759

UIテストを実行する前に、次の手法を使用してアプリに値を設定します。デフォルトを設定したり、ネットワークモックをオンにしたりするのに便利です。ほとんどの場合、アプリから何かを読み取りする必要はありません。すべてがUIに反映され、その方法でテストできます。間もなく、アプリが特定のネットワーク呼び出しを行うことを確認するためのテストを追加する予定です。 UIテストケース内からどのようにテストするかはまだわかりません。

UIテストで引数を設定する

let app = XCUIApplication()
app.launchArguments = ["ResetDefaults", "NoAnimations", "UserHasRegistered"]
app.launch()

アプリの引数を読む

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    var arguments = NSProcessInfo.processInfo().arguments
    arguments.removeFirst()
    print("App launching with the following arguments: \(arguments)")

    // Always clear the defaults first
    if arguments.contains("ResetDefaults") {
      destroyUserDefaults()
      clearKeychain()
    }

    for argument in arguments {
      switch argument {
      case "NoAnimations":
        UIView.setAnimationsEnabled(false)
      case "UserHasRegistered":
        Defaults.userRegistered = true
      default:
        break
    }
  }
}

追加のボーナス:起動引数を使用してアプリを構成する場合、Xcodeスキームにフラグを追加するのは簡単です。たとえば、保存されているすべてのデータをクリアし、ログイン試行を成功応答でスタブ化するスキームがあります。サーバーにアクセスすることなく、シミュレーターを介して「ログイン」できるようになりました。

39
kubi

新しいUI自動化フレームワークを使用するとApple WWDC 15で導入されました。UI-Automationテストからアプリのコードにアクセスすることはできません。これは、ユーザーがアクセスできるものをシミュレートすることを目的としています。時々イライラする。

5
cakes88