Вопрос Джоэла был примерно таким. Предположим, вы хотите установить бит где-нибудь, чтобы изображение с низким разрешением отображалось, а не изображение с высоким разрешением. Как бы вы использовали TDD, чтобы заставить это работать? Вы бы написали тест, который поцарапал экран, чтобы показать, что изображение было в низком разрешении?
Конечно нет. Вы уже знаете, что библиотека JPEG работает. Вы уже знаете, что если вы вызовете его с правильными аргументами, он будет отображаться в низком разрешении. Вам нужно проверить, что установленный вами бит преобразуется в соответствующие вызовы библиотеки JPEG. Таким образом, вы макете библиотеку JPEG с очень простым модулем, контролируемым вашим тестом. Затем вы устанавливаете бит и запрашиваете отображение. Библиотека Mocked JPEG запомнит, как она была вызвана, и затем тест сможет проверить, правильно ли она была вызвана.
Хорошо, как бы вы протестировали внутреннее содержимое библиотеки JPEG? Я не знаю много о рендеринге JPEG, но я предполагаю, что речь идет о сжатии, распаковке и растровых изображениях. Сжатие и декомпрессия - это всего лишь алгоритмы. Алгоритмы имеют предсказуемые результаты от заданных входов. Таким образом, вы настроили ряд очень простых входных данных и убедитесь, что получаете предсказуемые выходные данные. Вы настраиваете входы таким образом, чтобы охватить внутреннюю часть алгоритмов JPEG. Та же логика верна для растровых изображений. Вам не нужно отображать их на экране. Простые маленькие растровые изображения могут быть преобразованы в буферы памяти, которые могут проверить тесты. Под простым я имею в виду ПРОСТО. 3X3, 5X5, 8X8. Просто. Опять же, вы структурируете свои входные данные, чтобы покрыть большую часть кода.
Ничто из этого не является ракетостроением. Нет, если это идеально. Но набор из 50 тестов, который показывает, что 90% вашей логики верны, может иметь огромное значение, когда вы хотите внести изменения.
Можете ли вы когда-нибудь полностью исключить ручное тестирование? Конечно, нет. Но вы можете значительно смягчить это. Вы можете сократить ручное тестирование до нескольких очень стратегических тестов, а не до тысяч утомительно утомительных планов тестирования.