如何在单元测试期间设置数据结构的内部状态?

时间:2008-10-16 03:24:31

标签: c# tdd

我正在用C#(使用fibonacci heap的优先级队列)编写数据结构,我正在尝试将其用作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,只是为了简单起见而将其留下。

3 个答案:

答案 0 :(得分:7)

为您的测试项目添加该类的私有访问器。使用访问器以某种已知方式设置类的私有属性,而不是使用classes方法来执行此操作。

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

答案 1 :(得分:3)

理论上,您只想一次测试一个功能。但是,如果您的队列只有几个方法(EnqueuePeekDequeueCount),那么您在进行的测试类型方面相当有限仅使用一种方法。

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

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

答案 2 :(得分:1)

我认为这没关系,但在测试方法开始时清除队列。