| Четыре фрейма тестирования, часть 6: разработка и тестирование фрактальны |
| 28.10.2025 00:00 | ||||||||
|
В предыдущей статье этой серии подробно описывалось тестирование через призму Намерения, Дисциплины, Тестируемости и Реализации: Заманчиво расположить эти фреймы, начиная с верхнего правого угла, и упорядочить их в аккуратную, линейную последовательность:
Говоря об этом, обычно имеют в виду нечто иное, однако можно рассматривать это как своего рода end-to-end тестирование. Большую часть времени люди вроде бы думают об end-to-end тестировании продукта или системы с точки зрения явного рабочего процесса, бизнес-процесса или транзакции. Когда мы принимаем за основу расширенное понятие продукта — то, к которому я постоянно возвращаюсь в этой серии (и собираюсь сделать это снова) — каждый продукт заслуживает определённого end-to-end (сквозного) тестирования как минимум по трём измерениям. Одно из этих измерений определяется ролью продукта в системе, частью которой он является. Например, для API-эндпоинта сквозное тестирование может начинаться с намерения выполнить задачу, набора предусловий для отправки запроса и данных, которые готовит какой-то человек или процесс; и завершаться тогда, когда ответ отправлен запросившему, транзакция зарегистрирована, а использованная в процессе память освобождена. Другое измерение сквозного тестирования связано с жизненным циклом продукта, функции или компонента: это намерения людей по отношению к продукту, усилия, вложенные в его создание, поддержка и тестирование после того, как продукт реализован — а возможно, и длительное время после этого. Тестирование и разработка — это нелинейные процессы.Джерри Вайнберг заметил, что любую линию можно принять за прямую, если рассматривать достаточно небольшой её участок. Это справедливо и в случае, если смотрящий находится очень далеко. Модель водопада — и V-модель, которая насильно впихивает туда тестирование — может быть очень привлекательной для тех, кто не слишком внимательно следит за тем, что происходит в процессе разработки программного обеспечения. Я только что упомянул «всю систему», но ещё раз (я же предупреждал, что сделаю это!) обратите внимание, что под «всей системой» или «готовым продуктом» не обязательно подразумевается полностью готовое, работающее программное приложение. Скорее, это наивысший уровень того, с чем мы сейчас работаем: завершённый компонент; полный документ с требованиями; сформированная идея; внятная идея, требующая дальнейшей доработки; пользовательская история; план спринта; однострочное исправление ошибки… Всё, что мы создаём или делаем, в любом масштабе и с любой степенью глубины, может быть протестировано сквозным образом. Разработка продукта, который будет создан и выпущен для пользователей, включает создание множества элементов, из которых он состоит и которые его поддерживают. Каждый полноценный продукт состоит из десятков, сотен других элементов, созданных людьми. Разработка программного обеспечения — это нелинейный процесс. Это даже не просто циклы — это фрактал, самоподобный как сверху вниз, так и снизу вверх. То же самое относится и к тестированию. Что бы мы ни создавали, писали или реализовывали, мы можем применять тестирование в рамках каждого из четырёх фреймов, на любом уровне и в любое время. Все, что создается людьми, можно тестировать на протяжении всего процесса через призму четырёх фреймов. Когда мы проектируем, создаём и тестируем функциональность, мы можем:
Вероятно, кто-то покритикует идею глубокого тестирования после разработки. Те, кто так думает, обычно предлагают два варианта решения:
На первый взгляд идея часто кажется неплохой, и при низком уровне риска и небольшом масштабе проекта такой подход может быть вполне подходящим решением. Тем не менее, стоит учитывать, что некоторые проблемы могут иметь серьёзные последствия, а откатиться может быть непросто. Конечно, откат к более старой версии кода при хорошем управлении версиями — относительно простая задача. Но время назад не вернешь. Достаточно серьёзный баг может привести к потере или повреждению данных, прервать работу пользователей, открыть дорогу уязвимости безопасности… Исправление таких последствий может быть трудоёмким и дорогостоящим. Но есть и третий вариант, который можно комбинировать с вышеописанными (особенно с вариантом 2):
Третий подход даёт возможность выполнять глубокое тестирование без прерывания работы разработчиков — что позволяет им уверенно двигаться вперёд. Если намерения ясны, разработчики дисциплинированы (активно выполняют тестирование в рамках Дисциплины) и практическая тестируемость высока, то глубокое тестирование может быть проведено эффективно, снижая риск того, что разработка чересчур опережает тестирование готовых версий продукта. Использование фреймов для оценки нашей работыСуществует ещё одно, более глубинное измерение тестирования — рефлексивное. Мы можем исследовать не только продукт, но и собственную работу. Приведу пример. Допустим, мы выполняем тестирование в рамках Намерения, анализируя набор пользовательских потребностей и желаний с целью создания диаграммы структурных элементов части продукта, чтобы затем реализовать продукт и разработать идеи для тестирования.
Пока что это может показаться ошеломляющим, но это необязательно так. Практически все эти вопросы можно рассмотреть и ответить на них мгновенно, параллельно с работой по созданию диаграммы, в той же самой рабочей сессии, в которой мы её создаём. Идея не в том, чтобы внедрять тяжёловесные процессы ревью. Напротив, идея в том, чтобы тренировать наш ум поднимать эти вопросы и непрерывно с ними работать по ходу дела. Воспитывая культуру вопросов, мы можем ускорить разработку, выявляя проблемы, которые в противном случае могли бы остаться незамеченными — и позже обернуться более высокими затратами. До сих пор в этой серии я в основном воздерживался от ответа на вопрос, кто именно занимается тестированием. Это тема для следующего выпуска. |