Подтвердить что ты не робот

Единичное тестирование структуры данных

Я пишу структуру данных в С# (очередь приоритетов, используя купон фибоначчи), и я пытаюсь использовать ее как опыт обучения для 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));
}

Этот тест сломается, если сломается Enqueue или Peek.

Я думал, что смогу каким-то образом провести тест вручную, создав кучу структуры данных, но я не уверен, как это сделать, не подвергая реализацию миру.

Есть ли лучший способ сделать это? Опирается на другие части?

EDIT: у меня есть SetUp на месте, просто оставил его для простоты.

4b9b3361

Ответ 1

Добавьте в свой тестовый проект отдельный помощник для класса. Используйте аксессуар, чтобы настроить частные свойства класса каким-то известным способом, а не использовать методы классов для этого. Как указал @Steven A. Lowe, вам также необходимо использовать методы SetUp/TearDown для вашего тестового класса для выполнения любых инициализаций, необходимых для тестирования. Я бы предпочел воссоздать очередь в каждом тесте, а не повторять ее между тестами, чтобы уменьшить связь между тестовыми примерами.

Ответ 2

Теоретически, вы хотите протестировать только одну функцию за раз. Однако, если ваша очередь имеет только несколько методов (Enqueue, Peek, Dequeue, Count), то вы довольно ограничены в тестах, которые вы можете использовать, используя только один метод.

Лучше всего не переусердствовать с проблемой и просто создать несколько простых тестовых примеров (например, выше) и построить поверх них, чтобы обеспечить соответствующий охват различных функций.

Я считаю, что уместно писать тесты, которые охватывают несколько функций, если у вас есть что-то внизу, которое также сломается, если одна из используемых функций будет нарушена. Поэтому, если у вас есть набор тестов и вы нарушите свой Enqueue, очевидно, что все ваши тесты (или большинство из них не удастся), но вы узнаете, что Enqueue сломался из-за ваших простейших тестов. Не следует пренебрегать отношением теста к его набору тестов.

Ответ 3

Я думаю, что все в порядке; но очистить очередь в начале вашего тестового метода; -)