如何通过 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 应用程序中运行代码?的主要内容,如果未能解决你的问题,请参考以下文章