swift-checkit

Swift-checkit 是一个包含验证器的库,用于验证常见的协议。

这一切都始于我最近遇到的一个 bug:在我的一个自定义集合中,将 startIndex 递增 count 后返回了 nil,而不是预期的 endIndex。我以前从未注意到这一点,因为我所有的真实代码都以 +/-1 的步长递增索引,从来没有大于该步长。尽管如此,存在预期的、有文档记录的语义,并且通用代码依赖于此。

Swift 的协议不仅仅是语法的集合;每个协议都附带一些预期的行为。有时这些期望可以反映在类型系统中,但有时必须在文档中进行解释并留给程序员。这很好 - 但随着软件变得越来越复杂,很容易进行更改,从而意外地违反协议的某些微妙语义。这就是我们编写测试的原因。

Swift-checkit 提供了一些有用的预制测试,可以使这项工作更容易。

安装

通过 Swift Package Manager 进行安装。只需将包添加到您的 Package.swift 中,并将 “Checkit” 添加为您的测试目标的依赖项

// Package.swift

let package = Package(...
    dependencies: [
        .package(url: "https://github.com/karwa/swift-checkit.git", .branch("master"))
    ],
    targets: [
        .testTarget(name: "MyTests", dependencies: ["Checkit"]),
    ]
    ...
)

现在您需要编写的只是

// MyTests.swift
import Checkit

您就可以开始使用验证器了。您是否想检查您的自定义 Collection 是否真正符合该协议?或者您的 Sequence 约束算法是否真正处理单次遍历的 Sequence

func testCollectionSemantics() {
  let myCustomCollection = MyCollection(...)
  CollectionChecker.check(myCustomCollection)
}

// in project:
// func myAlgorithm<S: Sequence>(with: S) { ... }

func testAlgorithm() {
  SinglePassSequenceChecker.check(0..<5) { sequence in myAlgorithm(sequence) }
}

贡献

欢迎贡献!欢迎 fork/添加/发送 PR 以获取新的检查和检查器!