Как правильно создавать функции, тесты, истории и разбивать их - PullRequest
5 голосов
/ 18 июня 2010

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

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

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

Так что я тогда пытаюсь включить его, как этот общий пример От: Как математик идиот Когда я ввожу 2, нажмите добавить, введите 2, затем нажмите = Я хочу 4 вернулся.

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

А затем: Как бизнес-аналитик, обеспечивающий обработку всех заказов клиентов Когда пользователь отправляет электронный заказ, а информация о маршрутизации или учете не проверяется Я хочу, чтобы неверные данные учета и маршрутизации были введены в журнал и отправлены по электронной почте вместе с файлом заказа, прикрепленным к группе пользователей бизнес-аналитика. если проблема не в том, что не удалось связаться с базой данных для поиска информации о клиенте из-за проблем с сетью, введите в журнал «базу данных не удалось найти информацию о клиенте из-за проблем с сетью» в журнал и отправьте электронное письмо с сообщением об ошибке на список рассылки системного аналитика.

Тогда это начинает расширяться в нечто, что, я думаю, было бы совершенно неприемлемо: Как электронная проверка выполнения заказа Когда заказ получен Я хочу проверить, что файл x12 переведен в обычный файл, и если он не проходит проверку или журнал перевода, отправьте сообщение об ошибке по электронной почте. информация о заказе и статус извлекаются и загружаются в базу данных плоский файл отправляется в очередь на as400, а статус обновляется в базе данных as400 отправляет подтверждение, что они получили заказ, и статус обновляется в базе данных as400 отправляет подтверждение плоского файла и статус обновляется в базе данных подтверждение транслируется в x12, а статус обновляется в базе данных подтверждение x12 направляется соответствующим образом, и статус обновляется в базе данных подтверждение отправляется клиенту, а статус обновляется в базе данных если x12 содержит недопустимые данные, зарегистрируйте ошибку, отправьте электронное письмо и если плоский файл не извлечен из очереди в течение 2 минут, зарегистрируйте ошибку, отправьте электронное письмо и т. д. до степени x возможных сценариев ошибок.

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

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

Как вы определяете, когда / где и как разбить эти вещи и разделить их? Легко сказать, разбить их на наименьший кусок, который предлагает ценность для бизнеса, но когда вы не можете иметь один кусок без множества других частей, каков «реальный» ответ? Все это не вписывается в одну наклейку.

Я открыт для ответов, которые включают больше книг, учебных пособий, видео, но я думаю, если бы были какие-то приложения реального мира, которые учитывают эти типы вещей, которые придерживаются принципов гибкой и TDD, которые, вероятно, обеспечат наибольшую ценность? По общему признанию, я относительно новичок в этом, но я просмотрел книги Martin / Feathers / Osherove, я видел несколько катов по крестикам, боулингу, простым числам и т. Д., Но нет регистрации, нет сообщений об ошибках, нет такого рода «реального мира».


Позвольте мне попробовать что-нибудь еще.

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

Feature: Check for the presence of a summary file
  In order to verify all orders were sent through MQ from the mainframe
  a summary file must be found to determine the expected orders.

  Scenario: A summary file has not been sent
    Given a summary file does not exist
    When I check for the existence of a file
    Then I should sleep for 5 minutes

  Scenario: A summary file has been sent
    Given a summary file does exist
    When I check for the existence of a file
    Then I should validate the summary file

Feature: Validate the summary file
  In order to process a summary file
  summary file must be valid

  Scenario: A valid summary file exists
    Given a valid summary file
    When I validate the summary file
    Then I should upload the order details to the order details DB.

  Scenario: An invalid summary file exists
    Given a invalid summary file
    When I validate the summary file
    Then I should log the errors encountered
    And email the erroneous file to the analyst email group

Повторите это снова, заменив сводку на порядок. Вот что я придумал.

Ответы [ 3 ]

6 голосов
/ 19 июня 2010

Вы сбиваетесь с пути, думая, что: «... у вас не может быть одной фигуры без множества других фигур ...»

Разделение истории - это навык.Это требует практики, и это может быть трудно стать хорошим. Эта страница объясняет концепцию и дает ссылки на ресурсы о разделении историй.

Вот одна из ваших идей, которые у вас были проблемы с расставанием:

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

В этом абзаце я вижу как минимум 4 истории:

  1. Как BA, при сбое ввода заказаиз-за неверной информации об учетной записи и маршрутизации я хочу, чтобы информация об учетной записи и маршрутизации была отправлена ​​в группу ВА по электронной почте вместе с файлом заказа, чтобы кто-то знал, чтобы получить правильную информацию и повторно ввести заказ.

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

  3. Как BA, во время сбоя ввода заказа из-за "не удается связаться с базой данных", я хочу, чтобы сообщение об ошибке "база данных могланедоступно для поиска информации о клиенте из-за проблем с сетью », отправленных по электронной почте в список SA, чтобы можно было проанализировать и улучшить проблемы с базой данных / сетью.

  4. Как BA, при сбое ввода заказаиз-за «невозможно связаться с базой данных», я хочу, чтобы сообщение об ошибке «не удалось связаться с базой данных для поиска информации о клиенте из-за проблем с сетью», записанной в журнал, чтобы у нас была постоянная запись о проблемах с базой данных / сетью.

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

3 голосов
/ 18 июня 2010

Вы определенно не можете сразу перейти к своей самой продвинутой истории (перевод файла x12, yikes) - когда вы имеете дело с незрелой системой, вы должны разложить огромные сложные функции на понятные истории, которые вы можете оценить и представить в рамках.итерация.

Я начну с вашей второй пользовательской истории, которой, я надеюсь, будет достаточно:

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

Я бы начал с взлома этогодалее в двух пользовательских историях:

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

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

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

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

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

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

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

2 голосов
/ 23 июня 2010

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

Разбивка видений на особенности, истории, сценарии и код:

http://www.infoq.com/articles/pulling-power

Разделение историй:

http://lizkeogh.com/2008/09/11/splitting-up-stories/

Обработка технических историй (ведение журнала и т. Д.):

http://lizkeogh.com/2008/09/10/feature-injection-and-handling-technical-stories/

Все отзывы приветствуются.

...