Подтвердить что ты не робот

Предупреждающие знаки для непроверяемого кода

Кодекс, который не подвергается сомнению, действительно меня раздражает. Следующие вещи делают неопровержимый код:

  • глобальные состояния, например шаблон проектирования Singleton
  • статические методы, которые выполняют некоторую причудливую работу, например доступ к базе данных.
  • Дерево глубокого наследования
  • работать в конструкторе, например. контрольные заявления
  • которые нарушают принцип единой ответственности

Есть ли еще предупреждающие знаки?

4b9b3361

Ответ 2

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

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

При условии, что тесты пройдены, вы выполнили требования. Если после этого есть ошибки, это проблема с тестами, а не с тестируемым кодом (в этом случае тесты должны быть изменены, чтобы уловить ранее непредвиденную проблему).

Вам не все равно (с точки зрения доставки функциональности), есть ли инструкция while в одном из ваших конструкторов. Вы должны спросить себя, что требует бизнес-требование? Я сильно сомневаюсь, что ваш клиент предоставит список требований, включая "наследование, ограниченное 4 уровнями". В качестве требования они могут перечислить "без ошибок", но вам придется обсудить их на следующем: -).

Ответ 3

Жестко закодированные зависимости.

Ответ 4

  • Не программирование интерфейсов
  • Создание объектов с использованием фабрик /IOC

Ответ 5

Работа в классах GUI, не имеющая ничего общего с презентацией. GUI должен быть полностью отделен от базовой модели.

Ответ 6

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

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

Ответ 7

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

Среди других неприятностей, затрудняющих модульное тестирование:

  • код графического интерфейса пользователя, смешанный с кодом бизнес-логики
  • все анти-шаблоны, но в особенности объект Бога (http://en.wikipedia.org/wiki/God_object)
  • по тем же линиям, огромная функция также очень раздражает.

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

Ответ 8

Базы данных! Особенно те, у кого есть триггеры!

Я знаю, что вы можете издеваться над базой данных, но я всегда обнаружил, что большинство ошибок в моем коде (в основном CRUD-приложения) - это проблемы с данными/сопоставлением, и если вы издеваетесь над базой данных, вы не найдете такого рода ошибка.

Ответ 9

Руководство Miško Hevery на Написание тестового кода детализирует недостатки, которые делают код сложным для тестирования. Его список частично совпадает с вашим, но идет в невероятную детализацию.

  • Конструктор действительно работает
  • Копание в Collaborators
  • Хрупкое глобальное состояние и синглтоны
  • Класс слишком много

Ответ 10

отсутствие слоев, избыток связи... т.е. класс Y был написан, чтобы знать о X, но он не должен, X является многоразовым. Между тестируемостью и повторным использованием существует сильная взаимосвязь.