История автоматизированного тестирования

Подпишитесь на наш ТЕЛЕГРАМ КАНАЛ ПО АВТОМАТИЗАЦИИ ТЕСТИРОВАНИЯ

Сегодня автоматизированное тестирование воспринимается неотъемлеммой частью процесса разработки программ, но так было не всегда. Оно зародилось в условиях ограниченных ресурсов мейнфреймов 50-х годов. История тестирования во многом отражает развитие всего ПО.

Ранние годы

До спринтов и DevOps тестирование выполнялось вручную. Вычислительные мощности были дефицитом, а память использовалась только для «важных» задач, к которым тесты не относились.

Разработка велась на централизованных системах, которыми пользовались сразу несколько команд. Машинное время бронировали заранее, и каждая секунда была на счету, поэтому тестирование считалось роскошью.

Некоторая автоматизация существовала, но в основном в крупных компаниях, которые могли позволить себе собственные инструменты. О модульных тестах знали лишь в научных кругах и отдельных больших корпорациях, но стандартов и широкого применения не было — тестирование носило разовый, неформальный характер.

Неправильно понятая «водопадная» модель

В 1970 году инженер Уинстон Ройс опубликовал статью «Управление разработкой больших программных систем» (Managing the Development of Large Software Systems.) В ней он описал последовательную схему разработки: анализ → проектирование → реализация → тестирование → внедрение.

Однако Ройс не продвигал жёсткий линейный подход, а критиковал его. Он предупреждал, что отложенное тестирование ведёт к позднему обнаружению ошибок и дорогой переделке. Рекомендовал итеративную разработку, например, сначала сделать прототип, а потом финальный продукт.

Схема "водопада": системные требования - программные требования - анализ - проектирование программы - кодинг - тестирование - внедрение.

Но большинство читателей запомнило лишь диаграмму на второй странице, проигнорировав предупреждения. Так «водопад» на десятилетия стал мнимым стандартом, хотя изначально был предостережением.

Скриншот статьи Ройса. Красным подчеркнуто, что описанная реализация связана с рисками и возможностью падения системы.

Ройс пошёл дальше, предложив более итеративный подход к разработке. Он рекомендовал пройти процесс дважды: сначала в меньшем масштабе для создания прототипа, а затем для создания финального продукта. Ирония в том, что немногие прочли его работу целиком. Большинство просто увидели диаграмму на второй странице, проигнорировали предупреждения и приняли линейную модель за лучший практический стандарт. Десятилетиями команды следовали этому плану, считая его проверенным и эффективным, хотя на самом деле это было предупреждение.

Схема, предложенная Ройсом вместо "водопада", с более итеративным подходом.

Появление Agile

К 1990-м недостатки водопада стали очевидны: проекты срывали сроки, перерасходовали бюджеты, не соответствовали ожиданиям пользователей.

В 2001-м 17 специалистов подписали Agile Manifesto, провозгласивший следующие ценности:

  • Люди и взаимодействие важнее процессов и инструментов
  • Рабочее ПО важнее документации
  • Сотрудничество с заказчиком важнее контрактов
  • Готовность к изменениям важнее следования плану

Agile и XP (Extreme Programming) ввели итеративную разработку, постоянную обратную связь и частые релизы. Тестирование стало частью цикла разработки, а не отдельным этапом. Появились Test-Driven Development (TDD) и Behavior-Driven Development (BDD), побуждающие разработчиков писать тесты до кода и проверять поведение, а не реализацию.

SUnit и тестовые фреймворки

Agile изменил подход к тестированию. С переходом на короткие итерации и непрерывную обратную связь командам потребовались инструменты, способные идти в ногу с быстрыми циклами разработки. Так появилось семейство фреймворков xUnit.

Всё началось с SUnit, созданного Кентом Беком в 1989 году для языка Smalltalk. SUnit ввёл базовые элементы модульного тестирования: тестовые случаи, утверждения, процедуры подготовки и очистки окружения, а также наборы тестов.

Десять лет спустя, в 1999 году, Бек и Эрих Гамма выпустили JUnit для Java. Это был первый широко используемый open-source фреймворк модульного тестирования. Он вывел автоматизацию тестирования в мейнстрим, плотно интегрировавшись с инструментами сборки Java и обеспечивая разработчикам быстрый цикл обратной связи.

Главная страница сайта JUnit

Системы контроля версий и непрерывная интеграция

По мере того как тестирование становилось всё более автоматизированным, происходил ещё один фундаментальный сдвиг — появление систем контроля версий (VCS) и практики непрерывной интеграции (CI).

CVS (Concurrent Versions System) была выпущена в ноябре 1990 года и стала одной из первых централизованных систем контроля версий. Она позволяла нескольким разработчикам работать с одной кодовой базой и отслеживать изменения в общем репозитории. До появления CVS контроль версий обычно был локальным, что затрудняло обмен изменениями, их отслеживание и слияние.

Однако одного контроля версий оказалось недостаточно. В 2001 году компания ThoughtWorks выпустила CruiseControl — первую открытую систему непрерывной интеграции.

Главная страница сайта CruiseControl

CruiseControl внедрила концепцию цикла сборки, автоматизированное тестирование (с интеграцией JUnit) и панели мониторинга.

Схема цикла сборки

Вместе контроль версий и CI заложили основу для современного DevOps-стека, где изменения в коде постоянно интегрируются, тестируются и доставляются пользователям.

Золотой век тестирования

2000-е годы стали периодом бурных инноваций в области автоматизированного тестирования. В 2004 году появился Selenium, который позволил разработчикам писать сквозные (end-to-end) тесты и тесты UI. Он быстро стал основным инструментом для автоматизации тестирования фронтенда.

На стороне CI в 2005 году был представлен Hudson — более удобная для разработчиков альтернатива CruiseControl. Hudson предлагал современный интерфейс, архитектуру плагинов и простую настройку, что сделало его более доступным. Позднее он был клонирован в Jenkins, который стал доминирующим инструментом CI на следующее десятилетие.

В том же 2005 году появился RSpec, упростивший разработчикам переход к BDD. А в 2008 году Cucumber поднял BDD на новый уровень, введя язык Gherkin — синтаксис на простом английском для описания поведения программного обеспечения.

Бум тестирования на JavaScript

К 2010-м годам JavaScript превратился из языка сценариев, работающего только в браузере, в ключевую технологию для всего веба.

В 2011 году вышел Mocha — один из первых гибких фреймворков для тестирования JavaScript в среде Node.js. Mocha предложил простой, но мощный интерфейс для написания асинхронных тестов, а его модульная архитектура позволяла разработчикам выбирать удобные библиотеки утверждений (assertion libraries) и репортеры.

С ростом сложности фронтенд-приложений вырос и спрос на end-to-end тестирование. В 2014 году появился Nightwatch.js, основанный на Selenium, который позволял автоматизировать браузер прямо из Node.js. Он отличался простой установкой и синтаксисом, ориентированным на JavaScript-разработчиков, что сделало тестирование UI доступнее.

В том же году Facebook открыл исходный код Jest. Этот инструмент объединил всё необходимое в одном пакете, устранив лишние сложности для разработчиков и по умолчанию внедрив лучшие практики.

Стремление к улучшению end-to-end тестирования продолжилось в 2017 году с релизом Cypress. В отличие от инструментов на основе Selenium, Cypress работал прямо в браузере вместе с тестируемым приложением, обеспечивая более точное и надёжное тестирование.

В 2020 году на сцене появился Playwright, созданный бывшими участниками команд Selenium и Puppeteer. Он предложил современный подход к автоматизации браузеров, поддерживал несколько браузеров «из коробки», позволял запускать тесты в headless- и headful-режиме, а также имитировал реальные условия работы пользователя, включая сетевые задержки и геолокацию.

Главная страница сайта Playwright

ИИ меняет все

Искусственный интеллект изменил подход к разработке ПО. Если отбросить весь хайп, крупные языковые модели (LLM) вполне способны писать код и выступать в роли партнёров в процессе тестирования. Они могут выполнять рутинные задачи и генерировать шаблонный код.

С помощью ИИ разработчики могут использовать новые подходы к работе:

  • Описать функциональность на естественном языке и мгновенно получить набор тестов
  • Автоматически обновлять тесты при изменении кода
  • Привлекать ИИ как ревьюера тестов, который предложит недостающие проверки или укажет на лишние

Кроме того, появляются тест-раннеры с поддержкой LLM, встроенные прямо в инструменты разработки. Один из ярких примеров — Playwright MCP. MCP действует как своего рода USB-мост между Playwright и LLM, позволяя управлять автоматизацией браузера с помощью инструкций на естественном языке.

Заключение

История автоматизированного тестирования тесно связана с развитием разработки программного обеспечения. В первые годы тестирование было ручным и дорогостоящим. Модель водопада отодвигала его на конец процесса, воспринимая как отдельный этап, а не как непрерывную практику.

Появление Agile, систем контроля версий и непрерывной интеграции привело к бурному росту инструментов тестирования на всех уровнях технологического стека. Тестирование стало неотъемлемой частью жизненного цикла разработки. Оно перестало быть запоздалой мерой и превратилось в ключевой элемент для быстрой и надёжной поставки поддерживаемого ПО.

Дальнейшая задача — интегрировать новые технологии, такие как ИИ, не утратив отработанных на практике подходов, которые делают тестирование действительно эффективным.

Перевод статьи «Automated Testing: From Mainframes to ChatGPT».

🔥 Какой была ваша первая зарплата в QA и как вы искали первую работу? 

Мега обсуждение в нашем телеграм-канале о поиске первой работы. Обмен опытом и мнения.

Читать в телеграм

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *