一个帮助保持你的单元测试轻量级的框架。
在大型项目中,当测试套件很大时,很容易看到在运行测试时内存消耗是如何不断增加的。这是由于 XCTestCase
工作流程。当一个 XCTestCase
类运行其测试时,会为它拥有的每个测试方法实例化一个新的测试用例,如果它没有被释放,测试对象的新的实例将不断被添加到内存中。这些对象应该在测试完成时被释放,而正确的方法是在测试用例提供的 tearDown()
方法中进行。解决方案如下所示
var sut: SUT! = SUT()
override func tearDown() {
sut = nil
super.tearDown()
}
这个框架,基于这个原则,实现了额外的逻辑,以便这个过程在幕后完成,通过简单地将一个属性包装器添加到你的测试对象中。
启用你的测试对象释放的属性包装器是 @Resettable
,它在 ResettableTestCase
子类下工作。以下是你使用 @Resettable
属性包装器的不同方式
@Resettable var sut: SUT!
override func setUp() {
super.setUp()
sut = SUT()
}
也可以向属性包装器添加一个方法,它将在 tearDown()
方法中执行,就在释放对象之前。
class SUT {
func reset() { ... }
}
@Resettable(onReset: SUT.reset)
var sut: SUT! = SUT()
注意:reset 方法必须在测试对象内部声明。
上面的代码将被翻译成以下使用 tearDown()
的形式
override func tearDown() {
sut.reset()
sut = nil
super.tearDown()
}