从Xcode 7 UItesting目标访问主机应用程序代码

我正在开发一个iOS项目,我需要从UItesting目标访问主机应用程序的代码,但是我发现它显示链接错误:当我尝试时未定义的符号。 我发现这个目标的testing主机和软件包加载器都是空的,所以我把它们设置到我的主机应用程序,并可以通过链接错误。 但是,在运行时,调用XCUIApplication.launch()时仍然失败。 有没有人想出如何从这个UItesting目标访问主机应用程序的代码? 如果不能做到这一点,我们不得不做所有的UItesting,这是非常片状的。 我们肯定需要在testing场景中使用非UI步骤。 我正在使用Swift来处理我的项目。

在运行UItesting之前,我使用以下技术在我的应用程序中设置值。 有用的设置默认值或打开networking嘲笑,等等。大部分,我不需要阅读任何应用程序中的任何东西。 一切都反映在用户界面,可以这样testing。 不久,我们将添加testing,以确保应用程序进行某些networking调用。 我不确定我们将如何从UItesting用例中进行testing。

在您的UItesting中设置参数

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 } } } 

额外的好处:如果您使用启动参数来configuration您的应用程序,那么将标志添加到您的Xcodescheme是微不足道的。 例如,我有一个scheme清除所有存储的数据,并存留成功响应的任何login尝试。 我现在可以通过模拟器“login”而不需要访问任何服务器。

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