testing - 你如何证明一个函数有效?

标签 testing methodology

我最近迷上了测试并主要从单元测试开始。我编写单元测试来说明函数在某些情况下工作,特别是使用我正在使用的确切输入。我可能会做一些单元测试来锻炼这个功能。尽管如此,除了函数在我测试过的场景下执行我期望它执行的操作之外,我还没有实际证明任何其他内容。可能还有其他我没有想到的输入和场景,并且考虑边缘案例的成本很高,尤其是在边缘。

这一切对我来说都不是很令人满意。当我开始考虑必须提出测试来满足分支和路径覆盖,然后进行集成测试时,预期的排列可能会变得有点令人抓狂。

所以,我的问题是,如何证明(与证明数学中的定理相同)函数有效(并且,在完美的世界中,将这些“证明”组合成系统有效的证明) ?

是否有特定的测试领域涵盖了您通过证明系统的所有功能都能正常工作来证明系统正常工作的方法?学术界以外的人会为这样的方法烦恼吗?是否有工具和技术可以提供帮助?

我意识到我对“工作”这个词的使用并不准确。我想我的意思是,当一个函数执行某些规范(书面或暗示)规定它应该执行的操作并且除此之外什么都不做时,它就可以工作。

请注意,我不是数学家,只是一名程序员。

最佳答案

在学术界,有一个类似于数学归纳法的概念,叫做结构归纳法。但是,它仅适用于完全没有副作用的函数式编程语言和方法。在其他情况下,由于副作用,即使不是不可能,也很难证明一种方法有效。

在 TDD 中,您尝试制定方法必须满足的边缘情况才能有效,但是,有可能会错过这种情况。即使一个(非平凡的)方法完成了所有测试,也可能存在参数组合或一系列您根本没有想到的事件会破坏您的代码。简单地说:这就是生活。您可能可以预测一个非常重要的实现中的所有结果,但您可以确保该方法适用于特定的边缘情况,预计对于某些非常前卫的情况,您会在触摸它们时割伤自己。 (zing,糟糕的双关语)。

关于testing - 你如何证明一个函数有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5207101/

相关文章:

testing - 测试数据应该用于生产吗?

android - 如何进行 10 次快速点击 [UIautomator]

c++ - 第三方dll丢失,等待中怎么办?

methodology - 扩展识字编程?

javascript - Jasmine 测试 : how to spy on special function?

ruby-on-rails - 在 Rails 中的什么地方放置测试实现类?

java - 在 switch 语句中测试(junit)默认情况?

Git:大项目开发流程的最佳实践

project-management - Scrum 和项目预估时间

methodology - 您是否还将VersionOne用作问题跟踪系统(又名BugZilla)