如何使用 XCTestSuite? (Swift 3)
How to use XCTestSuite? (Swift 3)
我们有一个 Jenkins 作业,运行 是我们的 iOS UI 测试,我需要能够忽略一些基于测试(或测试 类)的测试在测试期间的某些 运行 时间信息上 运行。根据 XCTestSuite 文档 https://developer.apple.com/reference/xctest/xctestsuite,您可以通过编程方式创建自定义测试套件,但我还没有找到任何实际操作示例。那么具体怎么做呢?
我已经用下面的代码作为起点玩弄了这个,但还没有真正取得进展。当 IgnoreThisClass 在 Xcode 中为 运行 时,其中的测试方法将获得 运行,即使 BaseTestClass 的 setUp() 中的 testCaseCount 报告套件中有 0 个测试。我是否需要改写某些 init() 方法或执行其他操作?任何提示将不胜感激!
import XCTest
class BaseTestClass: XCTestCase {
var runThis: Bool?
override func setUp() {
if runThis != nil {
let suite = XCTestSuite(name: "Custom suite")
if runThis! {
suite.addTest(self)
}
print("Testcases in suite \(suite.testCaseCount)")
// This causes an error that the suite has already started,
// even though this call is present in Apple's example documentation.
//suite.run()
}
XCUIApplication().launch()
}
override func tearDown() {
super.tearDown()
}
}
// Run this.
class RunThisClass: BaseTestClass {
override func setUp() {
super.runThis = true
super.setUp()
}
override func tearDown() {
super.tearDown()
}
func testThis() {
print("Test class was run.")
}
}
// Don't run this.
class IgnoreThisClass: BaseTestClass {
override func setUp() {
super.runThis = false
super.setUp()
}
override func tearDown() {
super.tearDown()
}
func testIgnoreThis() {
print("Ignored class was run.")
}
}
要实现您想要的效果,您将无法从 XCTestCase 子类中初始化 XCTestSuite。这是因为为了让 XCTestCase 运行 它的测试(并因此设置),它必须已经是 XCTestSuite 的一部分 - 因此在 already-initialized 测试中初始化自定义测试套件将不起作用。
Xcode 自动初始化必要的测试 类,包括 XCTestSuite,因此您无法控制它的初始化时间,也无法向它发送任何自定义参数。
你最好的选择是为 XCTestSuite 添加一个 extension
,并添加评估是否 运行 测试用例包含在套件中。
我们有一个 Jenkins 作业,运行 是我们的 iOS UI 测试,我需要能够忽略一些基于测试(或测试 类)的测试在测试期间的某些 运行 时间信息上 运行。根据 XCTestSuite 文档 https://developer.apple.com/reference/xctest/xctestsuite,您可以通过编程方式创建自定义测试套件,但我还没有找到任何实际操作示例。那么具体怎么做呢?
我已经用下面的代码作为起点玩弄了这个,但还没有真正取得进展。当 IgnoreThisClass 在 Xcode 中为 运行 时,其中的测试方法将获得 运行,即使 BaseTestClass 的 setUp() 中的 testCaseCount 报告套件中有 0 个测试。我是否需要改写某些 init() 方法或执行其他操作?任何提示将不胜感激!
import XCTest
class BaseTestClass: XCTestCase {
var runThis: Bool?
override func setUp() {
if runThis != nil {
let suite = XCTestSuite(name: "Custom suite")
if runThis! {
suite.addTest(self)
}
print("Testcases in suite \(suite.testCaseCount)")
// This causes an error that the suite has already started,
// even though this call is present in Apple's example documentation.
//suite.run()
}
XCUIApplication().launch()
}
override func tearDown() {
super.tearDown()
}
}
// Run this.
class RunThisClass: BaseTestClass {
override func setUp() {
super.runThis = true
super.setUp()
}
override func tearDown() {
super.tearDown()
}
func testThis() {
print("Test class was run.")
}
}
// Don't run this.
class IgnoreThisClass: BaseTestClass {
override func setUp() {
super.runThis = false
super.setUp()
}
override func tearDown() {
super.tearDown()
}
func testIgnoreThis() {
print("Ignored class was run.")
}
}
要实现您想要的效果,您将无法从 XCTestCase 子类中初始化 XCTestSuite。这是因为为了让 XCTestCase 运行 它的测试(并因此设置),它必须已经是 XCTestSuite 的一部分 - 因此在 already-initialized 测试中初始化自定义测试套件将不起作用。
Xcode 自动初始化必要的测试 类,包括 XCTestSuite,因此您无法控制它的初始化时间,也无法向它发送任何自定义参数。
你最好的选择是为 XCTestSuite 添加一个 extension
,并添加评估是否 运行 测试用例包含在套件中。