UITests 在组中运行时失败,但在独立运行时成功

Posted

技术标签:

【中文标题】UITests 在组中运行时失败,但在独立运行时成功【英文标题】:UITests failing when run in group but succeed when run independently 【发布时间】:2018-05-28 10:43:18 【问题描述】:

我目前正在开发一个包含许多异步代码的项目,并且正在为该项目编写 UITest。在开发过程中,我一个一个地运行它们,但从未在一个组中运行。所以我认为测试成功了。但是当一起测试它们时,它们中的大多数都失败了。我正确实施了设置和拆卸。我研究了这种行为的原因,但找不到任何好的答案。这就像等待期望没有正常工作......

这是导致大多数问题的方法。每次我想等待一个元素出现时,我都会调用它。

/*
* This method will wait for an element (10 seconds default) afterwards it will assert it existence
*
* - parameter toAppear:The condition we are waiting for.
* - parameter element: The element to be expected
* - parameter timeout: The MAX time that the function will wait for the element, 10 seconds if none is given
* - parameter file:    The file where the error will be displayed, the current file will be used in case none is provided
* - parameter line:    The code line where the error will be displayed, the current line will be used in case none is provided
*/
static func assertForElement(toAppear: Bool, _ element: XCUIElement?, timeout: TimeInterval = 10, file: String = #file, line: Int = #line) 

    guard let currentTestCase = BaseXCTestCase.CurrentTestCase else 
        return
    

    guard let element = element else 
        let message = "Element cannot be empty"

        currentTestCase.recordFailure(withDescription: message, inFile: file, atLine: line, expected: true)

        return
    

    let existsPredicate = NSPredicate(format: "exists == \(toAppear)")

    currentTestCase.expectation(for: existsPredicate, evaluatedWith: element, handler: nil)
    currentTestCase.waitForExpectations(timeout: timeout)  [weak currentTestCase] (error: Error?) in

        if (error != nil) 
            let appearMessage = "Failed to find \(String(describing: element)) after \(timeout) seconds."
            let disappearMessage = "Failed to see \(String(describing: element)) disappear after \(timeout) seconds."

            currentTestCase?.recordFailure(withDescription: ((toAppear == false) ? disappearMessage : appearMessage), inFile: file, atLine: line, expected: true)
        
    

谁有 UITest 异步代码的好方法?

非常感谢您!

更新

这是我收到的错误警告。

大多数时候我只是得到:Asynchronous wait failed: Exceeded timeout of 10 seconds, with unfulfilled expectations: "Expect predicateexists == 1for object 但该元素在模拟器中是可见和可点击的。另一方面,我得到:caught "NSInternalInconsistencyException", "API violation - creating expectations while already in waiting mode."...

【问题讨论】:

您遇到了什么错误? @Oletha 我用我得到的两个错误更新了我的问题 您考虑过使用XCUIElement.waitForExistence(timeout:) 方法吗? 【参考方案1】:

您的错误消息暗示您在致电waitForExpectations 后会产生额外的期望。

首先创建您的所有期望,然后调用 waitForExpectations 作为测试中的最后一行代码。

【讨论】:

好的,我会调查的!即使元素存在,您是否知道引发的第一个错误? 我通常使用“exists == true”作为谓词而不是“exists == 1”,但这应该没问题,因为它们本质上是相同的。您可以尝试在元素上使用waitForExistence(timeout:) 而不是使用谓词,看看结果如何? 是的,当然!所以我明天会评论我的结果!

以上是关于UITests 在组中运行时失败,但在独立运行时成功的主要内容,如果未能解决你的问题,请参考以下文章

Selenium IDE 测试在 GUI 中运行 - 但在 CL 中运行时失败(链接文本不可见)

Spark在本地运行但在YARN中运行时找不到文件

在 Amazon EMR 集群中运行时,Spark 广播变量返回 NullPointerException

想要运行在 windows 中制作的 kivy 应用程序,但在 mac os 中运行时显示错误

Postgres 选择查询在使用 JDBC 时运行缓慢,但在从同一服务器在 PSQL 中运行时快速

System.NullReferenceException 用于在 Windows 服务器 IIS 上运行但在 Visual Studio IIS Express 中运行时在本地运行的 .NET 服务