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

Применение TDD, когда приложение является 100% CRUD

Я регулярно сталкиваюсь с этой проблемой, и я не уверен, как преодолеть это препятствие. Я действительно хочу начать обучение и применять Test-Driven-Development (или BDD, или что-то еще), но похоже, что каждое приложение, которое я делаю, где я хочу применить, это в значительной степени только стандартная база данных CRUD, и я не уверен, как чтобы применить его. Объекты в значительной степени не делают ничего, кроме того, что они сохраняются в базе данных; нет сложной логики, которая должна быть проверена. Существует шлюз, который мне в конечном итоге нужно будет протестировать для сторонней службы, но я хочу сначала создать ядро ​​приложения.

Всякий раз, когда я пытаюсь писать тесты, я заканчиваю тестирование базовых материалов, которые, вероятно, я не должен тестировать в первую очередь (например, getters/seters), но это не похоже на то, что у объектов есть что-то еще. Наверное, я мог бы проверить настойчивость, но мне это никогда не кажется правильным, потому что вы не должны на самом деле нажимать на базу данных, но если вы издеваетесь над этим, вы действительно ничего не тестируете, потому что вы контролируете данные, которые плюют назад; например, я видел множество примеров, где есть макет репозитория, который имитирует базу данных путем циклирования и создания списка известных значений, а тест проверяет, что "репозиторий" может отбросить определенное значение... Я не видя точки такого теста, потому что, конечно, "репозиторий" собирается вернуть это значение; он жестко закодирован в классе! Ну, я вижу это с чистой точки зрения TDD (т.е. Вам нужно иметь тест, говорящий, что вашему репозиторию нужен метод GetCustomerByName или что-то еще, прежде чем вы сможете написать сам метод), но это похоже на следующую догму без каких-либо причин, кроме ее "путь" - тест, кажется, ничего полезного не делает, кроме оправдания метода.

Я думаю об этом неправильно?

Например, выполните запуск приложения управления контактами мельницы. У нас есть контакты и можно сказать, что мы можем отправлять сообщения контактам. Следовательно, мы имеем два объекта: Contact и Message, каждый из которых имеет общие свойства (например, имя, фамилия, адрес электронной почты для контакта и темы и тела и дата для сообщения). Если ни один из этих объектов не имеет какого-либо реального поведения или не должен выполнять какую-либо логику, тогда как вы применяете TDD при разработке приложения, подобного этому? Единственная цель приложения - в основном вытащить список контактов и отобразить их на странице, отобразить форму для отправки сообщения и т.п. Я не вижу здесь каких-либо полезных тестов - я мог бы подумать о некоторых тестах, но они были бы скорее испытаниями для того, чтобы сказать "Смотрите, у меня есть тесты!" вместо того, чтобы фактически тестировать какую-то логику (хотя Ruby on Rails хорошо ее использует, я не считаю, что проверка проверки является "полезным" тестом, потому что это должно быть что-то, о чем заботится рамка для вас)

4b9b3361

Ответ 1

"Единственная цель приложения - в основном вытащить список контактов"

Хорошо. Проверьте это. Что означает "тянуть"? Это звучит как "логика".

"отобразить их на странице"

Хорошо. Проверьте это. Правильно отображены? Что там?

"отобразить форму для отправки сообщения"

Хорошо. Проверьте это. Правильные поля? Проверки всех входных данных работают?

"и тому подобное."

Хорошо. Проверьте это. Выполняются ли запросы? Найдите правильные данные? Отобразить правильные данные? Проверить входные данные? Произвести правильные сообщения об ошибках для недопустимых входов?

Ответ 2

Я сейчас работаю над чистым CRUD-приложением Но я вижу много преимуществ Unit test случаев (примечание - я не сказал TDD)

Сначала пишу код, а затем тестовые примеры, но не слишком разрозненно, хотя

И я проверяю операции CRUD - постоянство базы данных.

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

Итак, IMHO - всегда есть преимущество тестирования TDD\Unit (независимо от того, как вы это называете, в зависимости от того, насколько экстремально вы это чувствуете) - даже для CRUD-приложения Вам просто нужно найти правильную стратегию для вашего приложения

Просто используйте здравый смысл.... и все будет хорошо.

Ответ 3

Я чувствую, что мы путаем TDD с Unit Testing.

Тестирование единиц - это специальные тесты, которые проверяют единицы поведения. Эти тесты часто включаются в сборку интеграции. S.Lott описал некоторые превосходные кандидаты только для тех типов тестов.

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

В ответ на ваш сценарий я согласен с тем, что подразумевал S.Lott, так это то, что вам нужно, это набор тестов Unit для тестирования определенных типов поведения в вашем приложении.

Ответ 4

Пропустите его. Все будет хорошо. Уверен, у вас есть крайний срок для встречи. (/Сарказм)

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

Если вы думаете, что проект продлится 2 недели, а затем никогда не будет вновь открыт, автоматическое тестирование, вероятно, пустая трата времени. В противном случае, если у вас есть заинтересованность в "владении" этим кодом в течение нескольких месяцев и его активном, выполните некоторые тесты. Используйте свое мнение о том, где наиболее опасен. Хуже того, если вы планируете быть с компанией в течение нескольких лет, и у вас есть другие товарищи по команде, которые сменяют друг друга на разные части системы, и это может быть ваша очередь снова через год, построить несколько тестов.

Не переделывайте это, но делайте "вставляйте в него несколько булавок", чтобы, если что-то начинает "перемещаться", у вас есть некоторые тревоги, чтобы привлечь внимание к вещам.

Большая часть моего тестирования - это тесты типа JUnit или пакетного типа "diff", а также рудиментарный инструмент типа скрепера для экрана, который я написал несколько лет назад (сценарий с некоторыми типами regex + wget/curl type). Я слышал, что Selenium должен быть хорошим инструментом для тестирования пользовательского интерфейса веб-приложений, но не пробовал. У кого-нибудь есть доступные инструменты для локальных приложений GUI???

Ответ 5

TDDing простое приложение CRUD, на мой взгляд, похоже на практику упражнений на гитаре - вы можете подумать, что скучно и утомительно, только чтобы узнать, насколько ваша игра улучшается. В сроках разработки - вы, вероятно, будете писать код, который менее связан - более проверяемый. Кроме того, вы, скорее всего, будете видеть вещи с точки зрения потребителя кода - вы действительно будете использовать его. Это может иметь много интересных побочных эффектов, таких как более интуитивные API, лучшее разделение проблем и т.д. Предполагается, что генераторы эшафотов могут выполнять базовый CRUD для вас, и у них есть место, особенно для прототипирования, однако они обычно привязаны к структуре. Почему бы не сосредоточиться на ключевом домене в первую очередь, отложив решения Framework/UI/Database до тех пор, пока у вас не будет лучшего представления о базовой функциональности - TDD также поможет вам в этом. В вашем примере: хотите ли вы, чтобы сообщения являлись очередью или иерархическим деревом и т.д.? Вы хотите, чтобы их загружали в реальном времени? Как насчет сортировки/поиска? вам нужно поддерживать JSON или просто html? гораздо легче увидеть эти вопросы с помощью BDD/TDD. Если вы делаете TDD, вы можете протестировать свою основную логику, даже не используя фреймворк (и ждать минуты, чтобы загрузить или запустить)

Ответ 6

Просто идея...

Возьмите требования к CRUD, используйте такие инструменты, как watij или watir или AutoIt для создания тестовых примеров. Начните создавать пользовательский интерфейс для прохождения тестовых примеров. После того, как вы установили UI и пропустили, возможно, только один тест, начните писать логический уровень для этого теста, а затем слой db.

Для большинства пользователей пользовательский интерфейс - это система. Не забудьте написать тестовые примеры для каждого нового слоя, который вы строите. Поэтому вместо того, чтобы начинать с db до app до уровня ui, начинайте в обратном направлении.

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

Это всего лишь идея...

Ответ 7

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

Поскольку вы упомянули Rails, я бы сказал, что выполнение стандартного теста create/read/update/delete является хорошей идеей для каждого свойства, особенно потому, что ваш тест должен учитывать разрешения (это, как мне кажется, огромно). Это также гарантирует, что ваши миграции будут работать так, как вы ожидали от них.

Ответ 8

Сейчас я работаю над CRUD-приложением. То, что я делаю на этом этапе, - это написать единичные тесты для моих объектов репозитория и проверить, что функции CRUD работают так, как должны. Я обнаружил, что по своей сути модуль также тестировал фактический код базы данных. Таким образом, мы нашли немало ошибок в коде базы данных. Поэтому я предлагаю вам продвигаться вперед и продолжать работу с модульными тестами. Я знаю, что применение TDD в приложениях CRUD не столь гламурно, как то, о чем вы могли бы прочитать в блогах или журналах, но оно служит своей цели, и вы будете намного лучше, когда будете работать над более сложным приложением.

Ответ 9

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

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