Пишите интеграционный тест, а не юнит-тест

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

Слишком длинные для чтения

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

Подробнее…

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

Юнит-тест доказывает правильность работы только одного модуля. В то время как интеграционный тест проверяет работу более чем одного модуля.

Тестируемая система

Почему важно понимать, что такое тестируемая система? Это поможет нам определить эффективный тест.

Тестируемая система (SUT) — система, которая проверяется на правильность работы.

Обычно интеграционный тест охватывает более широкую SUT, чем модульный тест. Рассмотрим следующий тест:

[Fact]
public async void IntegrationTest()
{
    var client = new HttpClient();
    var model = new Model();

    var result = await client.PostAsync(_url, new StringContent(JsonConvert.SerializeObject(model)));
    var expectedModel = JsonConvert.DeserializeObject<Model>(await result.Content.ReadAsStringAsync());

    var response = await client.GetAsync($"{_url}/{expectedModel.Id}");
    var actualModel = JsonConvert.DeserializeObject<Model>(await result.Content.ReadAsStringAsync());

    Assert.Equal(expectedModel.Id, actualModel.Id);
    Assert.Equal(expectedModel.Name, actualModel.Name);
}
Войти в полноэкранный режим Выход из полноэкранного режима

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

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

[Fact]
public async void UnitTest()
{
    var serviceMock = new Mock<IService>();
    serviceMock.Setup(p => p.MyServiceMethod()).Returns(true);
    var controller = new MyController(serviceMock);

    var model = new Model();
    var expectedModel = controller.MyControllerMethod(model);

    Assert.Equal(1, expectedModel.Id);
    Assert.Equal("Expected Name", expectedModel.Name);
}
Вход в полноэкранный режим Выход из полноэкранного режима

SUT для приведенного выше теста — это один уровень (Controller):

Как мы видим, интеграционные тесты охватывают более широкий SUT, чем модульные тесты, при аналогичном объеме кода.

Итог

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

Вот как вы можете убедиться, что пишете интеграционный тест:

🗄️ Используйте тестовый экземпляр базы данных, тестового арендатора во внешней зависимости и т.д.

🖥️ Используйте тестовые серверы вместо mocking и stabbing.

🐳 Используйте Docker для более простого управления зависимостями.

Ресурсы

  1. Мой пример интеграционного теста. Обратитесь к README за инструкциями о том, как его запустить.
  2. Я обнаружил хороший редактор диаграмм: Mermaid digram editor.

Оцените статью
Procodings.ru
Добавить комментарий