【问题标题】:Pex: For String.IsNullOrEmpty Pex generates only two test methodsPex:对于 String.IsNullOrEmpty Pex 只生成两个测试方法
【发布时间】:2011-05-19 07:23:18
【问题描述】:

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

if (String.IsNullOrEmpty(FirstName))

{

成功 = 假;

}

返回成功;

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

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

【问题讨论】:

    标签: pex


    【解决方案1】:

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

    • 字符串不为 null 或为空。
    • 字符串为空或空。

    【讨论】:

    • 这花了我一段时间来欣赏,它相当微妙。
    【解决方案2】:

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

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

    【讨论】:

    • 没有投反对票,但我不认为你是正确的。我敢打赌,如果您为 string.empty 添加了测试,它会将其用作参数 - 只是没有对其进行测试;)
    【解决方案3】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-11
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多