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>