【问题标题】:How To Perform Data Driven Testing in Xcode如何在 Xcode 中执行数据驱动测试
【发布时间】:2017-05-30 19:35:49
【问题描述】:

我正在 Xcode 中编写 UI 测试,并希望使用数据驱动测试来实现。使用 Xcode 的新 UI 测试框架 XCUI 如何实现这一点?测试用例的形式如下:

class StepUnitFormatterTests: XCTestCase {
//> (0, "0 steps")
//> (1, "1 step")
//> (2, "2 steps")
//> (999, "999 steps")
//> (1000, "1,000 steps")
//> (1000000, "1,000,000 steps")
//> (3.3, "3 steps")
//> (-5, "0 steps")
func testFormat(_ numberOfSteps: Double, _ expected: String) {
    XCTAssertEqual(StepUnitFormatter().format(numberOfSteps), expected)
    }
}

【问题讨论】:

    标签: ios swift automated-tests xcode-ui-testing data-driven-tests


    【解决方案1】:

    UITests 不是适合您的案例的测试类型。您通常使用 UITests 来模拟用户与您的应用程序的交互。例如,测试按下按钮会带您进入下一个屏幕。

    要测试您的StepUnitFormatter 是否正常工作,您通常会编写一个UnitTest

    您的测试函数将不起作用,因为在 UnitTest(和 UITests)类中,测试函数不允许使用参数。

    在您的特殊情况下,函数可能如下所示:

    func testStepUnitFormatter() {
        let formatter = StepUnitFormatter()
        XCTAssertEqual(formatter.format(0), "0 steps")
        XCTAssertEqual(formatter.format(1), "1 step")
        XCTAssertEqual(formatter.format(2), "2 steps")
        XCTAssertEqual(formatter.format(1000), "1,000 steps")
        XCTAssertEqual(formatter.format(3.3), "3 steps")
        // etc.
    }
    

    但同样,这段代码是 UnitTest 类的一部分。要对 UITest 执行相同操作,您必须通过实际运行应用程序并使用用户界面输入您想要测试的所有不同值来测试格式化程序。这就是为什么在这种情况下应该使用 UnitTests 而不是 UITests。

    【讨论】:

      【解决方案2】:

      正如 David Nix 在他的帖子 Table Driven Tests in Swift 中指出的那样,您可以将一组元组用于您的测试数据,然后遍历该数组。

      例如

      let tests: [(input: Int, expected: String)] = [
          (input: 0, expected: "0 steps"),
          (input: 1, expected: "1 step"),
          (input: 2, expected: "2 steps"),
          (input: 999, expected: "999 steps"),
          (input: 1000, expected: "1,000 steps"),
          (input: 1000000, expected: "1,000,000 steps"),
          (input: 3.3, expected: "3 steps"),
          (input: -5, expected: "0 steps")
      ]
      
      let formatter = StepUnitFormatter()
      
      func testFormat() {
          for test in tests {
              XCTAssertEqual(formatter.format(test.input), test.expected)
          }
      }
      

      您也可以在 UI 测试中使用此模式。

      除了大卫的帖子之外,我添加了第三列,描述了测试的意图:

      let steps: [(input: Double, expected: String, rationale: String?)] = [
          ...
          (input: 3.3, expected: "3 steps", rationale: "Decimal steps must be rounded"),
          (input: -5, expected: "0 steps", rationale: "Negative steps must be 0") 
          ...
      ]
      

      这有点罗嗦,但有助于您将来了解测试用例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-05
        相关资源
        最近更新 更多