我制作了一个Java程序,以深度优先的方式浏览树。程序是正确的,但节点的子的选择是随机的。例如在这棵树上:
有时,结果是:
A-B-E-C-F-D
A-C-F-D-B-E
A-B-E-D-C-F
我想对这个程序进行测试(单元测试),但我不知道,我怎么做呢?请
我想做一个包含元素的List,并将列表的元素与深度优先树的结果进行比较,但深度优先的结果是随机的。然后我无法将它与List的元素进行比较。
答案 0 :(得分:2)
您要测试2个属性:
第一个很容易测试:访问的唯一节点数必须等于树中的节点数。可以针对任何随机树进行测试。
第二个稍微有点棘手 - 在一般情况下表达它可能比测试代码更复杂。更容易根据特定的已知数据选择一些代表性约束,即
难以设想满足所有树的第一个属性的现实代码,但仅在特定情况下才会失败。那么在最正式的安全关键系统之外(以及他们使用动态数据结构做了什么?),这就足够了。
答案 1 :(得分:1)
我没有点击你的链接,但是如果代码是真正随机的并且打算是,那么你应该进行单元测试,以便它说“给定这个输入,那么输出必须是这三个中的一个东西”。这并不理想,因为在出现错误之前可能需要很多次运行(即运行它的前几次,它可能只是随机掩盖错误),但我怀疑它是测试算法的最佳方法随机行为。
答案 2 :(得分:1)
这意味着每个节点的子节点的顺序不是确定性的。您可能使用Set
来容纳孩子。考虑使用LinkedHashSet
(保留插入顺序)或SortedSet
(对子项进行排序)。这样,订单将始终相同。
如果随机性是树的一个特征,并且您希望保持原样,那么请查看其他答案,或更改算法本身以确保在遍历树时始终对子项进行排序。
答案 3 :(得分:0)
为单元测试选择一个只有几个有效结果的数据集(显然它应该有多个),并测试结果是否是其中之一。
或者,您可以尝试在节点上强加定义明确的顺序(例如,按字母顺序排序每个节点的子节点,而不是在Set
中管理它们)