🪶 xctest-resettable

CI

一个帮助保持你的单元测试轻量级的框架。

动机

在大型项目中,当测试套件很大时,很容易看到在运行测试时内存消耗是如何不断增加的。这是由于 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()
}

使用 reset 方法初始化

也可以向属性包装器添加一个方法,它将在 tearDown() 方法中执行,就在释放对象之前。

class SUT {
    func reset() { ... }
}

@Resettable(onReset: SUT.reset)
var sut: SUT! = SUT()

注意:reset 方法必须在测试对象内部声明。

上面的代码将被翻译成以下使用 tearDown() 的形式

override func tearDown() {
    sut.reset()
    sut = nil
    super.tearDown()
}