Определение: Юнит-тестирование - это метод тестирования, целью которого является обнаружение или предотвращение тех ошибок, которые можно обнаружить при тестировании небольших (даже минимально небольших) отдельных частей программного обеспечения.
Это определение устанавливает нижнюю границу объема модульного тестирования, а именно, начиная с самых маленьких программ.Для верхней границы это оставляет степень свободы.Иногда люди пытаются также разграничить верхнюю границу, придумав определения термина «единица измерения».Но мне все равно, что такое юнит.Вместо этого я установил ограничение на основе вопроса о том, насколько большим может быть тестируемый программный компонент, чтобы методы модульного тестирования все еще могли применяться разумно.
Например: одна функция, скажем, 15 строккода будет подвергаться модульному тестированию.Но что, если я произвожу рефакторинг своего кода так, чтобы из функции были извлечены две вспомогательные функции?В соответствии с определением я теперь мог также применить модульное тестирование к вспомогательным функциям.Но, если у меня уже был отличный набор юнит-тестов, они все равно должны работать с интерфейсом исходной функции.Таким образом, я мог бы сохранить свои тесты и игнорировать измененную внутреннюю структуру - и это все равно будет модульное тестирование.
Другой пример: в C ++ контейнерные классы объединяются со связанными классами итераторов.Контейнерный класс и его соответствующие классы итераторов тесно связаны.Тестирование этих классов вместе с методами юнит-тестирования будет хорошо работать во многих случаях.При тестировании итератора вы обычно не изолируете его от класса контейнера, а скорее тестируете оба вместе - и я по-прежнему считаю это модульным тестированием.
Сводная часть 1: КакПока применение методов модульного тестирования имеет смысл, вы также можете применять его к наборам тесно связанных функций и даже тесно связанных классов.
Снова взглянув на приведенное выше определение, в нем упоминается изоляция.Обратите внимание, однако, что изоляция здесь используется для классификации типов ошибок, которые могут быть обнаружены: модульное тестирование для выявления ошибок, которые можно найти в изолированном программном обеспечении.В нем не говорится, что вы на самом деле должны изолировать код во время тестирования.Другими словами, вам не обязательно издеваться над зависимостями.
Насмешка должна выполняться по причине.Если вы подумываете о том, чтобы использовать функцию или метод, вы должны знать, какую проблему вы собираетесь решить.Если проблема не решается, не издевайтесь.Например, вы также не высмеиваете математические функции стандартной библиотеки, такие как sin или cos, потому что они также не вызывают проблем в большинстве случаев.
Вы бы, например, делали насмешки, если бы зависели откомпонент (DOC) вызывает недетерминированное поведение (случайность, время, ...).Однако с помощью mock вы не можете найти тех ошибок, которые связаны с неправильными представлениями о том, как должно работать взаимодействие тестируемой функции с DOC: так как вы реализуете mocks, вы реализуете их на основе ваших потенциальных заблуждений.Это не недостаток модульного тестирования: это просто причина, по которой в дополнение к модульному тестированию вам также необходимы интеграция и тестирование системы.
Сводная часть 2: Модульное тестированиене обязательно насмешливый.Речь идет о поиске особых ошибок: таких, которые вы могли бы найти , если код был изолирован.Это исключает все другие ошибки (особенно те, которые вы можете найти только в интегрированном программном обеспечении) из области модульного тестирования.