2009-08-13 2 views
4

Я часто нахожу, что меняю свой код, чтобы сделать его более проверяемым, я всегда задаюсь вопросом, хорошая идея это или нет. Некоторые из вещей, которые я нахожу, это:Должен ли я изменить код, чтобы сделать его более проверяемым?

  1. Добавление сеттеров только для того, чтобы я мог установить внутренний объект в макет.
  2. Добавление геттеров для внутренних карт/списков, чтобы я мог проверить, что внутреннее состояние объекта изменилось после выполнения какого-либо внешнего действия.
  3. Обертывание конкретных системных классов и создание нового интерфейса, чтобы я мог их издеваться. Например, классы файлов могут быть сложными для создания флеш-памяти, поэтому я создам новый интерфейс FileInterface и WrappedFile, который расширяет его, а затем использует FileInterface вместо File.

ответ

7

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

Из ваших трех примеров только # 3 действительно хороший; часто эти новые интерфейсы сделают ваш код более гибким для регулярного использования позже. # 1 обычно адресуется для тестирования через инъекцию зависимостей, что, на мой взгляд, делает код излишне сложным, но, по крайней мере, упрощает тестирование. # 2 звучит как плохая идея в целом.

+1

Это суммирует это отлично. Что касается номера 2, одна из самых сложных вещей для меня, начиная с TDD, заключалась в том, чтобы убедиться, что мне не нужно проверять частную/внутреннюю логику - только общедоступные вещи, которые остальная часть приложения будет потреблять. Как только вы преодолеете это препятствие, оно имеет смысл и освобождает. Инъекционная инъекция является существенным сдвигом конструкции, чтобы выполнить это с насмешкой. – Jay

+0

Согласен с первым абзацем, но не со вторым. Создание отдельных интерфейсов вверх, чтобы «сделать ваш код более гибким для регулярного использования позже», просто переработано. По моему опыту, предполагаемая дополнительная гибкость никогда не используется. Код должен быть разработан для использования в первую очередь и для повторного использования второго. –

-1

Кажется разумным. Однако некоторые вещи не нуждаются в проверке; Я бы предложил проверить, не добавлено ли добавление в список, немного бесполезно. Но делайте то, с чем вам комфортно.

0

Это компромисс ..

Вы хотите тонкий, обтекаемой API или раздутой более сложным, но easilier испытано.

Не ответ, который вы хотели бы услышать, я знаю :)

+0

Придание кода более проверяемым обычно приводит к лучшему, более простенькому коду; не раздутой или более сложной. –

+0

Certanly зависит от того, как вы упростите тестирование. Кроме того, что проще? Просто создавая экземпляр объекта или добавляя ссылку на некоторую IOC-библиотеку, зарегистрируйте свой тип, создайте для него интерфейс и затем спросите эту библиотеку для экземпляра вашего объекта? Я, конечно, согласен с тем, что МОК и интерфейсы хороши, но есть и такие вещи, как «не разумный» и «перебор» ... – cwap

+0

«Объект» в вышеприведенном виде следует читать как «класс» ofc ^^ Я устал. – cwap

5

Это прекрасно, и даже рекомендуется, чтобы изменить код, чтобы сделать его более проверяемым. Вот список 10 things that make code hard to test.

Я думаю, что ваш третий действительно хорошо, но я не слишком люблю первый и второй. Если вы просто открываете свои внутренние классы с помощью геттеров и сеттеров, вы полностью отказываетесь от инкапсуляции. В зависимости от вашего языка есть способы открыть видимость некоторых параметров для тестирования. Но то, что я на самом деле делаю (что немного расширяет инкапсуляцию), - это сделать поля, которые я хочу проверить, защищенными (когда инъекция зависимостей не решает проблему).

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

Наконец, вы также можете изменить код, чтобы иметь зависимость и инверсию управления, так как это упрощает проверку кода и более читабельность и удобство обслуживания.

Хотя изменение в порядке, лучше всего делать TDD. Он дает проверяемый код естественным образом, как только тесты будут написаны первыми.

-1

В идеале каждый класс, который вы проектируете, должен тестироваться сам, поэтому вам не нужно менять открытый интерфейс. Но вы говорите о устаревшем коде, поэтому я считаю, что изменение кода разумно только тогда, когда общественное воздействие не так заметно. Я бы предпочел добавить статический внутренний класс для проверки вместо раздувания интерфейса тестируемого класса.

+0

Это не шов, как основная идея/подход. Хотели бы вы уточнить или дать некоторые рекомендации? –

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