繁体   English   中英

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

[英]How do I set up the internal state of a data structure during unit testing?

我正在用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 ,为了简单起见,我把它留了下来。

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

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

从理论上讲,您只想一次测试一个功能。 但是,如果你的队列只有几个方法( EnqueuePeekDequeueCount ),那么你在使用一种方法时可以做的测试种类非常有限。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM