25

iOSプロジェクトを開発しており、UIテストターゲットからホストアプリのコードにアクセスする必要がありますが、リンクエラー:未定義のシンボルが表示されることがわかりました。このターゲットのテスト ホストとバンドル ローダーがすべて空であることを確認したので、それらをホスト アプリに設定すると、リンク エラーを回避できました。ただし、実行時に XCUIApplication.launch() を呼び出すと失敗します。この UI テスト ターゲットからホスト アプリのコードにアクセスする方法を理解した人はいますか? これができないと、すべての UI テストを行う必要があり、非常に不安定です。テスト シナリオには、UI 以外のステップが必ず必要です。プロジェクトに Swift を使用しています。

4

2 に答える 2

42

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 スキームにフラグを追加するのは簡単です。たとえば、保存されているすべてのデータを消去し、成功の応答でログイン試行をスタブ化するスキームがあります。サーバーにアクセスすることなく、シミュレーター経由で「ログイン」できるようになりました。

于 2015-11-01T19:06:41.303 に答える