【问题标题】:Get result of each test case executed in Xcode UI tests获取在 Xcode UI 测试中执行的每个测试用例的结果
【发布时间】:2018-06-01 15:25:24
【问题描述】:

在我的 Xcode 测试套件中执行每个测试用例后,我需要测试状态。我知道观察者可以帮助实现它。但是如何在测试中使用它呢?

【问题讨论】:

  • 请详细说明。并且不要忘记提及您迄今为止所做的尝试,以便利他主义者可以更有效地帮助您
  • 如果您确切地说为什么您需要这个,或者您的用例是什么,将会很有帮助,因为单个单元测试通常是独立的。
  • Swift 还是 Objective-C?
  • 我需要将我的测试结果与测试管理工具 TestRail 集成。执行每个测试后,我需要调用 API 来更新结果。我看到了一些关于使用观察者的帖子..但它们还不够清楚。我将为每个测试附加一个测试用例 ID,并将 ID 和结果作为参数发送到 API 调用中。我认为使用观察者并从函数“testCase(_:didFailWithDescription:inFile:atLine:)”(XCTestObservation 中的一种方法)获取结果将帮助我获得失败的测试。但是,我不确定这是否是解决方案。
  • 我已经用 Swift 编写了测试。

标签: xcode xctest xcode-ui-testing ui-testing xctestcase


【解决方案1】:

每个测试用例的执行结果都保存在一个名为 ***TestSummeries.plist 的文件中。

你会在下面找到它

~/Library/Developer/Xcode/DerivedData/<your-app-name>/Logs/Test/****_TestSummeries.plist

如果您多次运行测试,只需在执行前删除 DerivedData 中的所有内容。然后你会发现只有一个TestSummeries.plist。

然后解析plist并从plist文件中获取你想要的数据。

**如果您需要有关它的更多信息,请随时在下面发表评论。

【讨论】:

  • 是的,结果存储在该文件中,但我正在寻找一种更有效的方法,因为我将自动化将测试结果更新到 TestRail 的整个过程,它需要是一个无缝的。在测试运行多次的情况下,我不必手动删除数据。
【解决方案2】:

您走在正确的轨道上,并且可以通过 XCTestObservation 协议 (https://developer.apple.com/documentation/xctest/xctestobservation) 实现您想要做的事情。您可以在测试用例类中添加观察者,我建议在 setUp() 方法中执行此操作,因为它会在每个测试方法之前执行。

override func setUp() {
    super.setUp()

    continueAfterFailure = false

    XCUIApplication().launch()

    XCTestObservationCenter.shared.addTestObserver(UITestObserver())
}

为此,您应该实现一个符合 XCTestObservation 协议的类,然后为感兴趣的方法提供您自己的实现,以执行您需要/想要的任何操作。在您的情况下,您可能希望为此方法提供一个实现...

optional public func testCase(_ testCase: XCTestCase, didFailWithDescription description: String, inFile filePath: String?, atLine lineNumber: Int)

下面是这个测试观察者类可能是什么样子的一个简单示例...

import XCTest

public class UITestObserver: NSObject, XCTestObservation {
    public func testCase(_ testCase: XCTestCase,
                           didFailWithDescription description: String,
                           inFile filePath: String?,
                           atLine lineNumber: Int) {
        print("failure description: \(description)")
        print("failed test case: \(testCase)")
        if let filePath = filePath {
            print("failure at file path: \(filePath)")
        }
        print("failure at line: \(lineNumber)")
    }
}

只要你的一个测试用例失败,我提供的这个函数就会被调用,所以你不需要在你的测试用例类或方法中“做”任何事情。

希望这会有所帮助!

【讨论】:

  • @Khazana 您介意接受我的回答作为解决方案吗? :)
  • 您可能还需要覆盖其他方法描述。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-25
  • 2021-06-25
  • 2015-10-14
  • 1970-01-01
  • 2018-02-05
  • 1970-01-01
相关资源
最近更新 更多