Наблюдение за культурой тестирования Test Driven Development

1656667957 nablyudenie za kulturoj testirovaniya test driven development

Даг Аркури

QtopxlaZ1bJ4mXtv1XCEYFgocKr9EL8xxnmh
Дань «фиолетовым» проводам, установленным инженерами IBM десятилетия назад. Они действительно были желтыми.

Это не учебник по тестированию разработки. Он содержит мои личные наблюдения по восстановлению дисциплины и проблеме ремесла модульного тестирования.

Кент Бек, лидер разработки ПО, также является современным изобретателем тестовой разработки (TDD). Кент также был соавтором JUnit, широко используемой системы тестирования, вместе с Эрихом Гаммой.

В своей книге XP Explained (второе издание) Кент описывает, что на пересечении значение и практики форму принципы. Когда мы повторяем концепцию и подключаем то, во что мы верим как формулу, мы достигаем трансформации.

[KISS, Quality, YAGNI, ...] + [Testing, Specs, ...] == [TDD, ...]

Я глубоко уважаю творчество Кента не только из-за его блестящих разработок программного обеспечения, но и из-за его постоянного исследования. доверие, мужество, обратная связь, простота и уязвимость. Все атрибуты имеют первостепенное значение для изобретения экстремального программирования (XP).

TDD – это принцип и a дисциплинированность за которым следует сообщество XP. Дисциплина существует девятнадцать лет.

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

TDD, исследование и профессионализм

Девятнадцать лет назад TDD все еще обсуждается как дисциплина в сообществе разработчиков.

Первый вопрос, который задал бы аналитик: «Сколько или какой процент специалистов по программному обеспечению сегодня используют TDD?» Если бы вы спросили друга Роберта Мартина (дядя Боба), друга Кента Бэка, ответ был бы стопроцентным. Это потому, что дядя Боб считает, что невозможно считать профессионалом, если не практикуется разработка, управляемая тестированием. [1]

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

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

Реальность ситуации такова, что мы на самом деле Не знаю, поскольку практический процент не был широко изучен. Единственное конкретное измерение, которое мы имеем – это небольшая коллекция компаний, собранная в WeDoTDD. Здесь есть отслеживание таких компаний. Собеседования проводятся с практикующими 100% времени, но этот список невелик. Он также неполный, поскольку простой поиск показывает, что другие крупные магазины работают, но возможно не на полную мощность.

Если мы не знаем, сколько практикующих, следующий вопрос: «Насколько эффективен TDD на основе измеряемых преимуществ?»

Вам будет приятно узнать, что в течение многих лет проводились исследования, доказавшие эффективность TDD. Это включает хорошо признанные отчеты от Microsoft, IBM, Университета Северной Каролины и Университета Хельсинки.

SxfOzMZHoqcB8MJ51eU97aeXKATgYWYxG7Ms
Эффектный визуал из отчета Хельсинки.

Эти отчеты доказывают, что плотность дефектов уменьшается на 40-60% в обмен на увеличение усилий и времени выполнения на 15-35%. Эти цифры начали озвучивать книги и новые отраслевые процессы, такие как сообщество DevOps.

После наполовину ответа на эти вопросы окончательный вопрос звучит так: «Чего мне ожидать, когда я начну выполнять TDD?» Вам повезло, потому что я сформулировал собственные наблюдения по TDD. Давайте рассмотрим их дальше.

1. Команды TDD вербализации подхода

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

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

Подумайте, затем обсудите свои ближайшие шаги.

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

2. TDD управляет мышечной памятью

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

Мышечная память является ключом к тому, чтобы чувствовать хорошие настроения и становиться текущим. TDD требует этого из-за повторения исполнения.

Распечатайте шпаргалку для быстрого доступа. Учите столько ярлыков в IDE, сколько вам нужно, чтобы сделать ваши циклы эффективными. Затем продолжайте искать больше.

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

3. Команды TDD думают по крайней мере немного вперед

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

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

Ведите свой список тестов, как ястреб. Отмечайте предметы на ходу. Никогда не ездите без него. Думайте!

Формулировка списка может занять некоторое время и не является частью цикла. Однако его следует готовить непосредственно перед началом циклов. Если у вас его нет, вы не можете знать, куда идете. Всегда имейте карту.

// A Test List// "" -> does not validate// "a" -> does not validate// "aa" -> validates// "racecar" -> validates// "Racecar" -> validates// print the validation// have a blueberry ale

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

4. TDD требует общения с другими

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

Вождение без TDD приведет к введению ненужной сложности. Вождение с TDD в безжизненной бессмысленности так же опасно.

Говорите громко, если в списке тестов есть пробелы.

В TDD разработчик должен понимать, что строить на основе картины владельца требований (требований) и не больше. Если требование неясно в контексте, список тестов начнет разрушаться. Этот разрыв потребует разговора. Искренние обращения могут быстро превратиться в доверие и уважение. Короткие петли обратной связи установлены.

5. TDD требует итерационной архитектуры

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

Конечно, использовать тесты, управляющие всей архитектурой, глупо. Дядя Боб согласился с другими экспертами, что архитектура, управляемая тестами, — это «лошадь». [1] Нужна большая карта, но не слишком над распространёнными тестовыми списками, над которыми работают на местах.

Кент также отметил это много лет назад в книге TDD By Example. Параллелизм и безопасности это две основные сферы, где TDD не может управлять, и разработчик должен быть озабочен отдельно. В свободном переводе параллелизм через проектирование системы находится на другом уровне и над ним нужно работать итеративно и вместе с TDD. Это очень верно сегодня, поскольку некоторые архитектуры движутся к реактивным и реактивным расширениям, зениту параллельного строительства.

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

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

6: TDD выявляет слабость модульного тестирования и дегенеративную реализацию

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

К примеру, приведенное ниже решает все тесты вокруг гипотетического несовершенного палиндрома, требующего бизнес. Он был разработан с TDD.

// Not an imperfect palindrome.
@Testfun `Given "", then it does not validate`() {    "".validate().shouldBeFalse()}@Testfun `Given "a", then it does not validate`() {    "a".validate().shouldBeFalse()}@Testfun `Given "aa", then it validates`() {    "aa".validate().shouldBeTrue()}@Testfun `Given "abba", then it validates`() {    "abba".validate().shouldBeTrue()}@Testfun `Given "racecar", then it validates`() {    "racecar".validate().shouldBeTrue()}@Testfun `Given "Racecar", then it validates`() {    "Racecar".validate().shouldBeTrue()}

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

// Too generic of a solve based on tests provided
fun String.validate() = if (isEmpty() || length == 1) false else toLowerCase() == toLowerCase().reversed()
// Is the best implementation and solves all tests
fun String.validate() = length > 1

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

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

Имейте в виду, что модульные тесты ошибочны, но они необходимы. Поймите их силу и слабость. Тестирование на мутации может помочь устранить этот пробел.

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

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

7: TDD раскрывает цикл обратной связи завершения утверждения

Сделайте еще шаг вспять. Для следующих двух явлений мы посетим удивительные повторы. Для первого раза давайте быстро взглянем на FizzBuzz. Вот наш перечень тестов.

// Print numbers 9 to 15. [OK]// For numbers divisible by 3, print Fizz instead of the number.// ...

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

@Testfun `Given numbers, replace those divisible by 3 with "Fizz"`() {    val machine = FizzBuzz()    assertEquals(machine.print(), "?")}class FizzBuzz {    fun print(): String {        var output = ""        for (i in 9..15) {            output += if (i % 3 == 0) {                "Fizz "            } else "${i} "        }        return output.trim()    }}
Expected <Fizz 10 11 Fizz 13 14 Fizz>, actual <?>.

Естественно, если мы дублируем ожидаемые данные утверждения в assertEqualsон добивается результата и тест проходит.

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

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

8: TDD раскрывает предпосылку приоритета трансформации

В TDD можно попасть в ловушку. Бывают ситуации, когда разработчик может быть запутан трансформациями, применяемыми для реализации. В какой-то момент код тестирования становится узким местом для продвижения вперед. Ан тупик формы. Разработчик должен отступить и разоружиться, удалив часть тестов, чтобы выбраться из дыры. Разработчик становится разоблаченным.

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

ABgDg1ObAdd7zqhYFkN0shypQX89fqaAC9AP
Порядок преобразований. Всегда следует отдавать предпочтение самому простому (верх списка).

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

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

Распечатайте список TPP и положите его на свой стол. Ссылайтесь на него во время движения во избежание тупиков. Принимайте порядок простоты.

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

TDD начал работу?

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

Причина 1: отсутствие контакта с реальной культурой тестирования

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

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

Тем, кто прошел культуру тестирования, как мне, удалось иметь такие наблюдения. Мы можем применить опыт для будущих проектов.

Причина 2: непонятные образовательные ресурсы

Некоторые пытались написать книги по этой теме, такие как xUnit Patterns и Effective Unit Testing. Однако, кажется, нет места, которое бы четко определяло, что и зачем тестировать. Большинство доступных ресурсов четко не описывают мастерство утверждения и проверки.

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

Причина 3: отсутствие внимания в университетах

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

Причина 4: Нужна карьера, полная испытаний

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

Большинство просто хочет, чтобы все работало, достигая только половины того, что сказал Кент Бек: «Сначала заставьте все работать, а затем исправляйте». Я понимаю, что заставить все работать – это само по себе сложное сражение.

Тестирование так же трудно делать хорошо, так что давайте завершим это мнение.

Вывод

Предложение Кента в XP содержало простую формулировку инстинкт, мнениеи опыт. Эти три уровня являются ступеньками к качеству измеряемого исполнения a порог. Это отличная модель для объяснения проблемы с TDD.

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

I3qtB4KmCS9URHBFHSyqTTyilaoBmrf6-3Lk
От XP Explained. Сначала о качестве дизайна, представьте более высокую пороговую линию.

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

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

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

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

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

@Testfun `Given software, when we build, then we expect tests`() {    build(software) shoudHave tests}

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

Вдохновением для этой публикации стал Дэнни Пройслер. Когда я снова изучаю эту дисциплину, он начал проводить комплексные семинары по Android TDD. Посмотрите его недавнее бревно здесь.

[1] Джим Коплиен и Боб Мартин дебатируют TDD

Добавить комментарий

Ваш адрес email не будет опубликован.