Существует 4 уровня тестирования [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 опущена для упрощения схемы
Имея требования к странице, описание дизайна и логики работы, проект переходит на этап разработки. Разработчики начинают писать код, а тестировщики могут приступать к продумыванию тестов.
Как ты уже знаешь, процесс начинается с наименьших частей системы — модулей / компонентов.
Модульное / Компонентное / 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 подтипа:
- Компонентное интеграционное тестирование — проверяет связи между компонентами. Может быть автоматизировано.
- Системное интеграционное тестирование — проверяет связи между под-системами / системами. Не всегда можно автоматизировать, так как часто интеграция происходит с внешним сервисом, к которому мы не имеем доступа.
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, получения 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 и т.п. — все здесь).
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 и тестировщик
Завершая рассмотрение примера можем написать приемочный тест, который выполнит заказчик:
- Заказчик заполняет форму, нажимает на кнопку «Отправить»
- Через 1 секунду он видит сообщение об успешной отправке формы
- В течении минуты на почту поддержки приходит письмо содержащее данные отправленные с формы
Количество тестов на приемочном уровне намного меньше, чем на других уровнях, потому что в этот момент времени вся система уже проверена. Приемочные тесты практически никогда не автоматизируются.
В Agile разработке, конкретно в Scrum, для всех User Stories обязательно прописываются Acceptance Criteria. Именно они являются основой для приемочных тестов и показывают, что команда сделала именно то, что было нужно.
После завершения приемочного тестирования задача передается клиенту.
Резюме
Вот и все 🙂
В этой статье мы описали, что такое уровни тестирования, зачем они нужны и что собой представляет каждый из них.
Мы рассмотрели пример тестирования формы Contact Us.
Мы поняли, что тестирование нужно начинать с самых маленьких частей системы — компонентов / модулей.
Далее стоит проверить взаимосвязи между компонентами и всю систему в целом.
А завершает тестирование — заказчик, выполняя приемочное тестирование.
Для того, чтоб ты смог проверить себя — мы создали специальный тест! Он поможет тебе узнать, насколько хорошо ты разобрался в определениях уровней тестирования и подскажет, что нужно повторить)
🔥 А если ты готов к настоящему вызову и хочешь попробовать применить полученные знания на практике, мы подготовили практические задания по тестированию сайтов разной сложности, выполнение которых покажет, на сколько хорошо ты понимаешь и умеешь применять теорию, связанную с уровнями тестирования.
Удачи! 💪
Если тебе интересна тема тестирования и ты хотел бы получать актуальную информацию по этой теме — подписывайся на наш Телеграм канал! Там интересно: статьи, тесты, опросы, нет спама 😉
Если ты хочешь продолжить разбираться с тестированием — узнай больше о тестировании в целом, разберись с типами тестирования или посмотри принципы тестирования ПО, которые являются основой для понимания тестирования ПО в целом.
Если у тебя возникли вопросы или есть предложения по статье — обращайся к нам в Телеграм, будем рады 🙂
Источники
- ISTQB Foundation Level Syllabus Version 2018 V3.1
- 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 — фокусируется на поведении всей системы в целом. Оно дает возможность оценить готовность системы к развертыванию и использованию.