Уровни тестирования

13 июня, 2021

Существует 4 уровня тестирования [1]:

  1. Модульное / Компонентное / Unit
  2. Интеграционное
  3. Системное
  4. Приемочное

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

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


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

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

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

  1. Берем детали и инструкцию по сборке, и проверяем, что все на месте (детали правильной формы / размера / цвета)
  2. Собираем детали в «блоки». Если игрушка — это машинка, то мы соберем несколько блоков: двери, колеса, салон, корпус машины, подвеску и т.п.
  3. «Блоки» собираем в части побольше (если нужно), а уже из них складываем готовую машинку
  4. Проверяем, что машинка ездит, двери открывается, ничего от нее не отпадает и т.п.
  5. В конце мы проверяем, что машинка соответствует изображению и это то, что мы покупали 🙂

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

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


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

  1. Проверка каждой отдельной детали на соответствие инструкции = Модульное тестирование
  2. Проверка «блоков», состоящих из отдельных деталей соединённых определенным образом = Интеграционное тестирование
  3. Проверка собранной игрушки = Системное тестирование
  4. Собранная игрушка — это именно та игрушка, которую мы хотели = Приемочное тестирование
Уровни тестирования
Уровни тестирования

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

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


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

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

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

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

  1. Цели тестирования (Для чего мы проводим тестирование?)
  2. Объект тестирования (Что мы тестируем? Модуль / компонент / под-систему / систему?)
  3. Базис тестирования (Что нам необходимо, чтоб провести тестирование? Объект тестирования, спецификации, требования, ТЗ)
  4. Типичные дефекты, которые мы планируем найти
  5. Зоны ответственности (Кто чем занимается и кто за что отвечает?)
  6. Окружение (Где проводится тестирование, локально или на production сервере?)

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

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

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

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

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


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

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

Дизайн системы Contact Us
Дизайн системы Contact Us

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

Схема работы системы Contact Us
Схема работы системы Contact Us
  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 опущена для упрощения схемы


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

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

Модульное / Компонентное / Unit тестирование

Модульное / Компонентное / Unit тестирование фокусируется на компонентах / модулях, которые должны быть проверены в изоляции, как самостоятельные, независимые блоки.


Module / Component / Unit testing: A test level that focuses on individual hardware or software components [ISTQB Glossary]

Характеристики модульного тестирования

Цель: проверка правильности реализации функциональных / нефункциональных требований в модуле, раннее обнаружение ошибок

Объект: модуль / компонент / unit

Базис: дизайн системы, код, спецификация компонента

Типичные ошибки: ошибка в реализации требований, ошибка в коде

Ответственный: разработчик (редко тестировщик)


На этом уровне тестирования создаются модульные тесты (unit тесты), которые проверяют правильность работы модуля в тестовых условиях. Эти проверки всегда автоматизированы и выполняются очень быстро (несколько тысяч тестов в минуту).

Unit тесты, кроме поиска ошибок, также помогают оценивать качество кода, измерять покрытие кода тестами, сокращать время и затраты на тестирование.


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

Компонентное тестирование
Компоненты и под-системы системы Contact Us
  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 подтипа:

  • Компонентное интеграционное тестирование — проверяет связи между компонентами. Может быть автоматизировано.
  • Системное интеграционное тестирование — проверяет связи между под-системами / системами. Не всегда можно автоматизировать, так как часто интеграция происходит с внешним сервисом, к которому мы не имеем доступа.

Integration testing. Testing performed to expose defects in the interfaces and in the interactions between integrated components or systems. [ISTQB Glossary]

Component integration testing. Testing performed to expose defects in the interfaces and interaction between integrated components. [ISTQB Glossary]

System integration testing. Testing the integration of systems and packages; testing interfaces to external organizations (e.g. Electronic Data Interchange, Internet). [ISTQB Glossary]

Характеристики интеграционного тестирования

Цель: проверка правильности реализации взаимодействия между компонентами / модулями / частями системы

Объект: модули, состоящие из нескольких компонентов; под-системы, 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.


Interface Testing. An integration test type that is concerned with testing the interfaces between components or systems. [ISTQB Glossary]

API testing. Testing performed by submitting commands to the software under test using programming interfaces of the application directly. [ISTQB Glossary]


Далее посмотрим на системное интеграционное тестирование.

Обрати внимание на стрелки 3 и 9.

Они описывают связь между двумя под-системами: Frontend, который формирует и отправляет запрос со страницы Contact Us с данными формы, и Backend, который обрабатывает и реагирует на запрос.

Тестирование на этом уровне показывает, что интеграция под-систем реализована в соответствии с заявленными требованиями.

В нашем случае для проверки правильности достаточно написать 1 тест: отправить форму Contact Us с ожидаемым результатом в виде показанного сообщения об успешной отправке — (10) и полученного Email сообщения с данными, оставленными с формы Contact Us.


Теперь, когда мы проверили интеграции компонентов внутри под-систем и интеграции под-систем, мы можем двигаться дальше.

Системное тестирование

Системное тестирование фокусируется на поведении всей системы в целом с точки зрения конечных пользователей.

Внимание уделяется задачам, на решение которых направлена система. Также во внимание берется нефункциональное поведение системы (скорость работы, нагрузка, и т.п.) при выполнении бизнес-задач.

Системное тестирование может проверять выполнение стандартов или законодательных / нормативных требований.

Тестовая среда для системного тестирования должна быть максимально приближенной (в идеальном варианте — идентичной) к окружению для эксплуатации (production).


System testing The process of testing an integrated system to verify that it meets specified requirements. [ISTQB Glossary]

Характеристики системного тестирования

Цель: проверка работы системы в целом

Объект: система, конфигурации системы, рабочее окружение

Базис: системные требования, бизнес требования, сценарии использования, User Stories, системные руководства, инструкции

Типичные ошибки: невозможность выполнять функциональные задачи, для которых создавалась система, неправильная передача данных внутри системы, неспособность системы работать правильно в среде эксплуатации, нефункциональные сбои (уязвимости, зависания, выключения)

Ответственный: тестировщик


Системное тестирование для нашего примера может включать в себя такие типы тестирования:

Системное тестирование
Системное тестирование системы Contact Us

* слово «тестирование» — убрано с изображения для упрощения 🙂

Помимо проверки отправки формы 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 и т.п. — все здесь).

E2e тесты очень медленные (обычно 5-10 тестов в минуту) и коварные, с их автоматизацией нужно быть очень осторожным 😉

Системное тестирование — одна из самых творческих и объемных областей тестирования. Кроме end-to-end (e2e) тестирования, к этому уровню относятся все виды нефункционального тестирования.

Очень часто начинающие тестировщики видят только одно направление развития: автоматизация.

Но на самом деле направлений много.

Именно в системном тестировании можно развиваться бесконечно, становясь профессионалом в нагрузочном тестировании, юзабилити, тестировании безопасности, производительности и т.п. Конечно, автоматизация не помешает, но не все любят и хотят программировать 🙂


End-to-End Testing A type of testing in which business processes are tested from start to finish under production-like circumstances. [ISTQB Glossary]


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

Приемочное тестирование

Приемочное тестирование фокусируется на готовности всей системы в целом.

Существуют несколько форм приемочного тестирования:

Пользовательское приемочное тестирование (User Acceptance testing, UAT) — проверяет пригодность системы к эксплуатации конечными пользователями.

Контрактное приемочное тестирование — проводится в соответствии с критериями, указанными в контракте приемки специального ПО.

Альфа-тестирование (alpha testing) и бета-тестирование (beta-testing) — используются для получения обратной связи от потенциальных или существующих клиентов. 

Альфа-тестирование проводится “внутри” компании, без участия разработчиков / тестировщиков продукта. 

Бета-тестирование проводится реальными пользователями системы.


Acceptance testing A test level that focuses on determining whether to accept the system. [ISTQB Glossary]

User acceptance testing (UAT) A type of acceptance testing performed to determine if intended users accept the system. [ISTQB Glossary]

Contractual acceptance testing A type of acceptance testing performed to verify whether a system satisfies its contractual requirements. [ISTQB Glossary]

Alpha testing A type of acceptance testing performed in the developer’s test environment by roles outside the development organization. [ISTQB Glossary]

Beta testing A type of acceptance testing performed at an external site to the developer’s test environment by roles outside the development organization. [ISTQB Glossary]

Характеристики приемочного тестирования

Цель: проверка готовности системы

Объект: система, конфигурация системы, бизнес процессы, отчеты, аналитика

Базис: системные требования, бизнес требования, сценарии использования, User Stories

Типичные ошибки: бизнес-требования неправильно реализованы, система не соответствует требованиям контракта

Ответственный: заказчик / клиент / бизнес-аналитик / product owner и тестировщик


Завершая рассмотрение примера можем написать приемочный тест, который выполнит заказчик:

Приемочное тестирование
Приемочное тестирование системы Contact Us
  1. Заказчик заполняет форму, нажимает на кнопку «Отправить»
  2. Через 1 секунду он видит сообщение об успешной отправке формы
  3. В течении минуты на почту поддержки приходит письмо содержащее данные отправленные с формы

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

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


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

Резюме

Вот и все 🙂

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

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

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

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

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


Для того, чтоб ты смог проверить себя — мы создали специальный тест! Он поможет тебе узнать, насколько хорошо ты разобрался в определениях уровней тестирования и подскажет, что нужно повторить)

🔥 А если ты готов к настоящему вызову и хочешь попробовать применить полученные знания на практике, мы подготовили практические задания по тестированию сайтов разной сложности, выполнение которых покажет, на сколько хорошо ты понимаешь и умеешь применять теорию, связанную с уровнями тестирования.

Удачи! 💪 


Если тебе интересна тема тестирования и ты хотел бы получать актуальную информацию по этой теме  подписывайся на наш Телеграм канал! Там интересно: статьи, тесты, опросы, нет спама 😉


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


Если у тебя возникли вопросы или есть предложения по статье — обращайся к нам в Телеграм, будем рады 🙂


Источники

  1. ISTQB Foundation Level Syllabus Version 2018 V3.1
  2. ISTQB Glossary (https://glossary.istqb.org/en/search/)

FAQ

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

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

Что такое компонентное тестирование (unit testing)?

Компонентное / модульное / unit testing — фокусируется на компонентах / модулях / классах, которые могут быть проверены изолированно / отдельно.

Что такое интеграционное тестирование (integration testing)?

Интеграционное тестирование / integration testing — фокусируется на взаимодействии между компонентами / модулями, системами.

Что такое системное тестирование (system testing)?

Системное тестирование / system testing фокусируется на поведении всей системы в целом с точки зрения конечных пользователей.

Что такое приемочное тестирование (acceptance testing)?

Приемочное тестирование / acceptance testing — фокусируется на поведении всей системы в целом. Оно дает возможность оценить готовность системы к развертыванию и использованию.

🔥 Присоединяйся к 4,845
тестировщикам в Телеграм!