Понимание различий между "первым тестом" и "управляемым тестом"
У меня были разговоры на эту тему в прошлом, и я думаю, что мог бы знать ответ, но я не смог сформулировать это должным образом.
Вот что я думаю, я знаю:
Я подозреваю, что вы в первую очередь тестируете, а не управляемы тестами, если у вас уже есть идея о том, как все будет работать, прежде чем писать тесты, поэтому вы сначала пишете тесты, которые проверит вашу идею перед ее реализацией. Т.е. ваша идея реализации приходит первой и определяет, как выглядят тесты.
Если вы ориентированы на тестирование , то вы пытаетесь заставить тест управлять тем, как выглядит реализация. Вы пишете тест для некоторого поведения, которое вам нужно, а не для предвзятого представления о реализации, так что вам нужно придумать реализацию на стадии "рефакторинга", чтобы пройти тест хорошо.
Мои вопросы:
- Правильно ли я понял это?
- Как можно войти в образ мышления, основанного на тестировании, из образа мышления, основанного на тесте, когда большинство разработчиков естественным образом сразу начинают исследовать решения в своей голове, даже не обращаясь к клавиатуре?
4 ответа
Ключевым аспектом разработки через тестирование является то, что вы не реализуете функциональность, которая не требуется для прохождения теста. Test-first просто означает написание теста до того, как вы реализуете его функциональность. Это главным образом сделано, чтобы гарантировать, что тест фактически потерпит неудачу, если функциональность не присутствует. Разработка, основанная на тестировании, подразумевает подход, основанный на тестировании, но не наоборот.
Я думаю, что вы хорошо поняли и четко сформулировали различие между тестированием вначале и тестированием, и, как указывает Бьёрн, вся разработка, основанная на тестировании, обязательно сначала тестируется. На ваш вопрос о том, как перейти от тестового мышления к тестовому мышлению, я бы предложил несколько раз выполнить относительно простое упражнение (скажем, реализацию Range или Rectangle), пытаясь каждый раз достигать другой реализации. В первый раз вы придете к тому, о чем думаете прямо сейчас - и это не основано на тестировании, как вы указали. В следующий раз вы не сможете использовать то, о чем думаете; вам придется протянуть руку, чтобы придумать что-то другое, и некоторые из этих достижений произойдут в случае провала теста. Может быть, в третий раз вы начнете отказываться от своих предвзятых решений и просто будете делать то, что тест заставляет вас делать, - и вы на пути к тестовому мышлению.
Если упражнение вам не нравится, попробуйте просто написать свой первый тест раньше. Не делайте анализ заранее. Просто, взяв проблему, сначала напишите тест. Теперь вы можете подумать о проблеме с помощью теста "глядя через плечо". Какое-то время будет неудобно, но из дискомфорта должен появиться новый (и я думаю, хороший) взгляд на проблемы.
Разница заключается в обнаружении роли и интерфейса.
- Если вы пишете свои тесты до того, как пишете код, вы получаете значок Test-First.
- Если вы Test-First и слушаете свои тесты, чтобы выяснить, какие типы / роли / интерфейсы необходимы, и "развивать" свой дизайн с помощью JIT-рефакторинга, то вы получите значок Test-Driven.
С test-first вы, скорее всего, перейдете к дизайну (который может / не может быть самым простым / оптимальным выбором; зависит от ваших навыков) до того, как вы напишете тесты. Test-first также легко подает тесты на плохой существующий дизайн, однако прогресс будет медленным. Скорее всего, у вас будет сложный для тестирования код и тесты с медленной записью.
ИМХО Тест-ориентированный помогает мне писать более простые конструкции, которые легко тестировать.
Как войти в образ мыслей? Это та часть, где вам нужна самодисциплина и практика. Да, трудно удержаться от гонок к решениям. +1 к Карлу за указание сделать несколько код-кат в исследовательском режиме, сделать другой выбор и посмотреть, чем он закончится. С несколькими под твоим поясом становится легче... TDD фактически заставляет тебя "сосредотачиваться" на чем-то одном за раз.
Написание набора тестов перед реализацией позволяет вам создавать модульные тесты для открытых методов. Итак, реальная реализация происходящего скрыта от теста. Вы кодируете для абстрактной, а не реализации, которая является хорошей вещью (TM). Вы принимаете в абстрактных терминах и понятиях - тесты сформируют то, какими будут ваши публичные методы. Итак, тестирование означает, что ваши тесты будут управлять API. Обратное - это то, что вы называете test-first.