我有一个像这样的单一条件的简单方法。
if(String.IsNullOrEmpty(FirstName))
{
success = false;
}
返回成功;
当我运行Pex时,它只生成一个测试用例,它将Null分配给FirstName属性,另一个为“FirstName”分配“\ 0”。
为什么不生成第三个将string.Empty分配给FirstName属性的方法?
答案 0 :(得分:4)
据我了解,Pex只是试图在您的应用程序代码中实现100%的测试覆盖率。从您发布的代码中,只需要两次测试即可跟踪该方法的所有分支。
答案 1 :(得分:2)
我猜测Pex未配置为检查.Net库的内部,因此它不知道空字符串将是IsNullOrEmpty
函数的特殊值。如果无法检查字符串的使用方式,Null和空字符('\ 0')是测试字符串的两个最喜欢的选择。
如果需要,您可以创建参数化单元测试以检查空字符串。
答案 2 :(得分:1)
正如Joshua Dale所说,Pex尝试生成涵盖尽可能多的代码分支的测试。正如Pex参考手册第一段所述:
给定一种方法, [sic] Microsoft Pex生成输入,这些输入执行许多不同的代码路径。按顺序 [sic] ,Microsoft Pex旨在生成一个可实现最大代码覆盖率的测试套件。
(如您所见,本文档可以进行一些校对!)
考虑到这一点很重要,因此Pex将生成旨在执行所有代码分支的测试输入,而不是生成具有语义值的测试输入(期望通用的地方)。实现这一点非常重要,并且不要假设Pex生成的测试套件意味着您的测试已涵盖所有可能的故障条件。它可能只涵盖其中的极少数 - 测试输入旨在达到边缘情况(例如null / null字符),如果您认为目的是尽可能多地运用代码分支,这是显而易见的。 p>
Pex尝试探索您自己的测试未发现的代码分支。它是对你的智能的补充 - 作为一个人,你善于弄清楚代码应该做什么,作为图灵机,Pex擅长挑选每个可能的代码分支(虽然它经常需要帮助。)