Как написать интеграционные и системные тесты в Asp.net MVC

Мои приложения

у меня есть дизайн приложения, которое выглядит так:

  • уровень веб-приложений - asp.net приложение MVC с контроллерами и представлениями, использующими POCOs и call services
  • service layer-бизнес-процессы, использующие pocos и репозитории вызовов
  • Data layer-репозитории, использующие POCOs и взаимодействующие с моделью в виде модели EF, которая является частью этого же слоя
  • слой POCO - определяет все классы, используемые для взаимодействия между этими слоями

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

тестирование

насколько я понимаю блок, интеграцию и системное тестирование (по отношению к Asp.net MVC) это:

  • модульное тестирование - это просто. Макет развязанных объектов и ввести их в модульный тест так испытанный блок будет использовать их
  • integration testing-должен сделать группу производственных функциональных блоков и издеваться над остальными: поэтому написание интеграционных тестов, которые будут тестировать интеграцию контроллера, службы и репозитория без фактического использования производственной базы данных
  • тестирование системы-запуск тестов на всех уровнях без каких-либо издевательств, то есть я должен использовать производственную (тестовую) базу данных, а также

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

как следует писать интеграционные и системные тесты для Asp.net приложение MVC?
Или любое приложение .net, если на то пошло?

код, который помогает объяснить проблему

Предположим, у меня есть такие классы, как:

  • TaskController звонки в TaskService
  • TaskService вызывает TaskRepository
  • TaskRepository манипулировать данными EF внутренне

Итак, вот мои (сокращенно) классы:

public class TaskController
{
    private ITaskService service;

    // injection constructor
    public TaskController(ITaskService service)
    {
        this.service = service;
    }

    // default constructor
    public TaskController() : this(new TaskService()) {}

    public ActionResult GetTasks()
    {
        return View(this.service.GetTasks());
    }
    ...
}

public class TaskService : ITaskService
{
    private ITaskRepository repository;

    // injection constructor
    public TaskService(ITaskRepository repository)
    {
        this.repository = repository;
    }

    // default constructor
    public TaskService() : this(new TaskRepository()) {}

    public IList<Task> GetTasks()
    {
        return this.repository.GetTasks();
    }
    ...
}

public class TaskRepository : ITaskRepository
{
    public IList<Task> GetTasks()
    {
        // code that gets tasks from EF and converts to Task POCOs
    }
    ...
}

модульный тест прост и будет выглядеть вот так:

public void UnitTest()
{
    var mock = new Mock<ITaskService>();
    // other code that mocks the service

    TaskController controller = new TaskController(mock.Object);

    // do the test
}

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

public void IntegrationTest()
{
    // no mocking at all
    TaskController = new TaskController();
    // do some testing
}

прежде всего, я не могу просто издеваться над базой данных здесь? Я мог бы издеваться над репозиторием и иметь real однако сервис и контроллер...

3 ответов


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

системным тестом для меня будет функциональное тестирование (другой уровень тестирования с использованием чего-то вроде fit) или тестирование пользовательского интерфейса через инструмент, такой как testcomplete или инструмент QA telerik.

HTH.


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

для ASP.NET MVC в частности (или любое веб-приложение), вы можете использовать WatiN или селен для написания системных / интеграционных тестов с помощью пользовательского интерфейса.

вы также можете посмотреть Т. С. Т. для модульного тестирования T-SQL и SpecFlow если вам интересно О БДД в .Нет.

Примечание: я написал это раньше вопрос был дополнен кодом и описанием конкретной ситуации. Он больше не затрагивает этот вопрос, но, надеюсь, все равно будет интересен/полезен кому-то.


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

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

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