焦点 (Focus)

Focus 是一个用于 Swift 3 的 BDD / TDD 断言库,可以与任何 Swift 测试框架配对使用。它与 Observe 测试框架尤其配合良好。

Focus 和 Observe 耦合到任何其他框架,因此您可以将此包包含在您的测试或您的主应用程序代码中。

要求

如何使用

安装

打开您的 Package.Swift 文件并添加以下依赖项

dependencies: [
    .package(url: "https://github.com/ObserveSocial/Focus.git", from: "0.5.0")
]

在终端运行 swift build 来获取这个新的依赖项。

使用 XCTest 运行测试

  1. 创建一个新的 XCTest 文件
  2. import Focus
  3. 指定失败处理程序
  4. expect() 某些内容
import XCTest
import Focus

class SimpleTest: XCTestCase {

    override class func setUp() {
        Focus.defaultReporter().failBlock = XCTFail
    }

    func testSomething() {
        var foo = false
        
        expect(foo)to.be.true() // This will fail. This is the equivalent of calling XCTAssertTrue(foo)
    }
  }
}

匹配器

expect(foo).to.be.true()
expect(foo).to.fail()
expect(foo).to.pass()

报告器

报告器定义了如何将输出记录到控制台。报告器也是您需要声明测试通过或失败时发生什么的地方。因为 Focus 没有耦合到 XCTest,如果您想使用 XCTest,您必须告诉它。

Focus 定义了一个 Reportable 协议,您可以实现该协议来自定义测试输出的记录方式,以及如何处理通过和失败的测试。默认情况下,Focus 使用其自身非常简单的报告器。还有一个 Clean Reporter,我们建议您使用它。

最简单的入门方法是使用默认或 clean 报告器,并告诉该报告器在测试失败时使用 XCTFail

override class func setUp() {
    Focus.defaultReporter().failBlock = XCTFail
}

自定义报告器

如果您想构建自己的报告器,只需创建一个新类型并使其符合 Reportable 协议。然后告诉 Focus 使用您的自定义报告器。

import XCTest
import Observe

class MyReporter: Focus.Reportable {
    
    let sharedInstance = MyReporter()
    
    public func testPassed(file: StaticString, method: String, line: UInt, message: String, evaluation: String) {
        
        print(message)
    }
    
    public func testFailed(file: StaticString, method: String, line: UInt, message: String, evaluation: String) {
        
        print(message)
        XCTFail(message, file: file, line: line)
    }

}

class SimpleTest: XCTestCase {
    
    override class func setUp() {
        super.setUp()
        let reporter = MyReporter.sharedInstance
        Focus.set(reporter: reporter)
    }
    
	func testSomething() {
        var foo = false
        expect(foo)to.be.true() 
    }
}

class AnotherSimpleTest: XCTestCase {
    
    override class func setUp() {
        super.setUp()
        let reporter = MyReporter.sharedInstance
        Focus.set(reporter: reporter)
    }
    ...
}

让您的报告器成为单例模式可能很有用,这样您就可以在多个测试之间共享状态。这将允许您跟踪诸如已通过或失败的测试总数等统计信息。

特性

BDD 风格

链式 BDD 风格提供了一种富有表现力的语言和可读的风格。一种非常易读的风格

expect(foo).to.be.true()

无依赖项

Focus 完全没有耦合到 XCTest,事实上 Focus 永远不会依赖于 Foundation 以外的任何框架。这允许您指定当断言通过或失败时您希望发生什么。

这意味着您永远不必担心将任何其他框架导入到您的代码中。这也意味着您可以在应用程序的测试或应用程序的核心代码中使用此框架。

类型安全

Focus 确保您不会比较两个不匹配的类型

// Does not compile:
expect(1 + 1).to.be.true()

贡献

所有开发者都应感到欢迎和鼓励为 Focus 做出贡献,请参阅我们的 CONTRIBUTING 文档以参与其中。