«Лучшая среда тестирования - это само приложение»
Я считаю, что распространенное заблуждение среди разработчиков заключается в том, что они по ошибке делают тесную связь между системами тестирования и принципами TDD. Я бы посоветовал перечитать официальные документы по TDD; принимая во внимание, что нет никакой реальной связи между средами тестирования и TDD. В конце концов, TDD - это парадигма, а не основа.
Прочитав вики на TDD (https://en.wikipedia.org/wiki/Test-driven_development),), я пришел к выводу, что в некоторой степени вещи немного открыты для интерпретации.
Существуют различные персональные стили TDD, в основном из-за того, что принципы TDD открыты для интерпретации.
Я здесь не для того, чтобы говорить, что кто-то не прав, но я хотел бы поделиться с вами своими приемами и объяснить, как они хорошо мне послужили. Имейте в виду, что я программирую в течение 36 лет; мои навыки программирования очень хорошо развивались.
Повторное использование кода завышено. Повторно используйте код слишком много, и в результате вы получите плохую абстракцию, и вам будет очень трудно что-то исправить или изменить, не влияя на что-то другое. Очевидное преимущество - меньше кода для управления.
Повторение слишком большого количества кода приводит к проблемам с управлением кодом и основам кода слишком большого размера. Однако у него есть преимущество в разделении проблем (возможность настраивать, изменять и исправлять вещи, не затрагивая другие части приложения).
Не повторяйте / не изменяйте слишком много, не используйте слишком много. Код должен быть ремонтопригодным. Важно понимать и соблюдать баланс между повторным использованием кода и абстрагированием / разделением интересов.
Принимая решение о повторном использовании кода, я основываю решение на следующем: .... Изменится ли природа этого кода в контексте во всей кодовой базе приложения? Если ответ «нет», я использую его повторно. Если ответ «да» или я не уверен, я повторяю / реорганизую его. Однако я буду время от времени пересматривать свои кодовые базы и проверять, можно ли объединить любой из моих повторяющихся кодов без ущерба для разделения интересов / абстракции.
Что касается моих базовых навыков программирования, я хотел бы сначала написать условия (если затем переключить регистр и т. Д.); протестируйте их, затем заполните условия кодом и протестируйте снова. Имейте в виду, нет правила, что вы должны сделать это в модульном тесте. Я называю это вещью низкого уровня.
Как только мои низкоуровневые вещи будут выполнены, я либо повторно использую код, либо реорганизую его в другую часть приложения, но не после тщательного тестирования. Проблема с повторением / рефакторингом плохо протестированного кода заключается в том, что, если он сломан, его нужно исправить в нескольких местах.
BDD Для меня это естественное продолжение TDD. Как только моя кодовая база будет хорошо протестирована, я могу легко настроить поведение, перемещая целые блоки кода. Крутая вещь в моих привычках программирования заключается в том, что иногда я перемещаю код и обнаруживаю полезное поведение, которое я даже не предполагал. Иногда может даже оказаться полезным, чтобы ребрендинг казался совершенно другой базой кода.
С этой целью мои кодовые базы обычно начинаются немного медленнее и набирают обороты, потому что по мере продвижения к концу разработки у меня появляется все больше и больше кода для рефакторинга или повторного использования.
Преимущества для меня в том, как я кодирую, заключается в том, что я могу брать на себя очень высокие уровни сложности, поскольку этому способствует хорошее разделение интересов. Это также здорово для написания высоко оптимизированного кода. Тем не менее, хорошо оптимизированный код имеет тенденцию быть немного раздутым, но, насколько мне известно, нет способа написать оптимизированный код без небольшого вздутия. Если приложению не нужна высокая производительность процессора, ничто не остановит меня от взлома кода. Я придерживаюсь мнения, что код на стороне сервера должен быть оптимизирован, и большинству кода на стороне клиента обычно это не требуется.
Возвращаясь к теме тестирования фреймворков, я использую их, чтобы сэкономить немного времени компилятора.
КакЧто касается следующих рассказов, то это естественно для меня, даже не задумываясь об этом. Я заметил, что большинство разработчиков развиваются в естественном порядке раскадровки, даже когда они недоступны.
Как общая стратегия разделения интересов, в большинстве приложений я разделяю интересы на основе форм пользовательского интерфейса. Например, я буду повторно использовать код в форме и повторять / реорганизовывать формы. Это всего лишь универсальное правило. Бывают моменты, когда я должен мыслить нестандартно. Иногда повторяющийся код может быть полезен для повышения эффективности процессора кода.
Как небольшое дополнение к моим привычкам TDD; Я делаю оптимизации и отказоустойчивость в последнюю очередь. Я постараюсь по возможности избегать использования блоков try catch и писать свой код так, чтобы они не требовались. Например, вместо того, чтобы ловить ноль, я буду проверять на ноль, или вместо того, чтобы ловить индекс вне границ, я буду тщательно проверять свой код, чтобы он никогда не происходил. Я считаю, что перехват ошибок слишком рано при разработке приложения приводит к семантическим ошибкам (поведенческим ошибкам, которые не приводят к сбою приложения). Семантические ошибки могут быть очень трудно отследить или даже заметить.
Ну, это мои 10 центов. Надеюсь, это поможет.