В этой статье разберемся что такое уровни тестирования, зачем они нужны и что собой представляет каждый из них. (1)
/**/
Наглядный пример из жизни
Начнем с простого примера.
Давай вспомним, что такое конструктор LEGO.
Это набор разноцветных деталей разной формы и размеров, которые после «магического» соединения превращаются в прикольную игрушку.
Обычно, процесс сборки игрушки выглядит так:
-
Берем детали и инструкцию по сборке, и проверяем, что все на месте (детали правильной формы / размера / цвета)
-
Собираем детали в «блоки». Если игрушка — это машинка, то мы соберем несколько блоков: двери, колеса, салон, корпус машины, подвеску и т.п.
-
«Блоки» собираем в части побольше (если нужно), а уже из них складываем готовую машинку
-
Проверяем, что машинка ездит, двери открывается, ничего от нее не отпадает и т.п.
-
В конце мы проверяем, что машинка соответствует изображению и это то, что мы покупали
Программное обеспечение очень похоже на такой конструктор.
Но оно намного круче, ведь мы сами можем создавать любые детали и использовать детали (и даже блоки), созданные другими людьми (привет Open Source)
Если посмотреть на процесс сборки с точки зрения тестирования, его можно описать так:
-
Проверка каждой отдельной детали на соответствие инструкции = Модульное тестирование
-
Проверка «блоков», состоящих из отдельных деталей соединённых определенным образом = Интеграционное тестирование
-
Проверка собранной игрушки = Системное тестирование
Собранная игрушка — это именно та игрушка, которую мы хотели = Приемочное тестирование
Суть процесса проста: проверка любой системы (будь то конструктор LEGO или мобильное приложение) начинается с ее наименьших элементов и двигается в сторону их объединения / увеличения до максимального размера.
Благодаря этому подходу ты никогда не попадешь в ситуацию, когда «колеса не того размера», «двери не от той машины» или «мы хотели самолет, а получили вертолет, платить не будем»
Теперь ты осознаешь уровни тестирования, но для эффективной работы этого недостаточно. Давай разбираться глубже)
Что такое уровень тестирования?
Уровень тестирования — активности тестирования, объединенные в группу исходя из общих характеристик, связанных с SDLC.
К характеристикам относятся:
-
Цели тестирования (Для чего мы проводим тестирование?)
-
Объект тестирования (Что мы тестируем? Модуль / компонент / под-систему / систему?)
-
Базис тестирования (Что нам необходимо, чтоб провести тестирование? Объект тестирования, спецификации, требования, ТЗ)
-
Типичные дефекты, которые мы планируем найти
-
Зоны ответственности (Кто чем занимается и кто за что отвечает?)
-
Окружение (Где проводится тестирование, локально или на production сервере?)
Перед тем, как мы перейдем к рассмотрению каждого конкретного уровня и его характеристик, давайте рассмотрим реальный пример этапов тестирования ПО, который поможет нам совместить теорию и практику.
Пример реальной задачи по разработке
Предположим, перед вашей командой ставят задачу:
Создать страницу “Contact Us” на сайте Х. После отправки формы отдел поддержки должен получить Email, содержащий введенные данные и контактную информацию клиента.
Этап разработки требований и критериев приемки завершен, команда может приступать к реализации, задача переходит на этап дизайна (см. SDLC)
Первым делом разработчики прорабатывают дизайн системы.
Он может представлять собой следующую схему:
Далее, разработчики детализируют схему добавляя описание шагов:
-
Клиент заполняет форму Contact Us и нажимает кнопку «Отправить»
-
Frontend проверяет введенные значения*
-
Frontend отправляет данные на Backend
-
Contact Us Controller проверяет данные и формирует запрос на отправку письма*
-
Contact Us Controller передает данные для отправки письма в Email Sender
-
Email Sender получает данные, проверяет их, формирует письмо и отправляет его**
-
Email Sender отвечает Contact Us Controller, что письмо отправлено
-
Contact Us Controller формирует ответ для Frontend
-
Backend отправляет данные об успешной отправке письма на Frontend
-
Frontend получает данные, понимает, что отправка была успешной и показывает клиенту сообщение
логика проверки (валидации данных) опущена для упрощения; но, это не означает, что ее нет!
логика отправки Email опущена для упрощения схемы
Имея требования к странице, описание дизайна и логики работы, проект переходит на этап разработки. Разработчики начинают писать код, а тестировщики могут приступать к продумыванию тестов.
Как ты уже знаешь, процесс начинается с наименьших частей системы — модулей / компонентов.
1. Модульное / Компонентное / Unit тестирование
Модульное / Компонентное / Unit тестирование фокусируется на компонентах / модулях, которые должны быть проверены в изоляции, как самостоятельные, независимые блоки.
Module / Component / Unit testing: A test level that focuses on individual hardware or software components [ISTQB Glossary]
Характеристики модульного тестирования
Цель: проверка правильности реализации функциональных / нефункциональных требований в модуле, раннее обнаружение ошибок
-
Объект: модуль / компонент / unit
-
Базис: дизайн системы, код, спецификация компонента
-
Типичные ошибки: ошибка в реализации требований, ошибка в коде
-
Ответственный: разработчик (редко тестировщик)
На этом уровне тестирования создаются модульные тесты (unit тесты), которые проверяют правильность работы модуля в тестовых условиях. Эти проверки всегда автоматизированы и выполняются очень быстро (несколько тысяч тестов в минуту).
Unit тесты, кроме поиска ошибок, также помогают оценивать качество кода, измерять покрытие кода тестами, сокращать время и затраты на тестирование.
Продолжая рассмотрение примера со страницей сайта, мы можем выделить следующие модули:
-
Страница Contact Us отвечает за показ формы Contact Us
-
Форма Contact Us отвечает за проверку и отправку данных на Backend
-
Contact Us Controller является частью API и отвечает за обработку запросов с формы Contact Us
-
Email Sender отвечает за отправку Email
Для примера, рассмотрим модуль «страница Contact Us».
Требования:
-
Открываться в браузере по указанному URL
-
Содержать правильную информацию и тексты
-
Содержать форму Contact Us (содержать, но не отвечать за ее работоспособность!)
-
…
В свою очередь, требования к модулю «Contact Us Controller»:
-
Принимать данные по указанному URL (API endpoint)
-
Проверять полученные данные
-
Правильно формировать данные для компонента Email Sender (без фактической отправки)
-
Возвращать правильные HTTP ответы в случае успешной отправки Email И (!!!) в случае возникновения ошибки
-
…
Все описанные выше требования должны проверяться Unit тестами.
Когда проверки компонентов закончены и мы уверены, что модули по отдельности работают как ожидалось, можем переходить на следующий уровень.
2. Интеграционное тестирование
Интеграционное тестирование фокусируется на взаимодействии между компонентами / модулями / под-системами / системами.
Выделяют 2 подтипа:
-
Компонентное интеграционное тестирование — проверяет связи между компонентами. Может быть автоматизировано.
-
Системное интеграционное тестирование — проверяет связи между под-системами / системами. Не всегда можно автоматизировать, так как часто интеграция происходит с внешним сервисом, к которому мы не имеем доступа.
Характеристики интеграционного тестирования
-
Цель: проверка правильности реализации взаимодействия между компонентами / модулями / частями системы
-
Объект: модули, состоящие из нескольких компонентов; под-системы, API, микросервисы
-
Базис: дизайн системы, архитектура системы, описание связей компонентов
-
Типичные ошибки: отсутствие / неправильные связи между элементами системы, неправильные передаваемые данные, отсутствие обработки ошибок, отказы и падения при обращениях к API
-
Ответственный: разработчик и тестировщик
Системные интеграционные тесты выполняются дольше (несколько десятков в минуту), чем модульные интеграционные тесты (несколько сотен-тысяч в минуту) и являются более творческими.
Продолжим рассмотрение примера.
Теперь, обратим внимание на связи между компонентами / под-системами:
Начнем с компонентного интеграционного тестирования.
Обрати внимание на стрелки 5 и 7.
Они описывают связь между компонентами Contact Us Controller и Email Sender внутри под-системы Backend.
Contact Us Controller обращается к Email Sender с запросом для отправки Email сообщения (5), Email Sender отправляет письмо (6) и отвечает Contact Us Controller что все прошло удачно (7). Если при отправке (6) произошла ошибка, в ответе (7) вернется информация об ошибке.
В нашем случае интеграционные тесты проверят, что описанный выше процесс работает и что модуль Contact Us Controller инициирует отправку Email сообщения, а не SMS.
Тестирование интерфейсов (частично) и тестирование API являются примерами интеграционного компонентного тестирования.
В случае с тестированием API мы «имитируем» запрос от клиента — (3) и анализируем ответ сервера — (9), таким образом проверяя интеграцию всех задействованных модулей для конкретного API Endpoint внутри Backend.
Далее посмотрим на системное интеграционное тестирование.
Обрати внимание на стрелки 3 и 9.
Они описывают связь между двумя под-системами: Frontend, который формирует и отправляет запрос со страницы Contact Us с данными формы, и Backend, который обрабатывает и реагирует на запрос.
Тестирование на этом уровне показывает, что интеграция под-систем реализована в соответствии с заявленными требованиями.
В нашем случае для проверки правильности достаточно написать 1 тест: отправить форму Contact Us с ожидаемым результатом в виде показанного сообщения об успешной отправке — (10) и полученного Email сообщения с данными, оставленными с формы Contact Us.
Теперь, когда мы проверили интеграции компонентов внутри под-систем и интеграции под-систем, мы можем двигаться дальше.
3. Системное тестирование
Системное тестирование фокусируется на поведении всей системы в целом с точки зрения конечных пользователей.
Внимание уделяется задачам, на решение которых направлена система. Также во внимание берется нефункциональное поведение системы (скорость работы, нагрузка, и т.п.) при выполнении бизнес-задач.
Системное тестирование может проверять выполнение стандартов или законодательных / нормативных требований.
Тестовая среда для системного тестирования должна быть максимально приближенной (в идеальном варианте — идентичной) к окружению для эксплуатации (production).
Характеристики системного тестирования
-
Цель: проверка работы системы в целом
-
Объект: система, конфигурации системы, рабочее окружение
-
Базис: системные требования, бизнес требования, сценарии использования, User Stories, системные руководства, инструкции
-
Типичные ошибки: невозможность выполнять функциональные задачи, для которых создавалась система, неправильная передача данных внутри системы, неспособность системы работать правильно в среде эксплуатации, нефункциональные сбои (уязвимости, зависания, выключения)
-
Ответственный: тестировщик
Системное тестирование для нашего примера может включать в себя такие типы тестирования:
слово «тестирование» — убрано с изображения для упрощения
Помимо проверки отправки формы Contact Us, получения Email сообщения на почту суппорта и показа Success сообщения, в ходе системного тестирования мы должны ответить на вопросы:
-
Работает ли форма Contact Us во всех поддерживаемых браузерах?
-
Удобно ли ей пользоваться? Все ли понятно? Насколько осмысленны сообщения об ошибках?
-
Что произойдет, если кто-то отправит 1,000 запросов Contact Us в секунду? (DDOS)
-
Какое максимальное количество запросов можно отправить, чтобы сайт работал без сбоев? (Load testing)
-
Насколько читабельным является Email, который получит поддержка? (весь текст в одну строку или письмо оформлено красиво)
-
Не попадает ли письмо в Spam?
-
Сохраняются ли данные клиента, который отправляет форму? Если «да» — насколько безопасно место хранения? Существует ли способ получения списка отправленных Email-ов?
-
Знает ли суппорт о почтовом ящике, куда попадет письмо? Знает ли он, как реагировать на такие письма?
-
и много, много других …
На этом уровне тестирования создаются end-to-end тесты, имитирующие бизнес процессы, Use Cases и Use Stories от начала до конца.
Эти тесты все чаще автоматизируется и именно этот вид автоматизации сейчас очень востребован (JAVA, Python, JavaScript, C#, Selenium и т.п. — все здесь).
“End to end“ / E2E тесты очень медленные (обычно 5-10 тестов в минуту) и коварные, с их автоматизацией нужно быть очень осторожным
Системное тестирование — одна из самых творческих и объемных областей тестирования. Кроме end-to-end тестирования, к этому уровню относятся все виды нефункционального тестирования.
Очень часто начинающие тестировщики видят только одно направление развития: автоматизация.
Но на самом деле направлений много.
Именно в системном тестировании можно развиваться бесконечно, становясь профессионалом в нагрузочном тестировании, юзабилити, тестировании безопасности, производительности и т.п. Конечно, автоматизация не помешает, но не все любят и хотят программировать
После завершения тестирования всей системы нас ждет последняя проверка перед сдачей работы.
4. Приемочное тестирование
Приемочное тестирование фокусируется на готовности всей системы в целом.
Существуют несколько форм приемочного тестирования:
-
Пользовательское приемочное тестирование (User Acceptance testing, UAT) — проверяет пригодность системы к эксплуатации конечными пользователями.
-
Контрактное приемочное тестирование — проводится в соответствии с критериями, указанными в контракте приемки специального ПО.
-
Альфа-тестирование (alpha testing) и бета-тестирование (beta-testing) — используются для получения обратной связи от потенциальных или существующих клиентов. Альфа-тестирование проводится “внутри” компании, без участия разработчиков / тестировщиков продукта.
-
Бета-тестирование проводится реальными пользователями системы.
Характеристики приемочного тестирования
-
Цель: проверка готовности системы
-
Объект: система, конфигурация системы, бизнес процессы, отчеты, аналитика
-
Базис: системные требования, бизнес требования, сценарии использования, User Stories
-
Типичные ошибки: бизнес-требования неправильно реализованы, система не соответствует требованиям контракта
-
Ответственный: заказчик / клиент / бизнес-аналитик / product owner и тестировщик
Завершая рассмотрение примера можем написать приемочный тест, который выполнит заказчик:
-
Заказчик заполняет форму, нажимает на кнопку «Отправить»
-
Через 1 секунду он видит сообщение об успешной отправке формы
-
В течении минуты на почту поддержки приходит письмо содержащее данные отправленные с формы
Количество тестов на приемочном уровне намного меньше, чем на других уровнях, потому что в этот момент времени вся система уже проверена. Приемочные тесты практически никогда не автоматизируются.
В Agile разработке, конкретно в Scrum, для всех User Stories обязательно прописываются Acceptance Criteria. Именно они являются основой для приемочных тестов и показывают, что команда сделала именно то, что было нужно.
После завершения приемочного тестирования задача передается клиенту.
Резюме
-
В этой статье мы описали, что такое уровни тестирования, зачем они нужны и что собой представляет каждый из них.
-
Мы рассмотрели пример тестирования формы Contact Us.
-
Мы поняли, что тестирование нужно начинать с самых маленьких частей системы — компонентов / модулей.
-
Далее стоит проверить взаимосвязи между компонентами и всю систему в целом.
-
А завершает тестирование — заказчик, выполняя приемочное тестирование.
Источники:
(1) Уровни тестирования: https://beqa.pro/blog/testing-levels/#acceptance-testing
Нет Ответов