Pex:对于String.IsNullOrEmpty,Pex只生成两个测试方法。

3

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

if (String.IsNullOrEmpty(FirstName))

{

success = false;

}

return success;

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

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

3个回答

4
据我所知,Pex只是试图在您的应用程序代码中实现100%的测试覆盖率。从您发布的代码来看,只需要两个测试即可跟踪该方法的所有分支。
  • 字符串不为空。
  • 字符串为空或为null。

这花了我一些时间才意识到,它相当微妙。 - John Nicholas

2
我猜测 Pex 没有配置来检查 .Net 库的内部,因此它不知道空字符串将成为 IsNullOrEmpty 函数的特殊值。 如果它无法检查字符串的使用方式,则 null 和 null 字符('\0')是其测试字符串的两个首选项。
如果你想要的话,可以创建一个参数化单元测试来检查空字符串。

我没有点踩,但我不认为你是正确的。我敢打赌,如果你添加一个string.empty的测试,它会将其用作参数 - 只是没有测试而已 ;) - John Nicholas

1
正如Joshua Dale所说,Pex试图生成尽可能覆盖多个代码分支的测试。正如Pex参考手册的第一段所述:
给定一个方法,Microsoft Pex会生成能够执行许多不同代码路径的输入。换句话说,Microsoft Pex旨在生成一个实现最大代码覆盖率的测试套件。
(您可以看到,这个文档需要进行一些校对!)
要牢记这一点很重要,因此Pex将生成设计用于执行所有代码分支的测试输入,而不是生成具有语义值的测试输入(除非一般情况下都如此)。重要的是要意识到这一点,并不要假设Pex生成的测试套件意味着您的测试已经覆盖了所有可能的故障条件。它可能只覆盖很少的故障条件-测试输入被设计为击中边缘情况(例如null/空字符),如果考虑到目的是尽可能地执行多个代码分支,这一点是显而易见的。
Pex试图探索代码分支,这些分支是您自己的测试没有发现的。它是对您智力的补充-作为人类,您擅长弄清楚代码应该做什么,作为图灵机器,Pex擅长遍历每个可能的代码分支(尽管它经常需要帮助)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接