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


37

Я работаю с новой командой, которая исторически не проводила ЛЮБОГО модульного тестирования. Моя цель - чтобы команда в конечном итоге использовала TDD (Test Driven Development) в качестве естественного процесса. Но так как TDD - такой радикальный сдвиг для команды, не занимающейся модульным тестированием, я подумал, что начну с написания модульных тестов после написания кода.

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

РЕДАКТИРОВАТЬ

Просто для пояснения, в команде нет никого (кроме меня), который бы имел ЛЮБОЕ тестирование экспозиции / опыта. И мы планируем использовать функциональность модульного тестирования, встроенную в Visual Studio.


+1 Этот вопрос описывает почти точно ситуацию, в которой я нахожусь, только для Eclipse PHP Dev вместо VS.
canadiancreed

Неподходящий вопрос для этого форума
Райан

2
Что ты в итоге делал? Очень бы хотелось услышать, как это получилось.
Снуп

Ответы:


36

Практика на существующие ошибки / дефекты.

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

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

  1. ожидаемое предусловие и постусловие
  2. результат, который в настоящее время не соответствует ожидаемому и нарушает это предварительное условие / постусловие

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

Я думаю, что хитрость заключается в том, чтобы дать им что-то, чтобы практиковаться там, где есть четкие методы до / после условий. Если требования к методам нечеткие, даже опытным специалистам по TDD трудно точно знать, с чего начать. Сделайте шаг за шагом, и вы получите там. Удачи!


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

написать тест на ошибку, это хороший совет.
Амитабха

32

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

  1. Объясни, объясни, объясни. Вы не хотите, чтобы ваша команда писала тесты. Вы хотите, чтобы ваша команда захотела написать тесты. Это означает, что они должны полностью понимать, почему они должны это делать, каковы преимущества и как это значительно облегчит их работу. Красный, Зеленый, Рефакторинг , написание регрессионного теста в качестве доказательства исправления ошибки и т. Д. Вы должны убедить их, что все имеет смысл, прежде чем просить их написать какой-либо код.

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

  3. Начните с регрессионных тестов. Это довольно просто понять, и они дают мгновенное удовлетворение. Конечно, это предполагает, что код правильно модульный и легко тестируемый. Если нет, пропустите этот шаг.

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

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

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

Некоторые другие важные моменты:

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

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

  • Настройте некоторое программное обеспечение для непрерывной интеграции, чтобы сразу же найти поврежденные тесты


1
Вероятно, наиболее важным является получение управления на борту.
Тодд

18

Один из способов освоиться с TDD - это сначала написать интеграционные тесты. Представьте тестовые швы и истинные юнит-тесты позже.

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

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


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

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

3

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

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


3

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


2

Из опыта JUnit я перешел прямо к TDD, и этот опыт сделал ценность TDD безошибочно очевидной. Я стал настолько благодарен за юнит-тесты, что быстро стал евангелистом за подход


0

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.