【发布时间】:2011-05-19 07:23:18
【问题描述】:
我有一个像这样的单一条件的简单方法。
if (String.IsNullOrEmpty(FirstName))
{
成功 = 假;
}
返回成功;
当我运行 Pex 时,它只生成一个测试用例,将 Null 分配给 FirstName 属性,另一个将“\0”分配给 FirstName。
为什么它不生成将 string.Empty 分配给 FirstName 属性的第三个方法?
【问题讨论】:
标签: pex
我有一个像这样的单一条件的简单方法。
if (String.IsNullOrEmpty(FirstName))
{
成功 = 假;
}
返回成功;
当我运行 Pex 时,它只生成一个测试用例,将 Null 分配给 FirstName 属性,另一个将“\0”分配给 FirstName。
为什么它不生成将 string.Empty 分配给 FirstName 属性的第三个方法?
【问题讨论】:
标签: pex
据我了解,Pex 只是试图在您的应用程序代码中实现 100% 的测试覆盖率。从您发布的代码中,只需两次测试即可跟踪该方法的所有分支。
【讨论】:
我猜测 Pex 未配置为检查 .Net 库的内部结构,因此它不知道空字符串将是 IsNullOrEmpty 函数的特殊值。如果无法检查字符串的使用方式,则 Null 和空字符 ('\0') 是它测试字符串时最喜欢的两个选择。
如果需要,您可以创建参数化单元测试来检查空字符串。
【讨论】:
正如 Joshua Dale 所说,Pex 尝试生成涵盖尽可能多的代码分支的测试。正如 Pex 参考手册的第一段所说:
给定一个方法,[sic] Microsoft Pex 生成输入,这些输入执行许多不同的代码路径。用 [sic] 的话来说,Microsoft Pex 旨在生成实现最大代码覆盖率的测试套件。
(如您所见,此文档可以进行一些校对!)
牢记这一点很重要,因此 Pex 将生成旨在执行所有代码分支的测试输入,而不是生成具有语义值的测试输入(与一般情况一样)。认识到这一点很重要,不要假设 Pex 生成的测试套件意味着您的测试已经涵盖了所有可能的失败条件。它可能涵盖其中的极少数情况——测试输入旨在达到边缘情况(例如 null/null 字符),如果您认为其目的是尽可能多地执行代码分支,这一点很明显。
Pex 尝试探索 您自己的 测试未发现的代码分支。它是对您智力的补充——作为人类,您擅长弄清楚代码应该做什么,作为图灵机,Pex 擅长挑选每一个可能的代码分支(尽管它经常需要帮助。)
【讨论】: