Xcode 8 UI 测试耗时很长
Xcode 8 UI Testing Taking Very Long
我正在 XCode 8 中为一个非常复杂的应用程序编写 UI 测试。我发现了几个问题,其中之一是我 运行 的每个测试都需要几分钟。
我 运行ning 的特定测试流程甚至没有那么复杂。
我收到很多 "Wait for app to idle" 条消息。
有谁知道为什么 运行 测试需要这么长时间,或者您对我如何加快测试有什么建议吗? WWDC 演示基本上是即时的,但那是一个非常简单的应用程序。
这是我看到的例子,以及它需要多长时间。 (考试也还是运行ning!)
t = 504.16s Wait for app to idle
t = 625.29s App animations complete notification not received, will attempt to continue.
t = 625.30s Synthesize event
t = 625.67s Wait for app to idle
谢谢!
更新:当我与应用程序进行轻微交互时,同时保持我需要的元素可见,例如通过拉动表格视图,测试继续。
框架将等待应用变为静态,因此如果任何视图处于动画状态或显示任何 activity 指示器,可能包括状态栏中的网络 activity 指示器,框架将挂起,直到应用程序静止。这是为了防止在 UI 测试 运行.
时加载动画和组件的竞争条件
如果您认为可以覆盖其中的一些行为以加快您的 UI 测试,您可以尝试删除 activity 指标。
谢谢@Oletha - 我发现了这个应用程序可能特有的问题:
一次删除大量代码以查看问题所在后,我们发现我们在 UIRefreshControl
的子类上连续调用 beginRefreshing
和 endRefreshing
,行。
这让 UI 停滞不前,足以让应用程序在 "Wait for app to idle" 中停留几分钟。
我们用自定义方法替换了这两行,现在测试正常 运行。
我遇到了同样的问题 - 在实际设备上我会不断看到 "Wait for app to idle"
2 个简单的解决方案:
1) 如果您运行正在使用设备,请确保它保持静止(即不动)。 运行 拿着设备进行测试,它总是在等待应用程序空闲。平放在桌子上,测试 运行 很好。
2) 或者,运行 如果可能,您在模拟器上进行测试
我遇到了同样的问题。解决方案是将对 endRefreshing 的调用从处理程序移动到处理程序中触发的网络方法的末尾。换句话说,如果您刷新 table 视图,请确保在加载所有数据后结束刷新。
在我的例子中是因为我有一些动画 (UIView.animate...
) 所以我不得不 UIView.setAnimationsEnabled(false)
当 运行 来自 UI 测试的应用程序(你可以发送launchArguments
之类的)。
在调用app.launch()
之前设置launchArguments
:
app.launchArguments = ["enable-testing"]
app.launch()
然后在 AppDelegate
中检查启动参数:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
#if DEBUG
if CommandLine.arguments.contains("enable-testing") {
UIView.setAnimationsEnabled(false)
}
#endif
// ...
}
就这些!
我正在 XCode 8 中为一个非常复杂的应用程序编写 UI 测试。我发现了几个问题,其中之一是我 运行 的每个测试都需要几分钟。
我 运行ning 的特定测试流程甚至没有那么复杂。
我收到很多 "Wait for app to idle" 条消息。
有谁知道为什么 运行 测试需要这么长时间,或者您对我如何加快测试有什么建议吗? WWDC 演示基本上是即时的,但那是一个非常简单的应用程序。
这是我看到的例子,以及它需要多长时间。 (考试也还是运行ning!)
t = 504.16s Wait for app to idle t = 625.29s App animations complete notification not received, will attempt to continue. t = 625.30s Synthesize event t = 625.67s Wait for app to idle
谢谢!
更新:当我与应用程序进行轻微交互时,同时保持我需要的元素可见,例如通过拉动表格视图,测试继续。
框架将等待应用变为静态,因此如果任何视图处于动画状态或显示任何 activity 指示器,可能包括状态栏中的网络 activity 指示器,框架将挂起,直到应用程序静止。这是为了防止在 UI 测试 运行.
时加载动画和组件的竞争条件如果您认为可以覆盖其中的一些行为以加快您的 UI 测试,您可以尝试删除 activity 指标。
谢谢@Oletha - 我发现了这个应用程序可能特有的问题:
一次删除大量代码以查看问题所在后,我们发现我们在 UIRefreshControl
的子类上连续调用 beginRefreshing
和 endRefreshing
,行。
这让 UI 停滞不前,足以让应用程序在 "Wait for app to idle" 中停留几分钟。
我们用自定义方法替换了这两行,现在测试正常 运行。
我遇到了同样的问题 - 在实际设备上我会不断看到 "Wait for app to idle"
2 个简单的解决方案:
1) 如果您运行正在使用设备,请确保它保持静止(即不动)。 运行 拿着设备进行测试,它总是在等待应用程序空闲。平放在桌子上,测试 运行 很好。
2) 或者,运行 如果可能,您在模拟器上进行测试
我遇到了同样的问题。解决方案是将对 endRefreshing 的调用从处理程序移动到处理程序中触发的网络方法的末尾。换句话说,如果您刷新 table 视图,请确保在加载所有数据后结束刷新。
在我的例子中是因为我有一些动画 (UIView.animate...
) 所以我不得不 UIView.setAnimationsEnabled(false)
当 运行 来自 UI 测试的应用程序(你可以发送launchArguments
之类的)。
在调用app.launch()
之前设置launchArguments
:
app.launchArguments = ["enable-testing"]
app.launch()
然后在 AppDelegate
中检查启动参数:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
#if DEBUG
if CommandLine.arguments.contains("enable-testing") {
UIView.setAnimationsEnabled(false)
}
#endif
// ...
}
就这些!