В этой статье разберемся что такое уровни тестирования, зачем они нужны и что собой представляет каждый из них. (1)

/**/

Наглядный пример из жизни

Начнем с простого примера.

Давай вспомним, что такое конструктор LEGO.

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

Обычно, процесс сборки игрушки выглядит так:

  1. Берем детали и инструкцию по сборке, и проверяем, что все на месте (детали правильной формы / размера / цвета)

  2. Собираем детали в «блоки». Если игрушка — это машинка, то мы соберем несколько блоков: двери, колеса, салон, корпус машины, подвеску и т.п.

  3. «Блоки» собираем в части побольше (если нужно), а уже из них складываем готовую машинку

  4. Проверяем, что машинка ездит, двери открывается, ничего от нее не отпадает и т.п.

  5. В конце мы проверяем, что машинка соответствует изображению и это то, что мы покупали

Программное обеспечение очень похоже на такой конструктор.

Но оно намного круче, ведь мы сами можем создавать любые детали и использовать детали (и даже блоки), созданные другими людьми (привет Open Source) 😉

Если посмотреть на процесс сборки с точки зрения тестирования, его можно описать так:

  1. Проверка каждой отдельной детали на соответствие инструкции = Модульное тестирование

  2. Проверка «блоков», состоящих из отдельных деталей соединённых определенным образом = Интеграционное тестирование

  3. Проверка собранной игрушки = Системное тестирование

Собранная игрушка — это именно та игрушка, которую мы хотели = Приемочное тестирование

Суть процесса проста: проверка любой системы (будь то конструктор LEGO или мобильное приложение) начинается с ее наименьших элементов и двигается в сторону их объединения / увеличения до максимального размера.

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

Теперь ты осознаешь уровни тестирования, но для эффективной работы этого недостаточно. Давай разбираться глубже)

Что такое уровень тестирования?

Уровень тестирования — активности тестирования, объединенные в группу исходя из общих характеристик, связанных с SDLC.

К характеристикам относятся:

  1. Цели тестирования (Для чего мы проводим тестирование?)

  2. Объект тестирования (Что мы тестируем? Модуль / компонент / под-систему / систему?)

  3. Базис тестирования (Что нам необходимо, чтоб провести тестирование? Объект тестирования, спецификации, требования, ТЗ)

  4. Типичные дефекты, которые мы планируем найти

  5. Зоны ответственности (Кто чем занимается и кто за что отвечает?)

  6. Окружение (Где проводится тестирование, локально или на production сервере?)

Перед тем, как мы перейдем к рассмотрению каждого конкретного уровня и его характеристик, давайте рассмотрим реальный пример этапов тестирования ПО, который поможет нам совместить теорию и практику.

Пример реальной задачи по разработке

Предположим, перед вашей командой ставят задачу:

Создать страницу “Contact Us” на сайте Х. После отправки формы отдел поддержки должен получить Email, содержащий введенные данные и контактную информацию клиента.

Этап разработки требований и критериев приемки завершен, команда может приступать к реализации, задача переходит на этап дизайна (см. SDLC)

Первым делом разработчики прорабатывают дизайн системы.

Он может представлять собой следующую схему:

Далее, разработчики детализируют схему добавляя описание шагов:

  1. Клиент заполняет форму Contact Us и нажимает кнопку «Отправить»

  2. Frontend проверяет введенные значения*

  3. Frontend отправляет данные на Backend

  4. Contact Us Controller проверяет данные и формирует запрос на отправку письма*

  5. Contact Us Controller передает данные для отправки письма в Email Sender

  6. Email Sender получает данные, проверяет их, формирует письмо и отправляет его**

  7. Email Sender отвечает Contact Us Controller, что письмо отправлено

  8. Contact Us Controller формирует ответ для Frontend

  9. Backend отправляет данные об успешной отправке письма на Frontend

  10. 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 тесты, кроме поиска ошибок, также помогают оценивать качество кода, измерять покрытие кода тестами, сокращать время и затраты на тестирование.

Продолжая рассмотрение примера со страницей сайта, мы можем выделить следующие модули:

  1. Страница Contact Us отвечает за показ формы Contact Us

  2. Форма Contact Us отвечает за проверку и отправку данных на Backend

  3. Contact Us Controller является частью API и отвечает за обработку запросов с формы Contact Us

  4. Email Sender отвечает за отправку Email

Для примера, рассмотрим модуль «страница Contact Us».

Требования:

  1. Открываться в браузере по указанному URL

  2. Содержать правильную информацию и тексты

  3. Содержать форму Contact Us (содержать, но не отвечать за ее работоспособность!)

В свою очередь, требования к модулю «Contact Us Controller»:

  1. Принимать данные по указанному URL (API endpoint)

  2. Проверять полученные данные

  3. Правильно формировать данные для компонента Email Sender (без фактической отправки)

  4. Возвращать правильные 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 сообщения, в ходе системного тестирования мы должны ответить на вопросы:

  1. Работает ли форма Contact Us во всех поддерживаемых браузерах?

  2. Удобно ли ей пользоваться? Все ли понятно? Насколько осмысленны сообщения об ошибках?

  3. Что произойдет, если кто-то отправит 1,000 запросов Contact Us в секунду? (DDOS)

  4. Какое максимальное количество запросов можно отправить, чтобы сайт работал без сбоев? (Load testing)

  5. Насколько читабельным является Email, который получит поддержка? (весь текст в одну строку или письмо оформлено красиво)

  6. Не попадает ли письмо в Spam?

  7. Сохраняются ли данные клиента, который отправляет форму? Если «да» — насколько безопасно место хранения? Существует ли способ получения списка отправленных Email-ов?

  8. Знает ли суппорт о почтовом ящике, куда попадет письмо? Знает ли он, как реагировать на такие письма?

  9. и много, много других …

На этом уровне тестирования создаются 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. Заказчик заполняет форму, нажимает на кнопку «Отправить»

  2. Через 1 секунду он видит сообщение об успешной отправке формы

  3. В течении минуты на почту поддержки приходит письмо содержащее данные отправленные с формы

Количество тестов на приемочном уровне намного меньше, чем на других уровнях, потому что в этот момент времени вся система уже проверена. Приемочные тесты практически никогда не автоматизируются.

В Agile разработке, конкретно в Scrum, для всех User Stories обязательно прописываются Acceptance Criteria. Именно они являются основой для приемочных тестов и показывают, что команда сделала именно то, что было нужно.

После завершения приемочного тестирования задача передается клиенту.

Резюме

  • В этой статье мы описали, что такое уровни тестирования, зачем они нужны и что собой представляет каждый из них.

  • Мы рассмотрели пример тестирования формы Contact Us.

  • Мы поняли, что тестирование нужно начинать с самых маленьких частей системы — компонентов / модулей.

  • Далее стоит проверить взаимосвязи между компонентами и всю систему в целом.

  • А завершает тестирование — заказчик, выполняя приемочное тестирование.


Источники:

(1) Уровни тестирования: https://beqa.pro/blog/testing-levels/#acceptance-testing

Tags

Нет комментариев

Добавить комментарий

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.