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
来获取这个新的依赖项。
import Focus
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 风格提供了一种富有表现力的语言和可读的风格。一种非常易读的风格
expect(foo).to.be.true()
Focus 完全没有耦合到 XCTest,事实上 Focus 永远不会依赖于 Foundation
以外的任何框架。这允许您指定当断言通过或失败时您希望发生什么。
这意味着您永远不必担心将任何其他框架导入到您的代码中。这也意味着您可以在应用程序的测试或应用程序的核心代码中使用此框架。
Focus 确保您不会比较两个不匹配的类型
// Does not compile:
expect(1 + 1).to.be.true()
所有开发者都应感到欢迎和鼓励为 Focus 做出贡献,请参阅我们的 CONTRIBUTING 文档以参与其中。