12

我正在用 C# 编写一个数据结构(使用斐波那契堆的优先级队列),我试图将它用作我对 TDD 很陌生的学习经验。

我知道每个测试应该只测试一个类,这样一个单元的失败不会让我与多个测试失败混淆,但是当数据结构的状态很重要时,我不确定如何做到这一点一个测试。

例如,

private PriorityQueue<int> queue;

[SetUp]
public void Initialize()
{
    this.queue = new PriorityQueue<int>();       
}

[Test]
public void PeekShouldReturnMinimumItem()
{
    this.queue.Enqueue(2);
    this.queue.Enqueue(1);

    Assert.That(this.queue.Peek(), Is.EqualTo(1));
}

如果其中一个EnqueuePeek坏了,这个测试就会失败。

我在想我可以以某种方式让测试手动设置底层数据结构的堆,但我不确定如何在不向世界公开实现的情况下做到这一点。

有一个更好的方法吗?依赖其他部分好吗?

我有一个SetUp地方,只是为了简单起见。

4

3 回答 3

7

将类的私有访问器添加到您的测试项目。使用访问器以某种已知的方式设置类的私有属性,而不是使用类方法来这样做。

您还需要在测试类上使用SetUp和方法来执行测试之间所需的任何初始化。TearDown实际上,我更喜欢在每个测试中重新创建队列,而不是在测试之间重用它以减少测试用例之间的耦合。

于 2008-10-16T03:29:37.200 回答
3

从理论上讲,您一次只想测试一个功能。但是,如果您的队列只有几个方法(Enqueue, Peek, Dequeue, Count),那么您在仅使用一种方法时可以执行的测试类型非常有限。

最好不要过度设计问题,只需创建一些简单的测试用例(例如上面的测试用例)并在此基础上构建以确保适当覆盖各种功能。

我觉得编写涵盖多个功能的测试是合适的,只要你有一些东西在使用的功能之一被破坏时也会破坏。因此,如果你有一个测试套件并且你破坏Enqueue了你的所有测试(或者大多数测试都会失败),但你会知道Enqueue因为你最简单的测试而破坏了。不应忽视测试与其测试套件的关系。

于 2008-10-16T03:44:12.600 回答
1

我认为这没问题,但在您的测试方法开始时清除队列。

于 2008-10-16T03:27:02.523 回答