为什么XCTestCase会覆盖XCTest的设置方法?

时间:2017-03-29 21:43:30

标签: ios swift xctest xctestcase

我想我理解继承的想法,但显然我不是因为我很困惑为什么在XCTestCase中有一个设置方法,如果XCTest在其中提供了设置方法类? XCTestCase是XCTest的子类,但在阅读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.
        }
    }

}

2 个答案:

答案 0 :(得分:4)

XCTest是一个基类,使用空setUp()tearDown()方法。

XCTestCase继承自XCTest,因此它继承了那些相同的方法。它没有自己的实现。无论如何,他们只是无所事事的方法。它们只是定义为我们可以覆盖它们。这是Template Method design pattern的一个示例。

为什么在XCTest中定义这些方法,或者根本没有XCTest?测试运行器可以处理来自XCTest的子类,并且对XCTestCase一无所知。这可能允许我们定义除XCTestCase子类之外的定义测试套件的新方法,同时仍然与XCTest框架集成。

有关xUnit架构的更多信息,请参阅JUnit: A Cook's Tour

答案 1 :(得分:2)

您可以覆盖子类中的方法,以便为超类添加更多功能。

您可以完全覆盖超类的实现,或者您可以在覆盖方法中调用super.setUp(),以便在您在覆盖中添加任何内容之前执行超类的实现。

在测试中,XCTestCase子类覆盖setUp()以为该类添加常用设置操作是常见的,而超类的实现将执行整个套件的常见设置操作。例如,一个XCTestCase子类将有一个setUp()方法启动应用程序,该类的子类将有一个setUp()方法调用其超类设置,然后初始化该类中的测试区域。在单元测试中,这可能意味着创建对象,或者在UI测试中,这可能意味着导航到应用中的特定页面。

如果您希望在测试的设置阶段发生某些事情,则需要在子类化时重写XCTestCase' setUp(),因为它默认情况下为空实现。

XCTest定义了setUp()方法的原因(即使它什么都不做)是为了让XCTest上的其他方法能够调用setUp(),例如,在XCTestCase调用上invokeTest() { {1}}。这使框架的用户能够通过覆盖setUp()方法来指定在每个测试开始时要完成的操作,该方法不需要任何测试调用逻辑,而不必覆盖其中包含其他逻辑的方法,在覆盖方法时,我们不一定知道并且可能无法正确实现或根本不实现。这个模型使setUp()成为您完全按照自己的选择执行代码的安全场所,而无需担心您是否已经破坏了整个测试框架。