是否可以在Xcode的XCTest Framework中使用参数化测试用例数据?

时间:2015-12-07 22:35:29

标签: ios xcode unit-testing xctest

类似于TestCaseAttribute的{​​{3}},类似于:

[TestCase(12,3,4)]
[TestCase(12,2,6)]
[TestCase(12,4,3)]
public void DivideTest(int n, int d, int q)
{
  Assert.AreEqual( q, n / d );
}

是否可以在Xcode中提供这样的参数化测试用例数据?

2 个答案:

答案 0 :(得分:2)

看起来XCTest没有内置,但GitHub上的项目旨在添加此功能。

来自他们的自述文件:

  

KNMParametrizedTest使用XCTest框架添加了对参数化测试用例的支持。这是一个例子:

KNMParametersFor(testExample, @[ @"Hello", @"World" ]) - (void)testExample:(NSString *)word { NSString *result = [myUppercaser uppercaseString:word]; XCTAssertEqualObjects(result, [word uppercaseString], @"Uppercaser failed for word %@", word); }

看起来安装它的最简单方法是通过CocoaPods。

答案 1 :(得分:0)

尽管XCTest没有提供编写参数化测试的适当方法,但我在Godfrey Nolan的书page 46Agile Swift中发现了一个不错的简单解决方法,该方法是定义包含输入的元组数组和输出值,然后遍历数组中的每个项目,如下所示:

func test_multiple() {
    let cases = [(4,3,12),(2,4,8)]
    cases.forEach {
         XCTAssertEqual(myCalculator.multiply($0, $1), $2)
    }
}

我可以看到的唯一警告是,您只会在测试导航器/测试报告中获得一个条目,而不是每个测试用例都获得一个条目。但是在我看来,不必一次又一次编写相同的测试(每个测试仅稍有变化)可以节省时间,这是值得的。

如果您想在测试失败的情况下获得好消息,可以通过在元组中再添加一个元素来轻松获得此消息,该元素表示要传递给XCTAssertEqual调用的消息,如下所示:

func test_multiple() {
    let cases = [(4,3,12,"4 times 3"),(2,4,8,"2 times 4")]
    cases.forEach {
         XCTAssertEqual(myCalculator.multiply($0, $1), $2, $3)
    }
}