假设我有一个函数
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/