为什么XCTestCase会覆盖XCTest的setup方法?
Why does XCTestCase override the setup method of XCTest?
我想认为我理解继承的概念,但显然我不理解,因为我很困惑为什么 XCTestCase 中有一个设置方法,如果 XCTest 在其 class? XCTestCase 是 XCTest 的子class,但在阅读 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.
}
}
}
您可以重写子class中的方法,为超级class添加更多功能。
您可以完全覆盖 superclass 的实现,或者您可以在覆盖方法中调用 super.setUp()
以在您添加的任何内容之前执行 superclass 的实现覆盖。
在测试中,XCTestCase subclass 覆盖 setUp()
以添加通用设置操作是很常见的 class,而 superclass 的实现将为您的整个套件执行常见的设置操作。例如,一个 XCTestCase subclass 将有一个启动应用程序的 setUp()
方法,而 class 的 subclass 将有一个 setUp()
方法,它调用其 superclass 设置,然后初始化 class 中的待测区域。在单元测试中,这可能意味着创建一个对象,或者在 UI 测试中,这可能意味着导航到您应用中的特定页面。
如果您希望在测试的设置阶段发生某些事情,您需要在子class 时覆盖 XCTestCase 的 setUp()
,因为默认情况下它有一个空实现。
XCTest定义setUp()
方法的原因(即使它什么都不做)是为了使XCTest上的其他方法能够调用setUp()
,例如XCTestCase上的invokeTest()
调用 setUp()
。这使框架的用户能够通过覆盖 setUp()
方法来指定在每个测试开始时要完成的操作,这不需要任何测试调用逻辑,而不必覆盖其中包含其他逻辑的方法,这在覆盖该方法时,我们不一定知道并且可能无法正确或根本无法实现。此模型使 setUp()
成为一个安全的地方,您可以完全按照自己的选择执行代码,而无需担心是否破坏了整个测试框架。
XCTest 是一个基础 class,具有空 setUp()
和 tearDown()
方法。
XCTestCase 继承自 XCTest,因此它继承了相同的方法。它没有自己的实现。无论如何,它们只是无所事事的方法。它们的定义只是为了让我们可以覆盖它们。这是 Template Method design pattern.
的示例
为什么要在XCTest中定义这些方法,或者根本没有XCTest?测试运行器可以处理来自 XCTest 的任何 subclasses,并且对 XCTestCase 一无所知。这可能允许我们定义除 XCTestCase 子 classes 之外的定义测试套件的新方法,同时仍然与 XCTest 框架集成。
有关 xUnit 架构的更多信息,请参阅 JUnit: A Cook's Tour
我想认为我理解继承的概念,但显然我不理解,因为我很困惑为什么 XCTestCase 中有一个设置方法,如果 XCTest 在其 class? XCTestCase 是 XCTest 的子class,但在阅读 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.
}
}
}
您可以重写子class中的方法,为超级class添加更多功能。
您可以完全覆盖 superclass 的实现,或者您可以在覆盖方法中调用 super.setUp()
以在您添加的任何内容之前执行 superclass 的实现覆盖。
在测试中,XCTestCase subclass 覆盖 setUp()
以添加通用设置操作是很常见的 class,而 superclass 的实现将为您的整个套件执行常见的设置操作。例如,一个 XCTestCase subclass 将有一个启动应用程序的 setUp()
方法,而 class 的 subclass 将有一个 setUp()
方法,它调用其 superclass 设置,然后初始化 class 中的待测区域。在单元测试中,这可能意味着创建一个对象,或者在 UI 测试中,这可能意味着导航到您应用中的特定页面。
如果您希望在测试的设置阶段发生某些事情,您需要在子class 时覆盖 XCTestCase 的 setUp()
,因为默认情况下它有一个空实现。
XCTest定义setUp()
方法的原因(即使它什么都不做)是为了使XCTest上的其他方法能够调用setUp()
,例如XCTestCase上的invokeTest()
调用 setUp()
。这使框架的用户能够通过覆盖 setUp()
方法来指定在每个测试开始时要完成的操作,这不需要任何测试调用逻辑,而不必覆盖其中包含其他逻辑的方法,这在覆盖该方法时,我们不一定知道并且可能无法正确或根本无法实现。此模型使 setUp()
成为一个安全的地方,您可以完全按照自己的选择执行代码,而无需担心是否破坏了整个测试框架。
XCTest 是一个基础 class,具有空 setUp()
和 tearDown()
方法。
XCTestCase 继承自 XCTest,因此它继承了相同的方法。它没有自己的实现。无论如何,它们只是无所事事的方法。它们的定义只是为了让我们可以覆盖它们。这是 Template Method design pattern.
的示例为什么要在XCTest中定义这些方法,或者根本没有XCTest?测试运行器可以处理来自 XCTest 的任何 subclasses,并且对 XCTestCase 一无所知。这可能允许我们定义除 XCTestCase 子 classes 之外的定义测试套件的新方法,同时仍然与 XCTest 框架集成。
有关 xUnit 架构的更多信息,请参阅 JUnit: A Cook's Tour