Возможно ли внедрение тестового развития (TDD) в зрелом проекте?

  • Скажем, мы слишком поздно осознали значение TDD. Проект уже созрел, многие клиенты начали его использовать.
  • Говорят, что используемое автоматическое тестирование - это в основном функциональное/системное тестирование, и есть много автоматизированного тестирования графического интерфейса.
  • Скажем, у нас есть новые запросы функций и новые отчеты об ошибках (!). Так много развития продолжается.
  • Заметьте, что уже было бы много бизнес-объектов без тестирования или небольшого тестирования.
  • Слишком много сотрудничества/отношений между ними, которые снова проверяются только посредством тестирования уровня/системы более высокого уровня. Нет интеграционного тестирования как такового.
  • Большие базы данных на месте с большим количеством таблиц, представлений и т.д. Просто для создания экземпляра единого бизнес-объекта уже идет большое количество транзакций по базам данных.

Как мы можем ввести TDD на этом этапе?

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

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

Ответ 1

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

Se также Michael Feathers отличная книга Эффективно работая с устаревшим кодом, ее необходимо прочитать для всех, кто думает о внедрении TDD в устаревшую базу кода.

Ответ 2

Я думаю, что вполне возможно ввести TDD в существующее приложение, на самом деле я недавно сделал это сам.

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

Если у вас есть ошибка, напишите unit test, чтобы воспроизвести его, рефакторинг кода при необходимости (если только это не стоит того).

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

В заключение, начните с малого, и ваш проект станет все более и более зараженным.

Ответ 3

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

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

Просто начните работу над вашими новыми требованиями/исправлениями ошибок с TDD. Помните, что будут накладные расходы, связанные с переключением методологии (убедитесь, что ваши клиенты знают об этом!) И, вероятно, ожидают значительного нежелания членов команды, которые привыкли к "старым старым путям".

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

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

Ответ 4

Один инструмент, который может помочь вам протестировать устаревший код (при условии, что у вас не будет времени на его реорганизацию, это Typemock Isolator: Typemock.com Он позволяет вводить зависимости в существующий код без необходимости извлекать интерфейсы и т.д., Потому что он не использует стандартные методы отражения (динамический прокси и т.д.), Но вместо этого использует API-интерфейсы профилировщика. Он использовался для тестирования приложений, которые полагаются на sharepoint, HTTPContext и другие проблемные области. Я рекомендую вам взглянуть. (Я работаю в качестве разработчика в этой компании, но это единственный инструмент, который не заставляет вас реорганизовывать существующий устаревший код, экономя ваше время и деньги) Я также настоятельно рекомендую "Эффективно работать с устаревшим кодом" для получения дополнительных приемов.

Рой

Ответ 5

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

Вы также можете начать с более высоких приемочных тестов и проделать свой путь оттуда (посмотрите Fitnesse для этого).

Ответ 6

Я бы начал с некоторых базовых тестов интеграции. Это позволит получить бай-ин от остальных сотрудников. Затем начните разделять части кода, у которых есть зависимости. Поработайте над тем, чтобы использовать Dependency Injection, так как это сделает ваш код намного более проверенным. Относитесь к ошибкам как к возможности писать тестовый код.