在调用每个测试方法之前如何调用setUp()方法?

时间:2017-04-04 13:16:59

标签: ios swift oop xctest xctestcase

我正在阅读一本关于Swift中测试驱动开发的好书。我的最终目标是更好地理解OOP架构。在我正在阅读本书时,早期的一节说明在我理解的每个测试方法之前触发了setUp()方法,对象的设置是为了通过或失败结果运行测试。我不确定的是,从建筑的角度来看,这是怎么回事? Apple如何能够创建一个具有在类中的其他每个方法之前触发的方法的类?

以下是一些示例代码:

import XCTest
@testable import FirstDemo

class FirstDemoTests: XCTestCase {

    override func setUp() {
        super.setUp()
        // Put setup code here. This method is called before the invocation of each test method in the class.
    }

    override func tearDown() {
        // Put teardown code here. This method is called after the invocation of each test method in the class.
        super.tearDown()
    }

    func testExample() {
        // This is an example of a functional test case.
        // Use XCTAssert and related functions to verify your tests produce the correct results.
    }

    func testPerformanceExample() {
        // This is an example of a performance test case.
        self.measure {
            // Put the code you want to measure the time of here.
        }
    }

}

3 个答案:

答案 0 :(得分:4)

我认为XCTest类的生命周期就像UIViewController一样。

与视图加载到内存后viewDidLoad()之后调用的init(coder:)相同,在加载测试类后(在对象生命期内一次)也会调用setUp()方法。

您还可以在github上调查本机和第三方测试框架源代码:

https://github.com/apple/swift-corelibs-xctest

https://github.com/google/googletest

答案 1 :(得分:2)

您正在对一个名为XCTestCase的类进行子类化。通常,Testframework会内省定义测试方法的类,并按特定顺序运行它们。

无论如何,我不是100%确定XCTest是否以这种方式工作,但您可以尝试查看源代码并尝试深入挖掘:

https://github.com/apple/swift-corelibs-xctest

答案 2 :(得分:2)

对于每个要测试的测试:调用setup(),然后调用实际测试,然后调用teardown()

然后再次从该类设置另一个测试并再次使用tearDown ...直到测试类的所有**测试都运行完毕。

这些行的顺序不会影响首先调用哪个测试。

之所以采用这种方式是因为2次测试应该是100%独立的。您不希望 testExample 对object / sut / system_under_test做一些事情(改变其状态)您正在执行测试但是,撤消什么它已经完成了。否则,您的 testPerformanceExample 将从您尚未加载的状态加载 期待。