C# 简单树结构操作的单元测试

C# 简单树结构操作的单元测试,c#,unit-testing,tree,c#-3.0,pattern-matching,C#,Unit Testing,Tree,C# 3.0,Pattern Matching,给出一个非常简单的结构,例如: public class TreeNode { public int ID { get; set; } public List<TreeNode> Children { get; set; } } 如果我基于某些条件对树执行添加/更新/删除操作。例如,基于我上面提到的一个或多个其他属性删除节点时,我想比较更改前后的树形图,然后通过单元测试验证以下内容: 树保持不变 指定的节点将被删除 将添加指定的节点 将更新指定的节点 上面的3个步

给出一个非常简单的结构,例如:

public class TreeNode
{
    public int ID { get; set; }
    public List<TreeNode> Children { get; set; }
}
如果我基于某些条件对树执行添加/更新/删除操作。例如,基于我上面提到的一个或多个其他属性删除节点时,我想比较更改前后的树形图,然后通过单元测试验证以下内容:

  • 树保持不变
  • 指定的节点将被删除
  • 将添加指定的节点
  • 将更新指定的节点
  • 上面的3个步骤同时也验证了树的其余部分是否保持不变
理想情况下,我会抛出一个expection,列出未找到的节点、未预期的节点等。然而,在这个阶段,我很高兴我的检查为真/假

现有项目中是否有任何已知的模式/算法可以帮助实现这一点

我很喜欢其他语言中的伪代码或示例,只要它们不依赖于我无法在.NET中复制的特性

我的树不太可能达到超过7或8级的深度,总共不超过100个节点,因为它将是测试数据,所以蛮力循环很好,此时不考虑性能

我真的在寻找关于如何实现这一点的提示、技巧、建议和代码


TIA

当我对树结构进行单元测试时,我只需构建一个已有结构的特别树,对其执行操作,并验证更改是否完全符合我的预期,如果您创建了良好的测试用例,这是一种非常简单但可用的方法

不管我的经验如何,您可能会想到一些针对树节点的递归比较方法,这些方法可能会返回不同的子节点列表。所以基本思想是维护两个相等的树,对其中一个树执行操作,然后检查更改了什么

如果您没有任何显示树的UI,我还建议您使用可视化树,您可以在某些操作之前和之后生成树的图片,这样您就可以看到整个结构是如何更改的(不适用于单元测试,但无论如何)


最后一件事,我建议有一个根节点,它将简化递归算法。如果您没有根,因为UI的某些要求,您可以修改该部分以忽略根。

您还可以使用一个函数获取树的字符串表示形式,并简单地比较2个字符串表示形式,而不是比较2个树 这周早些时候我就这么做了 示例函数(swift)

你可以这样测试它

XCTAssert ( tree.description == "beverages {hot {tea {black, green, chai}, coffee, cocoa}, cold {soda {ginger ale, bitter lemon}, milk}}");
 public var description: String {
        var s = "\(value)"
        if !children.isEmpty {
            s += " {" + children.map { "\($0.description)"}.joined(separator: ", ") + "}"
        }
        return s
    }
XCTAssert ( tree.description == "beverages {hot {tea {black, green, chai}, coffee, cocoa}, cold {soda {ginger ale, bitter lemon}, milk}}");