我在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)
}
}
答案 0 :(得分:0)
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。
答案 1 :(得分:0)
正如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测试中使用此模式。
除了David的帖子,我还添加了第三列来描述测试的意图:
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")
...
]
这有点罗word,但可以帮助您将来了解测试用例。