如何使用XCTestSuite? (斯威夫特3)

时间:2017-01-11 11:59:29

标签: ios swift3 xctest xctestcase

我们有一个运行iOS UI测试的Jenkins作业,我需要能够在测试运行期间根据某些运行时信息忽略一些测试(或测试类)。根据XCTestSuite文档https://developer.apple.com/reference/xctest/xctestsuite,您可以以编程方式创建自定义测试套件,但我没有找到任何实际操作示例。那么究竟是怎么回事呢?

我以下面的代码作为起点玩弄了这个,但并没有真正得到任何结果。当在Xcode中运行IgnoreThisClass时,即使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.")
    }
}

1 个答案:

答案 0 :(得分:0)

为了达到你想要的效果,你无法在XCTestCase子类中初始化XCTestSuite。这是因为为了使XCTestCase运行其测试(并因此设置),它必须已经是XCTestSuite的一部分 - 因此在已经初始化的测试中初始化自定义测试套件不会起作用。

Xcode会自动初始化必要的测试类,包括XCTestSuite,因此您无法控制它何时初始化并且无法向其发送任何自定义参数。

您最好的选择是为XCTestSuite添加extension,并添加是否运行套件中包含的测试用例的评估。