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 回答
7

使用 Apple 在 WWDC 15 中引入的新 UI 自动化框架,无法从 UI-Automation 测试中访问您的应用程序代码。它旨在模拟用户也可以访问的内容,这有时会令人沮丧。

于 2015-10-26T21:59:18.113 回答