2008-10-16 3 views
12

Я пишу структуру данных в 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)); 
} 

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

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

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

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

ответ

7

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

+0

upvote для уточнения - и написание моего имени право ;-) – 2008-10-16 03:31:43

+0

Итак, как мне получить доступ к этому частному аксессуару? Отражение? или InternalsVisibleTo магия? – 2008-10-16 03:33:35

2

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

3

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

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

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

Смежные вопросы