HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>В какой момент лучше писать тесты? Вообще, существует три подхода. Можно писать тесты:</p>
1 <p>В какой момент лучше писать тесты? Вообще, существует три подхода. Можно писать тесты:</p>
2 <ul><li>После кода</li>
2 <ul><li>После кода</li>
3 <li>Вместе с кодом</li>
3 <li>Вместе с кодом</li>
4 <li>До кода</li>
4 <li>До кода</li>
5 </ul><p>В некоторых ситуациях, особого выбора нет. Например, при системном тестировании тест имитирует поведение пользователей и выполняет действия в браузере - такие тесты можно писать только после кода.</p>
5 </ul><p>В некоторых ситуациях, особого выбора нет. Например, при системном тестировании тест имитирует поведение пользователей и выполняет действия в браузере - такие тесты можно писать только после кода.</p>
6 <p>В интеграционных, модульных и других низкоуровневых тестах обычно можно выбирать из вариантов, описанных выше. Считается, что писать тесты после кода - это наименее полезный подход. Разберемся, почему так.</p>
6 <p>В интеграционных, модульных и других низкоуровневых тестах обычно можно выбирать из вариантов, описанных выше. Считается, что писать тесты после кода - это наименее полезный подход. Разберемся, почему так.</p>
7 <p>Когда мы пишем код, его нужно постоянно запускать и проверять. Например, в самых простых учебных задачах этот запуск происходит довольно быстро:</p>
7 <p>Когда мы пишем код, его нужно постоянно запускать и проверять. Например, в самых простых учебных задачах этот запуск происходит довольно быстро:</p>
8 <p>В реальном коде подготовка данных для проверки кода может занимать минуты и десятки минут. С другой стороны, результатом работы проверяемого кода может быть что-то сложное - например, множество записей в базе данных или вывод определенной непростой структуры. Тогда каждый запуск кода на проверку превращается в целое приключение:</p>
8 <p>В реальном коде подготовка данных для проверки кода может занимать минуты и десятки минут. С другой стороны, результатом работы проверяемого кода может быть что-то сложное - например, множество записей в базе данных или вывод определенной непростой структуры. Тогда каждый запуск кода на проверку превращается в целое приключение:</p>
9 <p>Именно здесь на сцену выходит написание тестов до кода. У многих начинающих разработчиков эта фраза вызывает ступор - как можно тестировать то, чего нет?</p>
9 <p>Именно здесь на сцену выходит написание тестов до кода. У многих начинающих разработчиков эта фраза вызывает ступор - как можно тестировать то, чего нет?</p>
10 <p>Обсудим подробнее, как это происходит. Допустим, мы хотим написать функцию, которая может повторять переданную строчку указанное количество раз:</p>
10 <p>Обсудим подробнее, как это происходит. Допустим, мы хотим написать функцию, которая может повторять переданную строчку указанное количество раз:</p>
11 <p>Мы знаем, что функция принимает на вход и какой у нее должен быть выход (благодаря тому, что эта функция<a>чистая</a>). Можем ли мы уже написать тесты? Конечно:</p>
11 <p>Мы знаем, что функция принимает на вход и какой у нее должен быть выход (благодаря тому, что эта функция<a>чистая</a>). Можем ли мы уже написать тесты? Конечно:</p>
12 <p>Опытный разработчик напишет такой тест секунд за 15. Теперь для проверки работы этого кода достаточно набрать phpunit в консоли.</p>
12 <p>Опытный разработчик напишет такой тест секунд за 15. Теперь для проверки работы этого кода достаточно набрать phpunit в консоли.</p>
13 <p>У тестирования до написания кода есть еще одно мощное преимущество. Оно заставляет программиста сосредоточиться на том, как построено его решение и как его будут использовать. При таком подходе мы не думаем, будет ли это выглядеть красиво внутри. Так получаются грамотные интерфейсы.</p>
13 <p>У тестирования до написания кода есть еще одно мощное преимущество. Оно заставляет программиста сосредоточиться на том, как построено его решение и как его будут использовать. При таком подходе мы не думаем, будет ли это выглядеть красиво внутри. Так получаются грамотные интерфейсы.</p>
14 <p>В мире разработки написание тестов до кода называют<strong>TDD</strong>(<em>Test-Driven Development</em>):</p>
14 <p>В мире разработки написание тестов до кода называют<strong>TDD</strong>(<em>Test-Driven Development</em>):</p>
15 <p>По задумке TDD подразумевает, что вся разработка состоит из повторяющегося цикла:</p>
15 <p>По задумке TDD подразумевает, что вся разработка состоит из повторяющегося цикла:</p>
16 <ul><li>Мы пишем первый тест</li>
16 <ul><li>Мы пишем первый тест</li>
17 <li>Он не проходит</li>
17 <li>Он не проходит</li>
18 <li>Мы дописываем код, удовлетворяющий тесту</li>
18 <li>Мы дописываем код, удовлетворяющий тесту</li>
19 <li>Мы пишем второй тест</li>
19 <li>Мы пишем второй тест</li>
20 <li>И так далее</li>
20 <li>И так далее</li>
21 </ul><p>Так шаг за шагом строится приложение. Сейчас все по инерции продолжают говорить именно о таком способе. В нем тесты пишутся на все части кода с максимальной детализацией. С одной стороны, этот вид TDD ставит в приоритет дизайн. С другой стороны, он фокусируется на конкретных функциях и классах приложения вместо цельной картины. Но есть и другое TDD, где не принято писать тесты на внутренние части. Подробнее об этом вы можете почитать в статье в дополнительных материалах.</p>
21 </ul><p>Так шаг за шагом строится приложение. Сейчас все по инерции продолжают говорить именно о таком способе. В нем тесты пишутся на все части кода с максимальной детализацией. С одной стороны, этот вид TDD ставит в приоритет дизайн. С другой стороны, он фокусируется на конкретных функциях и классах приложения вместо цельной картины. Но есть и другое TDD, где не принято писать тесты на внутренние части. Подробнее об этом вы можете почитать в статье в дополнительных материалах.</p>
22 <p>Сам по себе Хекслет - это яркий пример того, как тесты пишутся до кода. Абсолютно во всех наших практиках на всех языках, тесты есть, а кода нет :)</p>
22 <p>Сам по себе Хекслет - это яркий пример того, как тесты пишутся до кода. Абсолютно во всех наших практиках на всех языках, тесты есть, а кода нет :)</p>