给定一个非常简单的结构,如下所示:
public class TreeNode
{
public int ID { get; set; }
public List<TreeNode> Children { get; set; }
}
TreeNode
可能有其他属性。
当按以下方式使用时:
var tree = new List<TreeNode>(); //no root node
如果我根据某些条件对树执行添加/更新/删除操作。例如,根据我上面提到的一个或多个其他属性删除节点,我想比较更改前后的 TreeMap ,然后通过单元测试验证一些遵循:
- 树保持不变
- 指定节点已删除
- 已添加指定节点
- 更新指定节点
- 执行上述 3 项操作,同时还验证树的其余部分是否未更改。
理想情况下,我会抛出一个期望,列出未找到、未预期的节点等。但是,在这个阶段,我很乐意对我的检查进行真/假检查。
是否有任何已知的模式/算法现有项目可以对此有所帮助?
我很高兴使用其他语言的伪代码或示例,只要它们不依赖于我无法在 .NET 中复制的功能。
我的树不太可能达到超过 7 或 8 层深度,并且总共不超过 100 个节点,因为它将是测试数据,因此暴力循环很好,此时不考虑性能。
我真的在寻找关于如何解决这个问题的提示、技巧、建议和代码。
TIA
最佳答案
当我对树结构进行单元测试时,我只是构建了一个已知结构的临时树,对其执行操作并验证更改是否正是我所期望的,这是一个非常简单但可用的方法,如果您创建良好的测试用例。
无论我的经验如何,您可能会想到一些树节点的递归比较方法,这些方法可能返回不同的子节点列表。所以基本思想是维护两棵相等的树,对其中一棵执行操作,然后检查发生了什么变化。
如果您没有任何显示树的 UI,我还建议使用 http://www.graphviz.org/ 对树进行可视化。 ,您可以在某些操作之前和之后生成树的图片,这样您将看到整个结构是如何改变的(不可用于单元测试,但无论如何)。
最后一件事,我建议有一个根节点,它将简化你的递归算法。如果您没有root权限,由于UI等方面的一些要求,您可以修改该部分以简单地忽略root。
关于c# - 单元测试简单的树结构操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20540451/