2015-05-14 3 views
8

Мы являемся двумя студентами, которые пишут наш диплом бакалавра, и мы разработали приложение для Windows, которое должно помочь ресторану в различных коммуникационных процессах. По сути, он должен быть в состоянии представить информацию о заказе с момента подачи гостя, отправленного ему на него.Как написать интеграционный тест в NUnit?

Мы пропустили тестирование во время разработки, но решили написать модульные тесты сейчас. Тем не менее, мы выяснили, что наиболее подходящим тестом, который мы можем записать в нашу систему, являются интеграционные тесты, потому что все методы в наших классах связаны с хранимыми процедурами SQL через LINQ to SQL. Мы знаем о том, как использовать заглушки для подделки зависимости с базой данных, но когда наша база данных уже реализована вместе со всеми функциями, мы полагаем, что это даст нам больше пользы для тестирования нескольких методов вместе в качестве теста интеграции.

Как видно из приведенного ниже кода, мы попытались следовать направляющим линиям для модульного теста, но это правильный способ написать интеграционный тест?

[Test] 
public void SendTotalOrder_SendAllItemsToProducer_OneSentOrder() 
{ 
    //Arrange 
    Order order = new Order(); 
    Guest guest = new Guest(1, order); 
    Producer producer = new Producer("Thomas", "Guldborg", "Beverage producer");    
    DataGridView dataGridView = new DataGridView { BindingContext = new BindingContext() }; 
    order.MenuItemId = 1; 
    order.Quantity = 1; 

    //Act 
    guest.AddItem(); 
    dataGridView.DataSource = guest.SendOrderOverview(); 
    guest.SendOrder(dataGridView); 
    dataGridView.DataSource = producer.OrderOverview(); 
    var guestTableOrder = producer.OrderOverview() 
     .Where(orders => orders.gtid == guest.GuestTableId) 
     .Select(producerOrder => producerOrder.gtid) 
     .Single(); 

    //Assert 
    Assert.That(guestTableOrder, Is.EqualTo(guest.GuestTableId)); 
} 

ответ

13

Да, вообще говоря, это как написать единичный тест/интеграционный тест. Вы соблюдаете некоторые важные принципы:

  • Distinct Act-Устройте-Утверждай шаги
  • Название теста описывает эти шаги (возможно, это должно быть что-то вроде «ShouldSendOneOrder» в конце концов, «Если» обычно используется для описания Assert).
  • Один ассерт за тест.

Я предполагаю, что вы также соблюдать другие правила:

  • тесты являются независимыми: они не меняют постоянное состояние, так что они не влияют на другие тесты.
  • Проверка реалистичных вариантов использования: не упорядочивайте созвездия, которые нарушают бизнес-логику, не делают невозможных действий. Или: имитировать реальное приложение.

Однако я также вижу вещи, которые поднимают брови.

  • Это не ясно , которые действуют вам тест. Я думаю, что некоторые «действия» относятся к шагу аранжировки.

  • Метод, подобный producer.OrderOverview(), заставляет меня подозревать, что объекты домена выполняют взаимодействие с базой данных. Если это так, это нарушит упорство невежества. Я думаю, что должна быть служба, которая представляет этот метод (но см. Ниже).

  • Непонятно, почему dataGridView.DataSource = producer.OrderOverview(); необходим для испытания. Если это так, это только усугубляет наиболее серьезный момент:

  • Бизнес-логика и пользовательский интерфейс запутаны!

    • Метод как guest.SendOrderOverview() и producer.OrderOverview() являются вонючим: почему объект домена должен знать, как настоящего его содержания? Это должно быть ответственным за презентацию (MVP) или контроллер (MVC) или модель представления (MVVM).
    • Метод guest.SendOrder(dataGridView) is evil. Он связывает доменный слой с инфраструктурой пользовательского интерфейса. Эта фиксированная зависимость достаточно зла, но, конечно, вам также нужны значения из вида сетки внутри этого метода. Таким образом, бизнес-логика нуждается в глубоком знании некоторого компонента пользовательского интерфейса. Это нарушает правило - не спрашивайте принцип. guest.SendOrder должен иметь простые параметры, которые рассказывают ему, как выполнять свою задачу, и домен не должен иметь любой ссылка на любой Пользовательский интерфейс.

Вы действительно должны решить последнюю точку. Сделайте свою задачу для запуска этого теста без какого-либо взаимодействия с DGV.

+0

Большое спасибо за ваш тщательный ответ! Это высоко ценится! В настоящее время я выполнил большинство предложенных вами моментов. На самом деле, это мой первый интеграционный тест, поэтому полезно получить такое всеобъемлющее объяснение в том, что делать и что не делать :-) –

1

Если вы продолжаете связывать sql в классе, ваш тест не является большой проблемой.

Вы можете использовать этот метод, когда программная логика очень проста, но я предлагаю вам изучить The Repository Pattern, поскольку логика становится более сложной.

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