Моя интерпретация этого разговора такова:
- тестовые компоненты, а не классы.
- тестировать компоненты через их интерфейсные порты.
Об этом не говорится в разговоре, но я думаю, что предполагаемый контекст для совета выглядит примерно так:
- вы разрабатываете систему для пользователей, а не, скажем, служебную библиотеку или инфраструктуру.
- Цель тестирования состоит в том, чтобы успешно доставить как можно больше в рамках конкурентного бюджета.
- Компоненты написаны на одном зрелом, возможно, статически типизированном языке, таком как C # / Java.
- компонент порядка 10000-50000 строк; проект Maven или VS, плагин OSGI и т. д.
- Компоненты написаны одним разработчиком или тесно интегрированной командой.
- вы следуете терминологии и подходу чего-то вроде гексагональной архитектуры
- порт компонента - это место, где вы оставляете локальный язык, а его система типов - переключение на http / SQL / XML / bytes / ...
- Обертывание каждого порта - это типизированные интерфейсы в смысле Java / C #, в которых реализации могут быть переключены на технологии коммутации.
Таким образом, тестирование компонента является максимально возможной областью, в которой что-то еще можно разумно назвать модульным тестированием. Это довольно отличается от того, как некоторые люди, особенно ученые, используют этот термин. Это не что иное, как примеры в типичном учебном пособии по модульному тестированию. Это, однако, соответствует своему происхождению в тестировании оборудования; Платы и модули тестируются модулем, а не проводами и винтами. Или, по крайней мере, вы не строите фиктивный Боинг для проверки винта ...
Экстраполируя это и добавляя некоторые свои мысли,
- Каждый интерфейс будет либо входом, либо выходом, либо сотрудником (например, база данных).
- вы тестируете входные интерфейсы; вызовите методы, подтвердите возвращаемые значения.
- вы издеваетесь над выходными интерфейсами; убедитесь, что ожидаемые методы вызываются для данного теста.
- вы подделываете сотрудников; обеспечить простую, но работающую реализацию
Если вы делаете это правильно и чисто, вам едва нужен насмешливый инструмент; он используется только несколько раз для каждой системы.
База данных, как правило, является соавтором, поэтому она притворяется, а не издевается. Это было бы больно осуществлять вручную; К счастью, такие вещи уже существуют .
Базовым тестовым шаблоном является выполнение некоторой последовательности операций (например, сохранение и перезагрузка документа); подтвердите, что это работает. Это то же самое, что и для любого другого тестового сценария; никакое (работающее) изменение реализации, скорее всего, не приведет к сбою такого теста.
Исключение составляют записи базы данных, которые никогда не читаются тестируемой системой; например, журналы аудита или аналогичные. Это выходы, и поэтому должны быть осмеяны. Тестовым шаблоном является выполнение некоторой последовательности операций; подтвердите, что интерфейс аудита был вызван с указанными методами и аргументами.
Обратите внимание, что даже здесь, при условии, что вы используете безопасный для типов инструмент для пересмешивания, такой как mockito , переименование метода интерфейса не может вызвать сбой теста. Если вы используете IDE с загруженными тестами, она будет реорганизована вместе с методом переименования. Если вы этого не сделаете, тест не будет компилироваться.