unit-testing - 复杂输出算法的测试方法

标签 unit-testing testing

如何测试一个基本上是黑盒子的程序的结果?例如,一年前我不得不写一棵 B 树作为作业,我真的很难测试正确性。你在这种情况下使用什么策略?可视化?稳健的输入-->测试数据的结果集?当很难获得此类数据时,您会怎么做,因为获得这些数据的唯一方法是您的正确工作程序?

编辑:我认为我的问题被误解了。理解 B 树的工作原理没有问题。那是微不足道的。但是编写强大的测试来验证其正确的功能并不是那么简单。我认为这个学校问题类似于许多实际的 REAL 单词场景和测试用例。有时理解领域与交付工作和正确的程序是完全不同的......

EDIT2:是的,使用 B 树可以用笔和纸验证正确的行为。但这真的很脏而且不好玩 :) 这不适用于需要大量数据进行验证的问题......

最佳答案

我不确定这些答案是否真的捕获了手头的问题。 B 树的输入和输出与任何其他字典的输入和输出没有任何不同——但如果正确实现,该算法的性能会更好。它实际上只有两个功能需要测试(添加和查找),因此从理论上讲,对这个单个组件进行“黑盒”测试应该没问题。可测试性设计不是问题,因为无论您如何设计,整个算法都是一个组成部分。

所以问题是:当您必须实现微妙的算法时,您无法始终很好地理解具有复杂输出的算法,您如何测试它们?我认为您可以使用三种不同的策略:

  1. 黑盒测试基本功能。对于 B-tree 的情况,这是建议的 cwash 之类的事情,还有诸如确保在添加项目时可以找到它之类的事情,等等。

  2. 测试您的算法应该保持的某些不变量(B 树应该是平衡的,节点内的值应该排序,等等)

  3. 可能需要一些小的“纸笔”测试——手动计算算法并检查它是否与您的代码所做的相匹配。但是大数据测试都可以是类型 2。它们也可能很脆弱,因此除非您需要真正确定您的算法,否则您可能希望避免使用它们。

关于unit-testing - 复杂输出算法的测试方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1030051/

相关文章:

testing - 如何使用 CTest 检查两个文件之间的差异?

javascript - 以 REPL 方式直接从 Visual Studio 执行 javascript (node.js) 代码

python - 出于测试目的重新分配模块的功能

testing - 有没有反向 "De-crapify"类型的软件

reactjs - UseEffect 钩子(Hook)的 Jest 测试用例

python - 如何在 Python 中安排和设置单元测试

angularjs - 使用inject时如何在beforeEach中放置异步回调?

c# - 使用具有预加载功能的内存数据库对 EF Core 进行单元测试

c++ - 寻求分布在多个 dll 上的单元测试 C++ 应用程序的建议

ruby-on-rails - 如何确保我正在测试所有内容,我拥有所有功能并且只有旧代码的那些功能?