为测试创建对象层次结构

时间:2015-10-02 06:38:50

标签: c# unit-testing hierarchical-data

我构建了一个测试驱动的应用程序,它将平面文件排序为父子层次结构。现在我想为自己的排序创建一个非常通用的测试。为此,我想生成一些测试数据,然后对其进行排序。

将要排序的对象如下所示:

public interface IHierarchicalUnitWithChildren
{
    string Id { get; }
    string ParentId { get; }
    IList<IHierarchicalUnitWithChildren> Children { get; set; }
}

但我不想自己创建测试对象。我希望这可以通过代码生成:

        _items = new List<IHierarchicalUnitWithChildren>();
        Random random = new Random();

        for (int i = 1; i < 1000; i++)
        {
            var item = new HierarchicalUnitMock()
            {
                Oid = i.ToString(),
                Children = new List<IHierarchicalUnit>(),
            };

            // We need a couple of roots.
            if (i%100 != 0)
            {
                item.Poid = random.Next(1, 100).ToString();
            }

            _items.Add(item);
        }

我可以很容易地生成一千个项目,但我还需要给他们一个有效的父项。我如何确保我正在创建一个有效的结构,我有几个根,所有的孩子都有父母是有效的。

任何项目都不应该拥有自己的子(或孙子),从而使其成为无限的层次结构。

或者我认为这一切都错了?测试是否应始终具有静态数据?

更新

智能循环是否有任何方法可以生成相同的数据?那么测试用例总是一样的吗?

1 个答案:

答案 0 :(得分:1)

在测试中随机生成的数据是一个好主意。你无法保证测试条件每次都是一样的,也不能保证你能够涵盖所有可能的场景。

<强>相反:

考虑你的代码所做的事情,如果必须的话,将其分解为伪代码,并尝试提出可能破坏它的方案。使您的测试数据集专门导致这些条件。