В чем разница между юнит, мок, смок и интеграционным тестированием?
Что проверяют
Замечаете ли вы, что в вопросе смешаны разные вещи: юнит, интеграционные и смок-тесты это уровни и цели тестирования, а мок вообще не вид тестирования, а тестовый двойник, приём изоляции. Следом обычно спрашивают, чем вы пишете такие тесты в .NET и как поднимаете зависимости для интеграционных.
Как отвечать
- юнит-тест: проверяет один класс или метод в изоляции, без сети, диска и базы. Выполняется за миллисекунды, таких тестов больше всего. В .NET это xUnit, NUnit или MSTest, проверки часто пишут через FluentAssertions или Shouldly;
- мок: подмена зависимости, у которой можно проверить вызовы. Через Moq или NSubstitute создают объект по интерфейсу
IOrderRepository, задают ответы и проверяютVerify(x => x.Save(order), Times.Once()). Рядом стоят стабы, которые только отдают данные, и фейки вроде реализации в памяти; - интеграционный тест: несколько реальных компонентов вместе. Для ASP.NET Core стандартный путь это
WebApplicationFactory<Program>из пакетаMicrosoft.AspNetCore.Mvc.Testing: приложение поднимается в памяти, запросы идут черезHttpClient. Базу берут настоящую, в контейнере через Testcontainers; - смок-тест: короткий набор проверок после сборки или деплоя, ответ на вопрос «приложение вообще живо»: сервис стартует,
/healthотвечает 200, логин проходит. Если смок красный, глубже тестировать бессмысленно.
Сведите всё в пирамиду: много быстрых юнит-тестов, меньше интеграционных, совсем немного сквозных и смок-проверок, которые гоняются на каждом деплое.
Где спотыкаются
Называют мок-тестирование отдельным видом наравне с остальными. Интервьюер часто ждёт, что вы заметите этот подвох в формулировке.
Мокают всё подряд, включая DbContext и HttpClient. Такие тесты проверяют, как вы настроили моки, а не как работает код, и ломаются при любом рефакторинге.
Считают, что EF Core InMemory даёт полноценный интеграционный тест. Этот провайдер не выполняет SQL, не проверяет ограничения и транзакции как реальная база, и документация Microsoft сама не советует использовать его для тестов.