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

How is the setUp() method called before the invocation of each test method?

我正在阅读一本很棒的书,学习 Swift 中的测试驱动开发。我的最终目标是更好地理解 OOP 体系结构。在我阅读这本书时,前面的一节指出,setUp() 方法在我理解的每个测试方法执行对象设置之前触发,以 运行 测试通过或失败结果。我不确定的是,从架构的角度来看,这怎么可能? Apple 是如何制作一个 class 的方法,该方法在 class 中的所有其他方法之前被触发?

下面是一些示例代码:

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.
        }
    }

}

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

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

您还可以在 github:

上调查本机和第三方测试框架源代码

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

https://github.com/google/googletest

您正在子类化一个名为 XCTestCase 的 Class。通常,Testframework 内省 Class es,其中定义了 Test-Methods 并且 运行 它们以特定的顺序排列。

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

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

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

然后再次从 class 设置 另一个 测试并再次拆卸...直到您的测试 class 的所有**测试得到 运行.

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

之所以这样做是因为 2 个测试应该是 100% 独立的。你不希望 testExample 对你正在执行测试的 object/sut/system_under_test 做一些事情(改变它的状态)但是,不是撤消已完成的操作。否则你的 testPerformanceExample 将从你不是的状态加载 期待。