Если у меня уже есть интеграционный тест для моей программы, и все они прошли, то у меня хорошее предчувствие, что это сработает. Тогда каковы причины написания / добавления модульных тестов? Так как в любом случае мне уже приходится писать интеграционные тесты, я бы хотел писать модульные тесты только для частей, которые не охвачены интеграционными тестами.
Что я знаю преимущество модульного теста над интеграционным тестом
- Небольшой и, следовательно, быстрый в работе (но добавление нового модуля для тестирования чего-либо уже проверено интеграционным тестом, что означает, что мой общий тестовый набор увеличится и будет работать дольше)
- Обнаружить ошибку проще, потому что она проверяет только одну вещь (но я могу начать писать модульный тест, чтобы проверить каждую отдельную деталь, когда мой интеграционный тест не прошел)
- Найти ошибку, которая может не попасть в интеграционный тест. например, маскирование / устранение ошибок. (но если мои интеграционные тесты пройдут все успешно, это означает, что моя программа будет работать, даже если существует какая-то скрытая ошибка. Поэтому найдите / исправьте эти ошибки не на самом деле с высоким приоритетом, если они не начнут ломать будущие интеграционные тесты или не вызовут проблемы с производительностью)
И мы всегда хотим писать меньше кода, но для написания модульных тестов нужно намного больше кода (в основном это установка фиктивных объектов). Разница между некоторыми из моих модульных тестов и интеграционных тестов заключается в том, что в модульных тестах я использую фиктивный объект, а в интеграционных тестах я использую реальный объект. У которых много дублирования, и мне не нравится дублированный код, даже в тестах, потому что это добавляет накладные расходы для изменения поведения кода (инструмент рефакторинга не может выполнять всю работу все время).