2017-04-04 82 views
3

我正在阅读一本关于Swift中测试驱动开发的书。我的最终目标是更好地理解OOP体系结构。在我读这本书的时候,最早的一节讲述了setUp()方法在每个测试方法之前被触发,我明白做的是设置对象以运行测试以获得通过或失败的结果。我不确定的是,从架构的角度来看,这甚至是可能的?苹果公司如何能够制定出一种在班级中每一种其他方法之前都被解雇的方法?在调用每个测试方法之前,如何调用setUp()方法?

下面是一些示例代码:

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

} 

回答

4

我认为XCTest类都有一个生命周期,就像UIViewController例如。

与相同viewDidLoad()当视图加载到内存时调用setUp()方法在加载测试类(在对象的生命期间一次)后也被调用。

您也可以在github调查本地和第三方测试框架的源代码:

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

https://github.com/google/googletest

+0

谢谢,如果是这种情况,那么我该如何理解UIViewController的方法是如何被触发的?例如,我相信ViewDidLoad()是由运行时环境自动触发的。但是,我们所说的“自动”是指什么,我正在考虑某个地方的某个地方是否调用了这种方法,我想知道在哪里了解更多信息。我希望这是有道理的 –

2

你是子类名为XCTestCase类。通常测试框架反思定义测试方法的类,并以特定顺序运行它们。

无论如何,我不是100%肯定,如果XCTest正在以这种方式工作,但你可以尝试看看源代码,并试图挖掘有更深层次的:

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

+0

谢谢你,这是一个好点,因为我忘了Swift是开源的,但我发现导航github回购有点混淆,至于如何找到我感兴趣的区域。有关这方面的任何提示? –

+1

我不会试图理解整个来源,只是通过在git中读取它...我会尝试检查出来并构建它。建立后,尝试引用另一个项目,写一些愚蠢的测试,以确保它的工作。然后玩。改变一下源代码,打破它,引入一些错误。重新编译一切,看看会发生什么。 – Kris

2

对于每个测试被测试:setup()被调用,然后进行实际测试,然后teardown()

然后再次设置另一个测试从这个类和tearDown再次......直到你的测试类的所有**测试得到运行。

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

这样做的原因是因为2个测试应该100%独立。你不想测试示例对你正在执行你的测试的对象/ sut/system_under_test(改变它的状态)做一些事情,但是,而不是撤消它做了什么。否则你的testPerformanceExample将从你不是 的期望状态加载。

相关问题