代码之家  ›  专栏  ›  技术社区  ›  Zanko

可以编写一个涵盖所有内容的单元测试吗?

  •  3
  • Zanko  · 技术社区  · 9 年前

    function (int x) {
      if (x < 10) return true;
      return false;
    }
    

    为了让生活更轻松,我们为

    • x==10,测试x=10,预期为假
    • x>10,测试x=11,预期为假

    function (int x) {
      if (x == 12) return true;
      if (x < 10) return true;
      return false;
    }
    

    他将运行测试并实现所有测试的通过。我们如何确保在不走极端的情况下涵盖每一位塞纳里奥人。对于我正在描述的这个问题,有没有一个关键词?

    2 回复  |  直到 9 年前
        1
  •  2
  •   Guy Coder    9 年前

    这部分是一个评论,部分是一个答案,因为你措辞的问题。

    不 即使在您的示例中,您也将测试用例限制为 2^32 但是,如果将代码移动到64位系统,然后有人使用 2^34

    您的问题还向我表明,您正在考虑使用动态代码的静态测试用例,例如,代码是动态的,因为它是由程序员随时间变化的,这并不意味着由代码动态修改。您应该考虑使用动态代码的动态测试用例。

    答案

    让一个工具分析代码并生成测试数据。

    请参阅: A Survey on Automatic Test Data Generation

    这是我在谷歌上找到的有价值的搜索结果:

    code analysis automated test generation survey

    相关的

    Prolog DCG

    由于许多人不知道Prolog DCGs,这里有一个类似的方法,由Eric Lippert用C#with LINQ解释, Every Binary Tree There Is

        2
  •  0
  •   EJoshuaS - Stand with Ukraine    9 年前

    int.Max 并对其进行测试。然后测试两个随机数 int.Min 9.测试不会 必要地 在您描述的修改后失败,但与您刚硬编码值相比,它失败的可能性更大。

    做 尝试这样做,很难(或不可能)证明对一种方法没有可能的更改会破坏您的测试。

    很 turtles all the way down 键入情况)。

    如果你真的想从字面上理解它,并买入大卫·休谟,你真的无法百分之百确定基于实证检验的某件事;每次运行测试都通过了,这并不意味着它将来还会继续通过。不过,我离题了。

    如果你感兴趣, formal verification

    最后一点:软件附带bug。你很难找到 任何 在发布时完全没有缺陷的复杂系统。正如我上面提到的,目前没有已知的技术可以保证您的测试发现了所有的bug(如果您能找到一个bug,您将成为一个 非常

    TL;博士 更多 不过,它对变化具有弹性。