在iOS应用程序的UI测试中禁用等待空闲状态

Jon*_*nny 9 ios xcode-ui-testing

基本上问题与此问题相同:XCTestCase:等待应用程序空闲

我在视图中一直在使用"背景动画".Xcode/iOS的!@#$#$和@ UI测试想要等待所有UIView动画在它认为应用程序空闲之前结束并继续点击按钮等等.它只是不适用于我们的方式设计了应用程序.(具体来说,我们有一个带有UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse选项动画的按钮,因此它永远不会停止.)

但我认为可能有某种方法可以关闭和/或缩短状态"等待应用程序闲置".在那儿?怎么样?还有其他方法吗?

gh1*_*man 19

你实际上可以禁用wait for app to idle.这是一个黑客,可能不稳定.禁用动画,并启用此黑客攻击后,我发现性能提升了20%(除了禁用动画的性能提升之外).

所有你需要做的就是调出一个叫做空闲应用程序的方法,然后不用它.那个方法是XCUIApplicationProcess waitForQuiescenceIncludingAnimationsIdle:

这是我在swift 3中的工作解决方案 - 可能有更好的方法,但这可用于概念验证.

扩展XCTestCase课程.我打电话给我MyTestCase

static var swizzledOutIdle = false

override func setUp() {
    if !MyTestCase.swizzledOutIdle { // ensure the swizzle only happens once
        let original = class_getInstanceMethod(objc_getClass("XCUIApplicationProcess") as! AnyClass, Selector(("waitForQuiescenceIncludingAnimationsIdle:")))
        let replaced = class_getInstanceMethod(type(of: self), #selector(MyTestCase.replace))
        method_exchangeImplementations(original, replaced)
        MyTestCase.swizzledOutIdle = true
    }
    super.setUp()
}

@objc func replace() {
    return
}
Run Code Online (Sandbox Code Playgroud)

注意wait for app to idle将不再出现在日志中.

  • 奇迹般有效!此外,您可以提到,由于这种情况,在某些情况下有必要使用“waitForExistence”函数——因为速度;) (2认同)

h.w*_*ers 12

不幸的是,使用Apple的UI测试无法将"等待app闲置"或轮询其他网络活动,但是您可以使用环境变量来禁用应用中的动画以使测试更稳定.在测试之前的设置方法中设置这样的环境变量.

override func setUp() {
    super.setUp()
    continueAfterFailure = false
    let app = XCUIApplication()
    app.launchEnvironment = ["UITEST_DISABLE_ANIMATIONS" : "YES"]
    app.launch()
}
Run Code Online (Sandbox Code Playgroud)

现在在您的源代码中:

if (ProcessInfo.processInfo.environment["UITEST_DISABLE_ANIMATIONS"] == "YES") {
    UIView.setAnimationsEnabled(false)
}
Run Code Online (Sandbox Code Playgroud)

如果您只希望它禁用该特定视图的动画或在代理文件中禁用整个应用程序中的动画,则可以将该检查放在特定视图中.