我们有一个运行我们的iOS UI测试的Jenkins作业,我需要能够在测试运行期间基于某些运行时信息忽略某些测试(或测试类)。根据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的一部分-因此在已初始化的测试中初始化自定义测试套件将无法正常工作。
Xcode自动初始化必要的测试类,包括XCTestSuite,因此您无法控制何时初始化它,也无法向其发送任何自定义参数。
最好的选择是为XCTestSuite添加一个extension
,并在其中添加是否运行套件中包含的测试用例的评估。