单元测试的外部数据文件

Joh*_*her 5 xcode cocoa unit-testing

我是单元测试的新手,我正在接受一些最佳实践建议.我正在使用Xcode在Cocoa中编码.

我有一个方法可以验证用户输入的URL.我希望它只接受http://协议,只接受具有有效字符的URL.

为此进行一次测试并使用测试数据文件是否可以接受?数据文件提供示例有效/无效URL以及URL是否应该验证.我也用它来检查错误消息的描述和域.

为什么我这样做

我已经用JUnit阅读了Java中的实用单元测试,这给出了一个外部数据文件的例子,这让我觉得这没关系.另外,这意味着我不需要用非常相似的代码编写大量单元测试来测试不同的数据.

但另一方面...

如果我正在测试:

  • 无效字符
  • 无效的协议
  • 有效的URL

所有在相同的测试数据文件中(因此在同一测试中)这会在以后引起我的问​​题吗?我读到一个测试应该只是失败的原因之一.

我正在做什么?

如果有的话,其他人如何在单元测试中使用测试数据?

Nam*_*ter 5

通常,仅在必要时使用测试数据文件.使用测试数据文件有许多缺点:

  • 测试代码分为测试代码和测试数据文件.这使得测试更难以理解和维护.
  • 您希望尽可能快地保持单元测试.进行不必要地读取数据文件的测试会降低测试速度.

在某些情况下我会使用数据文件:

  • 输入很大(例如,XML文档).虽然您可以使用字符串连接来创建大型输入,但它可能使测试代码难以阅读.
  • 该测试实际上是测试读取文件的代码.即使在这种情况下,您可能希望让测试在临时目录中编写示例文件,以便测试的所有代码都在一个位置.

我建议在代码中编写测试,而不是编码文件中的有效和无效URL.我建议为无效字符创建测试,测试无效协议,测试无效域,以及测试有效URL.如果您认为没有足够的覆盖范围,则可以创建一个小型集成测试来测试多个有效和无效的URL.这是Java和JUnit中的一个例子:

public void testManyValidUrls() {
  UrlValidator validator = new UrlValidator();
  assertValidUrl(validator, "http://foo.com");
  assertValidUrl(validator, "http://foo.com/home");
  // more asserts here
}

private static void assertValidUrl(UrlValidator validator, String url) {
  assertTrue(url + " should be considered valid", validator.isValid(url);
}
Run Code Online (Sandbox Code Playgroud)