Хабрахабр

[Перевод] Тестирование не для начинающих

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

Но несмотря на всю мою любовь к тестированию, я не рекомендую его новичкам.

В этой статье я собираюсь пояснить свою точку зрения более детально, но весь смысл, в итоге, сводится к двум пунктам: Звучит дико, правда?

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

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

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

Начинающим не хватает знаний чтобы писать что-либо кроме самых простых тестов

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

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

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

Наверняка вы увидите бизнес-логику в представлениях и тонны логических пробок в контроллерах. Rails-приложение?

Не удивлюсь, если ВСЯ логика будет в одном единственном php-файле — парсинг форм, взаимодействие с БД и т. Веб-приложение на PHP? д.

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

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

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

func Add(a, b int) int { return a+b
} // And a test...
func TestAdd(t *testing.T)
}

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

Мы пытаемся объяснить, что такое dependency injection, почему глобальные переменные усложняют тестирование, как time. В конце концов это приводит к тому, что мы начинаем учить их большему. И в этом месте я начинаю беспокоиться, ведь мы больше не учим начинающего как писать код. Now() может затруднить проверку пограничных случаев. И это приводит меня ко второму пункту… В этот момент мы учим его и как писать код И КАК ТЕСТИРОВАТЬ одновременно.

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

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

Если вы были похожи на меня, ваше первое веб-приложение могло бы выглядеть примерно так:

<p> <?php // This may not work. I don't know PHP anymore. $name = $_GET['name']; echo "Hello, " . $name; ?>
</p>

Произведение искусства, не так ли?

И вы должны использовать React. А теперь представьте, что вы только что написали этот код в первый раз и кто-то говорит вам, что вы должны его тестировать. О, и вам не помешало бы настроить базу данных и, возможно, GraphQL чтобы работать с ней. И фреймворк.

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

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

Как работают заголовки. Как будто мы забыли, как мы шаг за шагом изучали, как работают HTTP запросы. Формы. Куки. И всему этому мы учились старым добрым методом проб и ошибок. Как работает POST-запрос на сервер — или даже что ВООБЩЕ СУЩЕСТВУЮТ разные HTTP-методы.

Я не знаю на самом деле, как это произошло, но, подозреваю, отчасти проблема заключается в том, что мы не даём себе труда задуматься, чего будет стоить изучение всего этого. На самом деле я не думаю, что во всем виноваты тесты, реальная проблема в том, что мы свято верим — вы должны учиться программированию, тестированию, сайтостроению и миллиону других вещей одновременно. Новичок спрашивает “что мне изучать?” и мы начинаем “учи тестирование, react, graphql и go, но используй только стандартную библиотеку…”

Просто остановитесь. Нет, нет, и ещё раз нет.

Если вы захотите научить кого-либо играть в футбол, вы же начнёте с основ вроде распасовки и ведения мяча. Это смешно, поскольку в других условиях нелепость такого подхода очевидна. Так какого чёрта мы поступаем так с новичками в программировании? Вы же не начнёте с того, что скажете “Вот, как это делают профессионалы”, включите видео с Рональдо и уйдёте.

Ситуацию усугубляет то, что начинающие разработчики, попадая в эту ловушку, чувствуют себя дерьмом из-за того, что застряли. Мы пытаемся оправдаться, говоря “ну они конечно же понимают, что невозможно выучить всё это одновременно”, но они не понимают! Им кажется, что у них просто нет чего-то, что нужно чтобы стать разработчиком и это позор для нас с вами, потому что многие из них полюбили бы программирование, не врежься они в эту кирпичную стену.

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

Но что, если я хочу научиться тестировать ?! (и миллион других «что если»)

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

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

С ментором вы можете изучать много вещей одновременно и успешно выдерживать эту нагрузку, поскольку у вас есть тот, кто проведёт вас через всё это. Это также не означает, что вы не можете учиться во время парного программирования или чего-либо вроде того. В следующий раз попробуй вместо этого X и Y!”. В этой ситуации если вы потеряетесь, то не попадёте в тупик и не будете чувствовать себя неудачником, поскольку рядом будет тот, кто скажет “Ты отлично справляешься, просто это слишком сложно пока. Проще говоря, в этом сценарии растеряться, разочароваться и бросить всё вам не грозит.

Показать больше

Похожие публикации

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»