如何通过 Xcode 7 中的 UI 测试在 iOS 应用程序中运行代码?

Posted

技术标签:

【中文标题】如何通过 Xcode 7 中的 UI 测试在 iOS 应用程序中运行代码?【英文标题】:How to run code in an iOS app from a UI test in Xcode 7? 【发布时间】:2015-11-29 04:45:59 【问题描述】:

有没有办法通过 Xcode 7 中的 UI 测试在应用程序中运行代码?这对于应用程序测试是可能的(因为测试在应用程序中运行),但对于 UI 测试似乎没有一种简单的方法。

有人想出解决办法吗?

【问题讨论】:

【参考方案1】:

通过 UI 测试在您正在执行应用的应用中运行代码的最直接方法是提供 launchArguments via XCUIApplication。

ui 测试代码

import XCTest

class UITestUITests: XCTestCase 

    override func setUp() 
        super.setUp()
        let app = XCUIApplication()
        app.launchArguments += ["-anargument", "false","-anotherargument","true"]
        app.launch()
    


应用代码

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 
    print("All arguments: \(NSProcessInfo.processInfo().arguments)\n\n")
    print("anargument: \(NSUserDefaults.standardUserDefaults().boolForKey("anargument"))")
    print("anotherargument: \(NSUserDefaults.standardUserDefaults().boolForKey("anotherargument"))")
    return true

从 ui 测试启动时的应用输出:

All arguments: ["/...../AnApp.app/UITest", "-anargument", "false", "-anotherargument", "true"]

anargument: false
anotherargument: true

【讨论】:

【参考方案2】:

UI 测试在与您的应用不同的进程中运行。目前,从 Xcode 7.1.1 开始,无法直接与框架中的生产应用程序代码进行交互。

每次交互都必须通过可访问性进行。这意味着您可以连接一个在您的应用程序中执行代码的按钮,然后让测试调用该按钮。这显然是不可扩展的,我建议不要这样做。

也许还有其他方法可以实现您的目标?你到底想完成什么?

【讨论】:

我正在努力完成几件事。例如,我希望测试是数据驱动的,因此它们需要能够访问应用程序的数据。我还想走捷径(我有大量现有的 KIF 测试我想切换——它们需要几个小时才能运行)。【参考方案3】:

我正在考虑在测试启动嵌入式 HTTP 服务器时将环境变量传递给应用程序。然后我可以通过服务器与应用程序通信。疯了吧?然而,我不敢相信还没有人这样做。

我对这种方法最大的担忧是嵌入式服务器将在生产应用程序中。我不确定这是否是一个问题,或者是否有一种简单的方法可以只在运行 UI 测试时包含它。

【讨论】:

你最终这样做了吗?我也在考虑 是的,我已经在几个项目中使用过这种技术。我的服务器仅包含在应用程序的调试版本中。 我也走那条路。在测试/实际应用程序之外启动了一个节点应用程序。

以上是关于如何通过 Xcode 7 中的 UI 测试在 iOS 应用程序中运行代码?的主要内容,如果未能解决你的问题,请参考以下文章

XCode 7 UI 测试 - 可用的操作

XCode 7 中的 UI 测试文档 [关闭]

如何通过 UI 测试(Xcode 12、iOS14)访问推送通知?

Xcode 7 中的 UI 测试功能

Xcode 7 中的特定 UI 测试

在 UI 测试期间,如何使用 Xcode 7 截取我的 UI 截图?