EGTest

此包用于参数化测试。

顶层结构体

EG - (“例如”) - 一个用于保存输入和输出的结构体。您通常创建一个 EG 值数组,然后将它们传递给 check() 方法。

EG 的字段

示例

EG("abcd", expect: 4, "length > 0")

msg() - 提供来自 EG 结构体的消息,并以其行号为前缀。您可以将其用作断言的消息。

顶层函数

EGAssertEqual() - 调用 XCTAssertEqual,并传递来自 EG 实例的期望值、消息、文件和行号。如果实际类型不可相等,您需要直接使用 XCTAssertEqual。

  func EGAssertEqual<T: Equatable, Input>(
      _ actual: T, 
      _ expected: EG<Input, T>
  )

EGAssertEqual() - 调用 XCTAssertEqual,并传递来自 EG 实例的期望值、精度、消息、文件和行号。如果实际类型不可相等,您需要直接使用 XCTAssertEqual。

  func EGAssertEqual<T: Equatable, Input>(
      _ actual: T, 
      _ expected: EG<Input, T>,
      accuracy: T
  ) where T: FloatingPoint

EGAssertThrowsError() - 调用 XCTAssertThrowsError,并传递表达式、来自示例的消息以及一个可选的函数,该函数可以比较示例和错误。

public func EGAssertThrowsError<Ignored, Input, Expected: Equatable>(
  _ expression: @escaping @autoclosure () throws -> Ignored,
  _ example: EG<Input, Expected>
)

以及

public func EGAssertThrowsError<Ignored, Input, Expected: Equatable>(
  _ expression: @escaping @autoclosure () throws -> Ignored,
  _ example: EG<Input, Expected>,
  _ errorHandler: (EG<Input, Expected>, Error) -> Void
)

XCTestCase 扩展

eg() - 允许您使用小写名称 eg 创建 EG 示例。接受与 EG 结构体相同的参数。

check() - 针对断言运行测试用例列表。对于 XCT 断言函数,传入文件和行,以便在断言失败时突出显示您的测试用例。通常,首选可变参数形式,但如果您需要,也可以使用数组形式。

func check<Input, Output>(
    _ tests: EG<Input, Output>...,
    assertFunction: (EG<Input, Output>) -> ()) {...}

func check<Input, Output>(
    _ tests: [EG<Input, Output>],
    _ assertFunction: (EG<Input, Output>) -> ()) {...}

check() throws - 类似于 check(),但允许您调用可能失败的断言。通常,首选可变参数形式,但如果您需要,也可以使用数组形式。

  func check<Input, Output>(
    _ tests: EG<Input, Output>...,
    assertFunction: (EG<Input, Output>) throws -> Void
  ) throws 

  func check<Input, Output>(
    _ tests: [EG<Input, Output>],
    _ assertFunction: (EG<Input, Output>) throws -> Void
  ) throws 

allPairs() - 创建任何类型对的列表。

  func allPairs<T1, T2>(
    _ t1s: [T1],
    _ t2s: [T2])
      -> [(T1,T2)]

allTriples() - 创建任何类型三元组的列表。

  func allTriples<T1, T2, T3>(
    _ t1s: [T1],
    _ t2s: [T2],
    _ t3s: [T3]) 
      -> [(T1, T2, T3)]

示例

请注意,XCTAssertEqual 调用传递了文件和行。为了查看报告的差异,请使一个测试用例失败并运行它,然后将其与省略文件和行时发生的情况进行比较。第二个示例显示了使用 EGAssertEqual 的相同测试。

class Demo {
  func stringOfSum(_ a: Int, _ b: Int) -> String {
    return "\(a + b)"
  }
}

final class ExampleTests: XCTestCase {
  func testStringOfSumAllPass() {
    check([
      EG((-1, 1), expect: "0", "zero"),
      eg((3, 0), expect: "3", "one-digit"),
      eg((-2, 1), expect: "-1", "negative")
    ]) { example in
      let my = Demo()
      let actual = my.stringOfSum(example.input.0, example.input.1)
      XCTAssertEqual(actual, example.expect, example.msg(), file: example.file, line: example.line)
    }
  }
}

final class ExampleTests2: XCTestCase {
  func testStringOfSumAllPass() {
    check([
      EG((-1, 1), expect: "0", "zero"),
      eg((3, 0), expect: "3", "one-digit"),
      eg((-2, 1), expect: "-1", "negative")
    ]) { example in
      let my = Demo()
      let actual = my.stringOfSum(example.input.0, example.input.1)
      EGAssertEqual(actual, example)
    }
  }
}

  func iAlwaysThrow() throws { throw "I threw" }

  func testAssertThrowsSucceeds_WhenThrownAndErrorIsRight() {
    EGAssertThrowsError(try self.iAlwaysThrow(), eg("ignored", expect: "I threw")) { example, error in
      let actualMessage: String = error as! String
      EGAssertEqual(actualMessage, example)
    }
  }