2008-11-23 2 views
6

У меня есть проект, где я использую TDD и модульные тесты как «программные визы». В сущности, я переводил требования в те тесты, которые проверяли, соответствует ли код требованиям. Мне редко приходится возвращаться и редактировать модульные тесты, что скорее является точкой: нужно изменить только «реальный» код. На данный момент существует 900 единичных тестов.Как вы адаптировали свои модульные тесты для решения меняющихся требований?

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

ответ

2

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

Любая конкретная причина, почему вы так думаете? Я чувствую некоторый страх или это просто «не ломаю его, когда его работа»

Изменения происходят. В этом случае это означает больше трудозатрат. Если у бизнеса нет проблем с этим, вы тоже не должны (если расписание не бесчеловечно :). Если спецификация изменилась,

  • убедитесь, что рабочая версия была проверена в.
  • Повторите шаг 1 просто чтобы быть уверенным.
  • сканируйте свой тестовый набор. Найдите те, которые нужно вынуть. Найдите те, которые нужно изменить. Найдите новые тесты, которые вам нужно понять. Используйте чистый лист бумаги, чтобы делать заметки.
  • Теперь выполните один тест за раз. Если вы не выполняли принцип DRY/Once и only once, любые изменения, которые вам нужно сделать, должны быть в одном месте. Если нет, то вы должны быть переработан раньше .. но это не слишком поздно .. извлечь код в одном месте перед изменением
  • Повторите предыдущий шаг до сделать
5

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

С другой стороны: acceptance-tests справляется с требованиями на уровне приложений. Поэтому я думаю, вы говорите о приемочных испытаниях.

Я бы добавил новые требования в качестве нового приемочного испытания. Но для старых вы должны просмотреть их, как они недействительны измененными требованиями.

+0

изменение приемочного испытания «может» привести к лавине изменений единичного испытания за его реализацией. Я думаю, это то, к чему стремится ОП. – Gishu 2008-11-25 09:08:39

4

Я бы добавил новые тесты и пропустил их. Затем вы посмотрите, какие тесты были нарушены в результате. Если вы считаете, что старые тесты противоречат новым тестам, вам, возможно, придется удалить старые тесты. В противном случае вы измените код, чтобы старые тесты прошли.

2

По сути я перевожу требования в тесты, которые проверяют, что код соответствует требованиям

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

Или они тестируют что-то, что не соответствует требованиям заказчика.

Как сообщается, Джон Мейнард Кейнс сказал: «Когда факты меняются, я меняю свое мнение. Что вы делаете, сэр?»

Я думаю, что здесь есть аналог. Ваши факты были изменены для вас

0

У меня есть два ответа на ваш вопрос, один философский и другой тактический.

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

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

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

  1. тест, который фактически подтверждает, что поведение
  2. Места, что поведение используется в общий арматуре код

Возможно, эта статья вам полезна: Grow Your Harness Naturally. Это было действительно о многоразовой испытательной веревке для функционального тестирования, но я нахожу идеи очень полезными и в своих модульных тестах.

1

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

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

Затем изменить исходный код так что переписанные тесты теперь проходят.

Смежные вопросы