Тестирование
Юнит-тесты.
Минимальные низкоуровневые тесты для проверки минимального блока кода (юнита), «оторванного от реальности». Это может быть функция, метод или маленький утилитарный класс. Можно сказать, что юнит-тесты проверяют принцип единой обязанности на уровне методов и мелких классов без зависимостей.
Признаки юнит-тестов:
- Все значения в памяти
- Нет обращений к инфраструктуре: нет потоков, нет файловой системы, нет БД
- Сложные зависимости и инфраструктура мокаются
Интеграционные тесты
Более высокий уровень абстракции, чем юнит-тесты.
Тестирует функциональность системы (в частности класса) в связке с окружением и зависимостями. К тому же, тестируется взаимодействие составных частей (к примеру, последовательность состояний класса).
Признаки:
- Тесты используют реальную инфрастуктуру: потоки, БД, файловую систему, зависимости системы
- Тесты проверяют взаимодействие компонентов
Приемочные/функциональные тесты
Еще более высокий уровень абстракции, чем интеграционные тесты.
Тестируются фичи и их согласованность со спецификацией. По большей части провеярется то, что система производит нужный ответ на заданный ввод. При этом нас не интересует внутреннее состояние компонентов системы. Можно сказать, что система в приемочных тестах — черный ящик.
Признаки:
- Тесты пишутся с точки зрения клиента системы
- Тесты ориентированы на проверку ключевых требований, предъявляемых к конкретной фиче
- Тесты проверяют соответствие ожиданий (спецификацию) и реальности
Итого:
эти виды тестов не исключают друг друга. Они находятся на разных уровнях абстракции. Можно сказать, что юнит-тесты и интеграционные тесты делают проверки с точки зрения программиста, а функциональные тесты — с точки зрения клиента кода.
И да — бывают смешанные типы. К примеру, нам лень мокать зависимость от БД, но мы пишем «типа юнит-тест». В итоге получаем «интеграционный юнит-тест»(с минимальной зависимостью от БД) который в первую очередь проверяет поведение метода и в качестве стороннего эффекта — интеграцию этого поведения с БД.