XCUITest 与 TestRail 集成
XCUITest integration with TestRail
目前正致力于将我的 UITest-运行 结果集成到 TestRail 中,因此在每次测试后 运行 它在 testrail 中将我的测试标记为 Pass\Fail。
我的想法是:
- 在 CI 中创建一个 "pre-build" 脚本,该脚本将在 testrail 中创建一个测试 运行。
- 在执行自动化过程中,在测试 tearDown() 中获取测试结果(如果测试失败与否),将其全部保存到 json 文件中。 - 这里是第一个问题,如果测试失败了怎么获取?
- 完成所有测试后,运行 一个 "post-build" 脚本来更新 json 文件并向测试轨道发送请求(这将标记 pass\fail 测试)
任何已经从事此工作的人,听起来适合您吗?
有什么建议吗?
测试示例:
import XCTest
class MyUITests: XCTestCase {
override func setUp() {
super.setUp()
continueAfterFailure = false
appEntry.app.launch()
dismissSystemAlerts()
}
override func tearDown() {
super.tearDown()
}
func test_Elements() {
// MARK: Sample test
// my test actions are here
}
}
这就是我所做的,
- 运行 使用 fastlane
的扫描插件进行测试
- 生成junit格式结果
- 解析 xml 并获得每个测试的结果
- Post 它到我们的测试用例管理工具
请与我们所有人分享您的解决方案。
我就是这样实现的。
首先,我的 CI 中有预构建脚本,它将在 TestRail 中创建新的测试 运行。然后UITestObserver会发送API给TR更新状态。
我添加的新 class:
import Foundation
import XCTest
class UITestObserver: NSObject, XCTestObservation {
// Handle Test Case Failure
public func testCase(_ testCase: XCTestCase,
didFailWithDescription description: String,
inFile filePath: String?,
atLine lineNumber: Int) {
var testCaseId: [String] = []
if let MyTestCaseID = testCase as? BaseTest { testCaseId = MyTestCaseID.inegrateTestRailId() }
if testCaseId != ["NA"] {
postTestRailAddResultAPI(for: testCase, testCaseId: testCaseId, description: description)
}
}
// Handle Test Case Pass
public func testCaseDidFinish(_ testCase: XCTestCase) {
let testRun = testCase.testRun!
let verb = testRun.hasSucceeded
var testCaseId: [String] = []
if let MyTestCaseID = testCase as? BaseTest { testCaseId = MyTestCaseID.inegrateTestRailId() }
if verb == true && testCaseId != ["NA"] {
postTestRailAddResultAPI(for: testCase, testCaseId: testCaseId, description: "PASS")
}
}
在 BaseTest 设置中添加了这一行:
XCTestObservationCenter.shared.addTestObserver(UITestObserver())
并实现了发送实际请求以更新状态的函数 postTestRailAddResultAPI。
我所有的测试现在都有 testCaseId
,它存储 TestRail TestCase number
的值,这就是它知道要更新哪些 TC 的方式。
目前正致力于将我的 UITest-运行 结果集成到 TestRail 中,因此在每次测试后 运行 它在 testrail 中将我的测试标记为 Pass\Fail。
我的想法是:
- 在 CI 中创建一个 "pre-build" 脚本,该脚本将在 testrail 中创建一个测试 运行。
- 在执行自动化过程中,在测试 tearDown() 中获取测试结果(如果测试失败与否),将其全部保存到 json 文件中。 - 这里是第一个问题,如果测试失败了怎么获取?
- 完成所有测试后,运行 一个 "post-build" 脚本来更新 json 文件并向测试轨道发送请求(这将标记 pass\fail 测试)
任何已经从事此工作的人,听起来适合您吗? 有什么建议吗?
测试示例:
import XCTest
class MyUITests: XCTestCase {
override func setUp() {
super.setUp()
continueAfterFailure = false
appEntry.app.launch()
dismissSystemAlerts()
}
override func tearDown() {
super.tearDown()
}
func test_Elements() {
// MARK: Sample test
// my test actions are here
}
}
这就是我所做的,
- 运行 使用 fastlane 的扫描插件进行测试
- 生成junit格式结果
- 解析 xml 并获得每个测试的结果
- Post 它到我们的测试用例管理工具
请与我们所有人分享您的解决方案。
我就是这样实现的。 首先,我的 CI 中有预构建脚本,它将在 TestRail 中创建新的测试 运行。然后UITestObserver会发送API给TR更新状态。
我添加的新 class:
import Foundation
import XCTest
class UITestObserver: NSObject, XCTestObservation {
// Handle Test Case Failure
public func testCase(_ testCase: XCTestCase,
didFailWithDescription description: String,
inFile filePath: String?,
atLine lineNumber: Int) {
var testCaseId: [String] = []
if let MyTestCaseID = testCase as? BaseTest { testCaseId = MyTestCaseID.inegrateTestRailId() }
if testCaseId != ["NA"] {
postTestRailAddResultAPI(for: testCase, testCaseId: testCaseId, description: description)
}
}
// Handle Test Case Pass
public func testCaseDidFinish(_ testCase: XCTestCase) {
let testRun = testCase.testRun!
let verb = testRun.hasSucceeded
var testCaseId: [String] = []
if let MyTestCaseID = testCase as? BaseTest { testCaseId = MyTestCaseID.inegrateTestRailId() }
if verb == true && testCaseId != ["NA"] {
postTestRailAddResultAPI(for: testCase, testCaseId: testCaseId, description: "PASS")
}
}
在 BaseTest 设置中添加了这一行:
XCTestObservationCenter.shared.addTestObserver(UITestObserver())
并实现了发送实际请求以更新状态的函数 postTestRailAddResultAPI。
我所有的测试现在都有 testCaseId
,它存储 TestRail TestCase number
的值,这就是它知道要更新哪些 TC 的方式。