2009-03-03 5 views
31

В notorious Stack Overflow #38 podcastJoel Spolsky говорилось о том, как трудно было бы делать TDD для чего-то вроде сжатия JPEG. Боб Мартин wanted to cover как сделать TDD для экземпляра, например, во время подкаста # 41, но я не думаю, что они когда-либо добирались до него. Таким образом:Сжатие TDD и JPEG

Как можно использовать TDD для разработки и тестирования сжатия JPEG?

+1

И, пожалуйста, мы можем теперь * всегда * относятся к нему как «The Notorious Stackoverflow # 38» или TNS # 38 ;-) –

ответ

70

Вопрос Джоэла был примерно таким. Предположим, вы хотели немного настроить что-то, что привело к отображению изображения с низким разрешением, а не изображения с высоким разрешением. Как бы вы использовали TDD, чтобы заставить это работать? Вы могли бы написать тест, который очищал экран, чтобы показать, что изображение было низким?

Конечно нет. Вы уже знаете, что библиотека JPEG работает. Вы уже знаете, что если вы назовете его правильными аргументами, он будет отображаться с низким разрешением. Что вам нужно проверить, так это то, что бит, который вы установили, преобразуется в соответствующие вызовы в библиотеку JPEG. Таким образом, вы издеваетесь над библиотекой JPEG с помощью очень простого модуля, контролируемого вашим тестом. Затем вы устанавливаете бит и запрашиваете отображение. Библиотека Mocked JPEG будет помнить, как она была вызвана, а затем тест может проверить, чтобы она была вызвана правильно.

ОК, так как бы вы протестировали внутренности библиотеки JPEG? Я не очень много знаю о JPEG-рендеринге, но я предполагаю, что это касается сжатия, декомпрессии и растровых изображений. Сжатие и декомпрессия - это просто алгоритмы. Алгоритмы имеют предсказуемые результаты с заданных входных данных.Таким образом, вы создали серию очень простых входов и убедитесь, что вы получаете прогнозируемые выходы. Вы настраиваете входы так, чтобы внутренняя часть алгоритмов JPEG была покрыта. Такая же логика выполняется для растровых изображений. Вам не нужно отображать их на экране. Простые маленькие растровые изображения могут быть отображены в буферы памяти, которые могут проверяться. Простым я имею в виду ПРОСТО. 3X3, 5X5, 8X8. Просто. Опять же, вы структурируете свои входные данные, чтобы покрыть основную часть кода.

Ничто из этого не является наукой о ракетном оружии. Нет, если он совершенен. Но набор из 50 тестов, который показывает, что 90% вашей логики является правильным, может иметь огромное значение, если вы хотите внести изменения.

Можете ли вы полностью устранить ручное тестирование? Конечно нет. Но вы можете значительно смягчить его. Вы можете уменьшить ручное тестирование до нескольких очень стратегических тестов, а не тысяч утомительных планов испытаний.

+16

Удивительно, я получил дядю Боба, чтобы присоединиться к stackoverflow. Для этого должен быть значок. – stimms

+1

Ха-ха ... ну, так как вы не получите значок для этого, я, по крайней мере, дам ваш вопрос +1. –

+0

Вы можете отображать более сложные изображения, а затем вычислять контрольную сумму MD5 для сравнения с известными результатами. –

4

Если вы считаете, что TDD означает, что тесты проходят до любого кода или любого дизайна, это в значительной степени невозможно. Для сложных алгоритмов вам нужны некоторые результаты. А в случае сжатия результаты трудно получить вручную. Не невозможно, но сложно.

Кроме того, для сжатия требуется очень высокопроизводительный алгоритм. Просто пройти тест не совсем достаточно. Многие низкопроизводительные алгоритмы могут пройти базовый тест «правильность».

Чтобы не соответствовать правильности, вам необходимы доказательства того, что ваш алгоритм является оптимальным. Это может быть разработано только за пределами мира тестирования. Вам необходим анализ сложности с использованием O (что-то), что не является результатом теста; а также не может быть четко определена как результат теста.

Если, с другой стороны, вы считаете, что «проверяемость» подходит к большей части кода, тогда это легко.

  • Создайте свой алгоритм. Напишите доказательство того, что это оптимально.

  • Напишите код, который предоставляет критические фрагменты вашего алгоритма в качестве тестируемых модулей.

  • В некоторых случаях напишите код для получения результатов испытаний для общего алгоритма. Это может быть субоптимальный, грубый код, который дает правильный ответ через действительно очевидные, но медленные алгоритмы.

  • Соберите unittest, чтобы показать, что ваша реализация дает ожидаемые результаты теста.

  • Соберите техническую документацию, чтобы показать, что она также оптимальна.

Это не испытание. Но это испытание.

0

Test Driven развития не только программирование, есть много других вещей, которые вы можете сделать с помощью теста первых, примеры с приемкой TDD и т.д.

Подумайте сначала, как вы хотите, чтобы вести себя, это вещь. Для алгоритма, пример может быть что-то вроде:

  • «Он должен закончить 5 вызовов за 10 секунд»
  • «Это должно сократить до 10% размера изображения»
  • Других.

Я считаю, что это только образ жизни, чтобы ясно, что вы хотите достичь думаю: D

Смежные вопросы