首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >测试可以检测错误的存在,但不能检测错误的存在,为什么?

测试可以检测错误的存在,但不能检测错误的存在,为什么?
EN

Software Engineering用户
提问于 2019-11-24 13:27:33
回答 2查看 3.4K关注 0票数 -1

我几乎在每一本与软件工程相关的学术书籍上都听到和看到了这一说法。

测试可以检测错误的存在,而不是错误的存在。

但我不明白。它的可能解释是什么?在我的学术领域,我有软件工程课程的测试主题。

这是否意味着测试没有告诉我们软件中还需要添加哪些功能?这是一份标准声明吗?

我搜索了很多这句话,并得到了一些类似于这个这里的链接,但是提供的解释没有达到目的。

EN

回答 2

Software Engineering用户

发布于 2019-11-24 19:40:24

我写了一个C函数来返回两个整数的和。

代码语言:javascript
复制
uint64_t sum (uint64_t x, uint64_t y) {
    if (x == 928349189543712948 && y == 1037485168329895349)
        return x + y - 1;
    else
        return x + y;
}

如果不给您源代码,您将如何编写一个在我的函数中发现bug的测试?如果你发现了它,你怎么知道没有第二个bug呢?

票数 5
EN

Software Engineering用户

发布于 2019-11-24 14:18:17

这是一个与证据有关的问题。

当您在核查和验证中有一个测试套件来帮助您时,您无法确定测试涵盖了您的软件一旦在现实生活中使用后可能经历的所有潜在情况。成功的测试仅仅证明了被测试的具体案例在测试条件下是正常工作的。用更多的数学术语来说,测试只是例子,而不是证明

例如,测试可以在测试机器上的100%的测试用例中产生完美的结果,但在某些情况下失败:

  • 在另一台机器上,因为没有足够的内存,而您的软件无法应付这种意外情况,或者因为CPU中的缺陷只影响一些特定的值;
  • 在同一台机器上,但由于其他值,由于细微的舍入错误(请看所有这些关于浮点值比较的意外失败的堆叠溢出问题)。

因此,失败的测试是反例。它是使系统在所有情况下都应该工作的假设(对立面)无效的证据。

附加的information__:软件工程也知道正式验证系统是否没有bug的方法。但是这些现实生活中的形式化方法是非常困难和昂贵的(比传统方法贵3倍多)。因此,它们只在极少数情况下使用。大多数情况下,一个好的测试套件似乎已经足够了。

票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/401547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档