测试深度优先树

时间:2012-01-14 11:07:33

标签: java unit-testing tree depth-first-search

我制作了一个Java程序,以深度优先的方式浏览树。程序是正确的,但节点的子的选择是随机的。例如在这棵树上:

enter image description here

有时,结果是:

  • A-B-E-C-F-D
  • A-C-F-D-B-E
  • A-B-E-D-C-F

我想对这个程序进行测试(单元测试),但我不知道,我怎么做呢?请

我想做一个包含元素的List,并将列表的元素与深度优先树的结果进行比较,但深度优先的结果是随机的。然后我无法将它与List的元素进行比较。

4 个答案:

答案 0 :(得分:2)

您要测试2个属性:

  1. 每个节点只访问一个
  2. Traversal是深度优先
  3. 第一个很容易测试:访问的唯一节点数必须等于树中的节点数。可以针对任何随机树进行测试。

    第二个稍微有点棘手 - 在一般情况下表达它可能比测试代码更复杂。更容易根据特定的已知数据选择一些代表性约束,即

    • B必须在A
    • 之后
    • 之后,E必须立即
    • ...

    难以设想满足所有树的第一个属性的现实代码,但仅在特定情况下才会失败。那么在最正式的安全关键系统之外(以及他们使用动态数据结构做了什么?),这就足够了。

答案 1 :(得分:1)

我没有点击你的链接,但是如果代码是真正随机的并且打算是,那么你应该进行单元测试,以便它说“给定这个输入,那么输出必须是这三个中的一个东西”。这并不理想,因为在出​​现错误之前可能需要很多次运行(即运行它的前几次,它可能只是随机掩盖错误),但我怀疑它是测试算法的最佳方法随机行为。

答案 2 :(得分:1)

这意味着每个节点的子节点的顺序不是确定性的。您可能使用Set来容纳孩子。考虑使用LinkedHashSet(保留插入顺序)或SortedSet(对子项进行排序)。这样,订单将始终相同。

如果随机性是树的一个特征,并且您希望保持原样,那么请查看其他答案,或更改算法本身以确保在遍历树时始终对子项进行排序。

答案 3 :(得分:0)

为单元测试选择一个只有几个有效结果的数据集(显然它应该有多个),并测试结果是否是其中之一。

或者,您可以尝试在节点上强加定义明确的顺序(例如,按字母顺序排序每个节点的子节点,而不是在Set中管理它们)