Swift 的 Power Assertions

此项目已迁移到新的仓库,请在此处查找:kishikawakatsumi / swift-power-assert

Power assertions(又称图解断言)通过提供条件评估过程中产生的值的信息来增强你的断言失败,并以易于理解的形式呈现。Power assertions 是 Spock(以及后来整个 Groovy 语言,独立于 Spock),ScalaTestExpecty 中广受欢迎的功能。

Power assertions 为你的测试提供描述性的断言消息,如下所示。

XCTAssert(max(a, b) == c)
          |   |  |  |  |
          7   4  7  |  12
                    false

XCTAssert(xs.contains(4))
          |  |        |
          |  false    4
          [1, 2, 3]

XCTAssert("hello".hasPrefix("h") && "goodbye".hasSuffix("y"))
          |       |         |    |  |         |         |
          "hello" true      "h"  |  "goodbye" false     "y"
                                 false

在线 Playground

SwiftPowerAssert 实时演示

https://swift-power-assert.kishikawakatsumi.com/

screen shot 2018-01-23 at 0 13 28

安装

$ git clone https://github.com/kishikawakatsumi/SwiftPowerAssert
$ cd SwiftPowerAssert
$ swift build -c release

将文件(.build/release/swift-power-assert)复制到你的二进制文件位置。

开始使用

对于 XCTest

xcodebuild test... 命令替换为 swift-power-assert xctest -Xxcodebuild test ...

$ /path/to/swift-power-assert xctest -Xxcodebuild test -scheme Atlas-Package

对于 swift test

swift test... 命令替换为 swift-power-assert test -Xswift test ...

$ /path/to/swift-power-assert test -Xswift test

注意: SwiftPowerAssert 在测试期间将工具代码注入到 XCTAssert() 方法族中。SwiftPowerAssert 在执行测试之前备份源文件,并在测试完成后自动恢复。但是,由于意外崩溃或其他错误,原始文件可能无法恢复。请在 Git 管理的项目中使用它。

运行示例项目

你可以使用以下命令运行示例项目

$ swift build -c release
$ (cd Fixtures/Atlas && ../../.build/release/swift-power-assert test -Xswift test)

用法

USAGE: swift-power-assert [options] subcommand [options]

OPTIONS:
  --verbose   Show more debugging information
  --help      Display available options

SUBCOMMANDS:
  test        Run swift test with power assertion
  xctest      Run XCTest with power assertion.

你可以在 -Xxcodebuild-Xswift 之后传递任何 xcodebuildswift 选项。

$ /path/to/swift-power-assert xctest -Xxcodebuild test -project Atlas.xcodeproj \
  -scheme Atlas-Package -sdk iphonesimulator \
  -destination "name=iPhone X,OS=11.2"
$ /path/to/swift-power-assert test -Xswift test -c release -Xswiftc -enable-testing

什么都没发生?如果测试成功,则不会输出任何内容。如果总是想看到丰富的 ASCII 图,请启用 --verbose 选项。无论断言成功与否,总是输出图表。

$ /path/to/swift-power-assert --verbose xctest -Xxcodebuild test -project Atlas.xcodeproj -scheme Atlas-Package
$ /path/to/swift-power-assert --verbose test -Xswift test

示例

let a = 10
let b = 9
XCTAssert(a * b == 91)

// Output:
// XCTAssert(a * b == 91)
//           | | | |  |
//           | | 9 |  91
//           | 90  false
//           10
let xs = [1, 2, 3]
XCTAssert(xs.contains(4))

// Output:
// XCTAssert(xs.contains(4))
//           |  |        |
//           |  false    4
//           [1, 2, 3]
XCTAssert("hello".hasPrefix("h") && "goodbye".hasSuffix("y"))

// Output:
// XCTAssert("hello".hasPrefix("h") && "goodbye".hasSuffix("y"))
//           |       |         |    |  |         |         |
//           "hello" true      "h"  |  "goodbye" false     "y"
//                                  false
let d = 4
let e = 7
let f = 12

XCTAssert(max(d, e) == f)
XCTAssert(d + e > f)

// Output:
// XCTAssert(max(d, e) == f)
//           |   |  |  |  |
//           7   4  7  |  12
//                     false
// XCTAssert(d + e > f)
//           | | | | |
//           4 | 7 | 12
//             11  false
struct Person {
  let name: String
  let age: Int

  var isTeenager: Bool {
    return age <= 12 && age >= 20
  }
}

let john = Person(name: "John", age: 42)
let mike = Person(name: "Mike", age: 13)

XCTAssert(john.isTeenager)
XCTAssert(mike.isTeenager && john.age < mike.age)

// Output:
// XCTAssert(john.isTeenager)
//           |    |
//           |    false
//           Person(name: "John", age: 42)
// XCTAssert(mike.isTeenager && john.age < mike.age)
//           |    |          |  |    |   | |    |
//           |    false      |  |    42  | |    13
//           |               |  |        | Person(name: "Mike", age: 13)
//           |               |  |        false
//           |               |  Person(name: "John", age: 42)
//           |               false
//           Person(name: "Mike", age: 13)

作者

Kishikawa Katsumi, kishikawakatsumi@mac.com

许可证

SwiftPowerAssert 使用 Apache 2.0 许可证。 有关更多信息,请参见 LICENSE 文件。