Единичное тестирование структуры данных
Я пишу структуру данных в С# (очередь приоритетов, используя купон фибоначчи), и я пытаюсь использовать ее как опыт обучения для 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 на месте, просто оставил его для простоты.
Ответы
Ответ 1
Добавьте в свой тестовый проект отдельный помощник для класса. Используйте аксессуар, чтобы настроить частные свойства класса каким-то известным способом, а не использовать методы классов для этого. Как указал @Steven A. Lowe, вам также необходимо использовать методы SetUp/TearDown для вашего тестового класса для выполнения любых инициализаций, необходимых для тестирования. Я бы предпочел воссоздать очередь в каждом тесте, а не повторять ее между тестами, чтобы уменьшить связь между тестовыми примерами.
Ответ 2
Теоретически, вы хотите протестировать только одну функцию за раз. Однако, если ваша очередь имеет только несколько методов (Enqueue, Peek, Dequeue, Count), то вы довольно ограничены в тестах, которые вы можете использовать, используя только один метод.
Лучше всего не переусердствовать с проблемой и просто создать несколько простых тестовых примеров (например, выше) и построить поверх них, чтобы обеспечить соответствующий охват различных функций.
Я считаю, что уместно писать тесты, которые охватывают несколько функций, если у вас есть что-то внизу, которое также сломается, если одна из используемых функций будет нарушена. Поэтому, если у вас есть набор тестов и вы нарушите свой Enqueue, очевидно, что все ваши тесты (или большинство из них не удастся), но вы узнаете, что Enqueue сломался из-за ваших простейших тестов. Не следует пренебрегать отношением теста к его набору тестов.
Ответ 3
Я думаю, что все в порядке; но очистить очередь в начале вашего тестового метода; -)