3

我有一个像这样的单一条件的简单方法。

if (String.IsNullOrEmpty(FirstName))

{

成功=假;

}

返回成功;

当我运行 Pex 时,它只生成一个将 Null 分配给 FirstName 属性的测试用例,而另一个将“\0”分配给 FirstName 的测试用例。

为什么它不生成将 string.Empty 分配给 FirstName 属性的第三种方法?

4

3 回答 3

4

据我了解,Pex 只是试图在您的应用程序代码中实现 100% 的测试覆盖率。从您发布的代码中,只需两次测试即可跟踪该方法的所有分支。

  • 字符串不为 null 或为空。
  • 字符串为空或空。
于 2011-05-21T23:45:39.410 回答
2

我猜 Pex 未配置为检查 .Net 库的内部结构,因此它不知道空字符串将是该IsNullOrEmpty函数的特殊值。如果无法检查字符串的使用方式,则 Null 和空字符 ('\0') 是它测试字符串时最喜欢的两个选择。

如果需要,您可以创建参数化单元测试来检查空字符串。

于 2011-05-19T13:05:36.720 回答
1

正如 Joshua Dale 所说,Pex 试图生成覆盖尽可能多的代码分支的测试。正如 Pex 参考手册的第一段所说:

给定一种方法,[原文如此] Microsoft Pex 生成执行许多不同代码路径的输入。用[原文如此]的话来说,Microsoft Pex 旨在生成实现最大代码覆盖率的测试套件。

(如您所见,此文档可以进行一些校对!)

牢记这一点很重要,因此 Pex 将生成旨在执行所有代码分支的测试输入,而不是生成具有语义值的测试输入(如一般情况一样)。认识到这一点很重要,不要假设 Pex 生成的测试套件意味着您的测试已经涵盖了所有可能的失败条件。它可能会覆盖其中的极少数——测试输入被设计为遇到边缘情况(例如空/空字符),如果您认为其目的是尽可能多地执行代码分支,这一点很明显。

Pex 尝试探索您自己的测试未发现的代码分支。它是您智力的补充——作为人类,您擅长弄清楚代码应该做什么,作为图灵机,Pex 擅长挑选每个可能的代码分支(尽管它经常需要帮助。)

于 2012-04-10T10:33:23.323 回答