Как написать интеграционный тест в NUnit?

мы два студента, пишущие нашу дипломную работу бакалавра, и мы разработали приложение Windows, которое должно быть в состоянии помочь ресторану в различных коммуникационных процессах. В принципе, он должен иметь возможность представлять информацию о заказе с момента его отправки гостем.

мы опустили тестирование во время разработки, но решили написать модульные тесты сейчас. Тем не менее, мы выяснили, что наиболее подходящий тест мы можем написать в нашу систему теперь это интеграционные тесты, потому что все методы в наших классах привязаны к хранимым процедурам 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));
}

2 ответов


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

  • отдельный акт-организовать-утверждать шаги
  • имя теста описывает эти шаги (возможно, оно должно иметь что-то вроде "ShouldSendOneOrder" в конце, "должен" обычно используется для описания Assert).
  • одно утверждение на тест.

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

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

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

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

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

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

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

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

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


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

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