【问题标题】:Unit testing simple Tree structure manipulations单元测试简单的树结构操作
【发布时间】:2013-12-30 16:25:08
【问题描述】:

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

public class TreeNode
{
    public int ID { get; set; }
    public List<TreeNode> Children { get; set; }
}

TreeNode 可能有其他属性。

当以下列方式使用时:

var tree = new List<TreeNode>(); //no root node

如果我根据特定标准对树执行添加/更新/删除操作。例如,基于我上面提到的一个或多个其他属性删除节点,我想比较更改前后的树图,然后通过单元测试验证一些关注:

  • 树保持不变
  • 指定的节点被移除
  • 已添加指定节点
  • 指定节点已更新
  • 上述 3 项同时还验证了树的其余部分是否未更改。

理想情况下,我会抛出一个期望,列出未找到、未预期等的节点。但是,在这个阶段,我会对我的检查结果为真/假感到满意。

现有项目是否有任何已知的模式/算法可以帮助解决这个问题?

我很高兴使用其他语言的伪代码或示例,只要它们不依赖我无法在 .NET 中复制的功能。

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

我真的在寻找有关如何解决此问题的提示、技巧、建议和代码。

TIA

【问题讨论】:

    标签: c# unit-testing tree c#-3.0 pattern-matching


    【解决方案1】:

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

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

    如果您没有任何显示树的 UI,我还建议您对树进行可视化,使用 http://www.graphviz.org/ ,您可能会在某些操作之前和之后生成树的图片,所以您会看到整个结构是如何改变的(不能用于单元测试,但无论如何)。

    最后一件事,我建议有一个根节点,它会简化你的递归算法。如果你没有root,由于UI的一些需求等等,你可以修改那部分来简单地忽略root。

    【讨论】:

      【解决方案2】:

      您还可以有一个函数来获取树的字符串表示并简单地比较 2 个字符串表示而不是比较 2 个树 我本周早些时候这样做了 示例函数(swift)

       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}}");
      

      【讨论】:

        猜你喜欢
        • 2022-11-08
        • 1970-01-01
        • 2011-11-24
        • 1970-01-01
        • 1970-01-01
        • 2012-05-20
        • 2013-09-22
        • 1970-01-01
        相关资源
        最近更新 更多