System Under Test (SUT) - это та часть системы, которую мы рассматриваем как объект проверки в конкретном тесте.
Юнит-тестом называется тест, который, проверяет одну единицу поведения, делает это быстро и в изоляции от других тестов. Любой тест, не удовлетворяющий хотя бы одному из этих трёх критериев, относится к категории интеграционных. Термин юнит в юнит-тестах относится к единице поведения, а не кода. Объем кода, необходимый для такой единицы, не имеет значения.
Интеграционный тест- тест, который проверяет взаимодействие нескольких компонентов системы, чтобы убедиться, что они корректно интегрированы и выполняют ожидаемое поведение.
Проблема с термином «интеграционные тесты» в том, что им обозначают тесты с радикально разным объёмом и окружением SUT: от набора из двух модулей без Spring-контекста, одного модуля с Spring-контекстом, до целого монолита.
Чтобы однозначно указывать, какой именно SUT и тип теста имеют в виду, предлагается ввести отдельный термин - DUC-тесты.
Контрактные интеграционные тесты или DUC-тесты (Domain Usage Contract) - это интеграционные тесты, которые проверяют поведение приложения через публичный API, гарантируя соответствие контракту. В роли SUT в данном случае выступает всё приложение. В подобных тестах допускается исключение части функциональности через mock - это компромисс между полнотой проверки и скоростью/стабильностью тестов.
Внепроцессные зависимости в контексте тестирования:
- Управляемые зависимости - “собственные” внепроцессные зависимости, находящиеся под полным контролем приложения. Пример: база данных, кеш.
- Неуправляемые зависимости - внепроцессные зависимости, которые не находятся под полным контролем приложения. Пример: шина данных, api-gate, внешние сервисы - nbs, vps по отношению к compute.
Интеграционные тесты проверяют взаимодействие между компонентами приложения через API, часто используя моки для имитации неуправляемых внепроцессных зависимостей.
Компонентные тесты - тесты, которые проверяют поведение одного компонента приложения, используя реальные неуправляемые внепроцессные зависимости.
E2E-тесты (end-to-end tests) - проверка методом чёрного ящика бизнес сценариев работы приложения с точки зрения конечного пользователя на реальном стенде (preprod, prod).
Источники:
- https://martinfowler.com/bliki/UnitTest.html
- https://martinfowler.com/bliki/IntegrationTest.html
- Принципы юнит-тестирования, Владимир Хориков
- https://medium.com/%40wilsonsinquest/on-writing-tests-as-an-induction-proof-of-system-correctness-5ddae19207ca
- https://martinfowler.com/articles/nonDeterminism.html