unit-testing - 是否可以编写涵盖所有内容的单元测试?

标签 unit-testing language-agnostic

假设我有一个函数

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

理想情况下,您想编写 2^32 - 1 个测试用例来覆盖从 INT_MIN 到 INT_MAX 的范围?当然这是不切实际的。

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

编写测试用例
  • x < 10,测试 x = 9 期望为真
  • x == 10,测试 x = 10 预期为假
  • x > 10,测试 x = 11 预期为假

这些测试用例很好,但并未涵盖所有用例。假设有一天有人将函数修改为

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

他将运行测试并意识到所有测试都已通过。我们如何确保在不走极端的情况下涵盖所有场景。我描述的这个问题有关键词吗?

最佳答案

由于您表述问题的方式,这部分是评论,部分是答案。

评论

Is it possible to write a unit test that cover everything?

不。即使在您的示例中,您将测试用例限制为 2^32 但是如果将代码移至 64 位系统然后有人添加一行使用 2^34 或其他东西。

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

最后你没有注明是白盒测试、灰盒测试还是黑盒测试。

答案

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

参见:A Survey on Automatic Test Data Generation

您还询问了用于搜索的关键字。

这是我发现有值(value)的 Google 搜索:

code analysis automated test generation survey

相关

我自己从未使用过这些测试用例工具之一,因为我使用 Prolog DCG生成我的测试用例,目前我正在做的一个项目在大约两分钟内生成数百万个测试用例,并在几分钟内测试它们。一些失败的测试用例我永远不会自己想出来,所以这可能被一些人认为是矫枉过正,但它确实有效。

由于许多人不知道 Prolog DCG,这里是 Eric Lippert,Every Binary Tree There Is 使用 C# 和 LINQ 解释的类似方式。

关于unit-testing - 是否可以编写涵盖所有内容的单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45136085/

相关文章:

language-agnostic - 我们可以利用语法高亮功能从 SublimeText 中的源文件中删除所有注释吗?

algorithm - 欧拉计划问题 #78 的提示

Python:在单元测试中处理sys.exit?

.net - MSTest 中 TestExecution 类的用途是什么?

能够模拟非虚拟方法和 C 函数的 C++ 模拟框架

unicode - 是否有 Unicode 字符来指示字符串中可能的换行符

python - 避免在循环后重复代码?

python - python单元测试中setUp/tearDown的顺序是什么?

javascript - 如何在 Jest 的单个测试中模拟 ES6 模块?

java - 计算除以二的次数