是否可以将参数化的测试用例数据与 Xcode 的 XCTest 框架一起使用?

Posted

技术标签:

【中文标题】是否可以将参数化的测试用例数据与 Xcode 的 XCTest 框架一起使用?【英文标题】:Is it possible to use parameterised test case data with Xcode's XCTest Framework? 【发布时间】:2015-12-07 22:35:28 【问题描述】:

类似于TestCaseAttribute 和NUnit has,大致如下:

[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 中提供这样的参数化测试用例数据?

【问题讨论】:

【参考方案1】:

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。

【讨论】:

感谢 GitHub 的发现。【参考方案2】:

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

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)
    

【讨论】:

以上是关于是否可以将参数化的测试用例数据与 Xcode 的 XCTest 框架一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

在参数化的夹具中缓存测试数据

如何在 iOS Xcode UI 测试用例中启动系统应用

pytest文档67-pytest.mark.parametrize 中使用 fixture

nose-parameterized是Python单元测试框架实现参数化的扩展

如何在 Xcode 中运行单个测试用例?

如何在 Xcode 中运行单个 UI 测试