Я делаю это правильно? Если не то, что именно я должен изменить
Это трудно сказать, из этого краткого описания, но я подозреваю , что, нет, вы не делаете это правильно. Примечание: я не говорю, что то, что вы делаете, не работает или в некотором смысле плохо, но вы не делаете TDD. Середина «D» означает «управляемый», тесты управляют всем, процессом разработки, кодом, дизайном, архитектурой, всем .
Тесты показывают, что написать, когда написать, что написать дальше, когда прекратить писать. Они говорят вам дизайн и архитектуру. (Дизайн и архитектура возникают из кода посредством рефакторинга.) TDD не о тестировании. Речь идет даже не о написании тестов в первую очередь: TDD - это то, чтобы позволить тестам управлять вами, а писать их сначала - это просто необходимая предпосылка для этого.
Неважно, действительно ли вы пишете код или полностью его уточняете: вы пишете (скелеты) код в своей голове, а затем пишете тесты для этого кода. Это не TDD.
Отбросить эту привычку сложно . Действительно, очень сложно. Это кажется особенно трудным для опытных программистов.
Кейт Брейтуэйт создал упражнение, которое он называет TDD, как будто вы это имели в виду . Он состоит из набора правил (основанных на Трех правилах TDD дяди Боба Мартина , но гораздо более строгих), которым вы должны строго следовать и которые направлены на то, чтобы направить вас к более строгому применению TDD. Лучше всего работает с парным программированием (чтобы ваша пара могла убедиться, что вы не нарушаете правила) и с инструктором.
Правила таковы:
- Напишите ровно один новый тест, наименьший из возможных тестов, который, кажется, указывает на решение.
- Увидеть это не удастся; ошибки компиляции считаются ошибками
- Выполните тест из (1), написав наименьший код реализации, который вы можете использовать в методе test .
- Рефакторинг для устранения дублирования, а также по мере необходимости для улучшения дизайна. Будьте строги в использовании этих ходов:
- вам нужен новый метод - дождитесь времени рефакторинга, затем ... создайте новые (не тестовые) методы, выполнив один из них, и никак иначе:
- предпочтительнее: сделать метод извлечения для кода реализации, созданного в соответствии с (3), чтобы создать новый метод в тестовом классе, или
- если вы должны: переместить код реализации согласно (3) в существующий метод реализации
- Вы хотите новый класс - подождите до времени рефакторинга, затем ... создайте не тестовые классы, чтобы предоставить место назначения для метода Move и ни по какой другой причине
- заполнить классы реализации методами, выполнив Move Method, и никак иначе
Как правило, это приводит к совершенно другим проектам, чем часто практикуемый «метод псевдо-TDD»: «воображать в голове, каким должен быть проект, а затем писать тесты для форсирования этого проекта, реализовывать проект, который вы уже представляли, прежде чем писать свой». тесты».
Когда группа людей реализует что-то вроде игры в крестики-нолики с использованием псевдо-TDD, они, как правило, получают очень похожие конструкции, включающие в себя некоторый Board
класс с массивом 3 × 3 Integer
. И, по крайней мере, часть программистов фактически написала этот класс без тестов для него, потому что они «знают, что им это понадобится» или «нужно что-то, чтобы написать свои тесты». Однако, когда вы заставляете ту же группу применять TDD, как если бы вы это имели в виду, они часто оказываются в широком разнообразии совершенно разных конструкций, часто не используя ничего, даже отдаленно похожего на a Board
.
Есть ли способ определить, достаточно ли написанного вами теста?
Когда они охватывают все бизнес-требования. Тесты являются кодировкой системных требований.
Является ли хорошей практикой написание теста для очень простой функциональности, которая может быть эквивалентна 1 + 1 = 2, или это просто переигровка?
Опять же, у вас все наоборот: вы не пишете тесты на функциональность. Вы пишете функциональность для тестов. Если функциональность для прохождения теста окажется тривиальной, это здорово! Вы только что выполнили требование системы и даже не должны работать для этого!
Это хорошо, чтобы изменить функциональность и, соответственно, проверить, если требования изменяются?
Нет, наоборот. Если требование изменяется, вы меняете тест, соответствующий этому требованию, наблюдаете, как он проваливается, затем меняете код, чтобы он прошел. Тесты всегда на первом месте.
Это трудно сделать. Вам нужны десятки, может быть, сотни часов преднамеренной практики , чтобы создать своего рода «мышечную память», чтобы достичь точки, когда, когда наступает крайний срок, и вы находитесь под давлением, вам даже не нужно думать об этом. и это становится самым быстрым и естественным способом работы.