Применение TDD, когда приложение на 100% CRUD - PullRequest
43 голосов
/ 09 мая 2009

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

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

Думал ли я об этом неправильно?

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

Ответы [ 9 ]

14 голосов
/ 09 мая 2009

«Единственная цель приложения - в основном получить список контактов»

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

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

Хорошо. Проверьте это. Правильные отображаются? Все есть?

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

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

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

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

6 голосов
/ 09 мая 2009

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

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

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

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

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

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

5 голосов
/ 14 мая 2009

Мне кажется, что мы путаем TDD с модульным тестированием.

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

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

В ответ на ваш сценарий я согласен с тем, что С.Лотт подразумевал, что вам нужен набор юнит-тестов для тестирования конкретных вариантов поведения в вашем приложении.

4 голосов
/ 26 января 2013

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

3 голосов
/ 09 мая 2009

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

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

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

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

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

2 голосов
/ 09 мая 2009

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

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

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

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

это просто идея ...

1 голос
/ 25 марта 2011

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

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

1 голос
/ 09 мая 2009

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

1 голос
/ 09 мая 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...