目前正在将我的UITest运行结果集成到TestRail中,因此在每次测试运行后,它都会在TestRail中将我的测试标记为通过\失败。
我的想法是:
- 在CI中创建一个"预构建"脚本,该脚本将在testrail中创建测试运行
- 在执行自动化的过程中,在testtearDown((中获取测试的结果(如果测试失败或否(,将其全部保存到json文件中。-这是第一个问题,如果测试失败,我该怎么办
- 完成所有测试后,运行"post-build"脚本以获取更新的json文件并将请求发送到testrail(它将标记通过\失败测试(
任何已经参与过这项工作的人,这听起来适合你吗?有什么建议吗
测试示例:
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
}
}
这就是我实现的方式。首先,我在CI中有一个预构建脚本,它将在TestRail中创建新的测试运行。然后UITestObserver将向TR发送API以更新状态。
我添加的新类:
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的方式。
这就是我所做的,
- 使用fastlane的扫描插件运行测试
- 生成junit格式的结果
- 解析xml并获得每个测试的结果
- 将其发布到我们的测试用例管理工具
请与我们所有人分享您的解决方案。