Обзорная статья о видах тестирования IT-продуктов
На курсе, где я учился frontend-разработке, нас познакомили только с unit тестированием. Но уже на первом месте работы, я столкнулся и с регрессионным тестированием, и с автотестами, и с E2E-тестами. Мне было сложно понять, чем они отличаются, какие еще есть виды тестирования и кто их должен писать. Эта статья для начинающих разработчиков, которые задаются подобными вопросами.
Модульное тестирование (Unit testing)
Модульное тестирование выполняется на уровне отдельных блоков приложения. Это может быть тест, который проверяет корректность работы отдельной функции или React-компонента.
Пример. Функция на JavaScript принимает два числа и возвращает сумму.
Пример модульного теста, который проверяет работу этой функции:
function sum(a, b) {
return a + b;
}
describe('sum', function() {
it('should return 4 when 2 and 2 are passed', function() {
expect(sum(2, 2)).toEqual(4);
});
it('should return 10 when 7 and 3 are passed', function() {
expect(sum(7, 3)).toEqual(10);
});
it('should return -3 when -5 and 2 are passed', function() {
expect(sum(-5, 2)).toEqual(-3);
});
});
Кто пишет тесты: модульные тесты обычно пишет сам автор кода.
Примеры инструментов:
ПРИМЕЧАНИЕ: я написал обзорную статью на библиотеку React-testing-library, в ней подробно рассказывается, как покрыть unit-тестами React-компонент.
Интеграционное тестирование (Integration testing)
Интеграционное тестирование проверяет правильность взаимодействия узлов IT-продукта. При проведении интеграционного тестирования необходимо убедиться в том, что каждый компонент приложения работает корректно при определенном сценарии. Веб-интерфейс должен правильно отправлять запросы к API, API должен правильно обрабатывать запросы и взаимодействовать с базой данных, а база данных сохранять нужную информацию.
Кроме того, нужно убедиться в том, что приложение работает корректно в случае возникновения ошибок, например, при отсутствии соединения с базой данных.
ВАЖНО: Корректность обработки ошибок - это часть любого вида тестирования.
Интеграционное тестирование выполняется как вручную, так и автоматизированно с использованием специальных инструментов, таких как Postman или SoapUI.
Пример. Приложение для онлайн-оплаты, которое включает в себя: веб-интерфейс, API для обработки платежей и базу данных для хранения информации о платежах. Интеграционное тестирование поможет убедиться в том, что компоненты работают корректно вместе.
Один из возможных сценариев тестирования:
Запрос на создание нового платежа отправляется через веб-интерфейс.
API для обработки платежей получает запрос и создает новую запись в базе данных.
Веб-интерфейс получает уведомление о создании нового платежа и отображает его в списке платежей на странице.
Пользователь проверяет, что новый платеж отображается на странице, и подтверждает его.
Кто пишет тесты: Интеграционные тесты обычно пишутся командой QA-инженеров.
Примеры инструментов:
Функциональное тестирование (Functional testing)
Функциональное тестирование проводится для проверки функциональности приложения. Оно позволяет убедиться в том, что приложение работает корректно и выполняет функции, соответствующие требованиям пользователей и заказчика.
Функциональное тестирование проверяет отдельные функции и возможности приложения, а интеграционное тестирование проверяет взаимодействие компонентов системы в целом.
Пример. Веб-приложение для онлайн-бронирования номеров в отеле. Функциональное тестирование поможет убедиться в том, что приложение работает корректно и выполняет свои функции.
Возможный сценарий тестирования:
Пользователь открывает веб-страницу приложения и выбирает нужную дату заезда и выезда.
Приложение отображает свободные номера в отеле на выбранные даты.
Пользователь выбирает номер и вводит свои данные для бронирования.
Приложение подтверждает бронирование и отправляет подтверждение на электронную почту пользователя.
Кто пишет тесты: функциональные тесты обычно пишутся командой QA-инженеров.
Примеры инструментов:
ПРИМЕЧАНИЕ: Пара слов о End-to-End(E2E) тестировании, это тестирование, которое позволяет проверить работу всей системы или приложения с точки зрения пользователя от начала до конца (от "end" - начала, до "end" - конца).
Оно включает в себя проверку основных сценариев использования приложения - от взаимодействия пользователя с интерфейсом до проверки корректности ответа сервера. Также при E2E тестировании проверяются функциональные возможности приложения, такие как формирование отчетов, работа с базами данных и другие.
Таким образом, E2E тестирование можно рассматривать и как функциональное и как интеграционное.
Регрессионное тестирование (Regression testing)
Регрессионное тестирование проводится после внесения изменений в приложение и позволяет убедиться в том, что уже существующая функциональность продукта продолжает работать корректно после изменений.
Регрессионное тестирование и функциональное тестирование имеют схожие, но все же разные цели и задачи.
Функциональное тестирование проверяет, что приложение соответствует требованиям, которые описаны в функциональных спецификациях.
Регрессионное тестирование проверяет, что изменения в приложении не повлияли на уже существующую функциональность и не вызвали регрессию (возврат к более ранней стадии разработки).
Пример. Онлайн-магазин, в котором можно выбирать товары, добавлять их в корзину и оформлять заказы. После выпуска новой версии нужно убедиться, что функциональные возможности, которые работали в предыдущей версии, продолжают работать корректно в новой версии. Для этого проводится регрессионное тестирование.
Функции которые нужно проверить:
Поиск товаров по названию.
Добавление товаров в корзину.
Удаление товаров из корзины.
Редактирование корзины перед оформлением заказа.
Оформление заказа с выбранными товарами.
Для каждой из этих функций нужны тесты, которые будут проверять правильность работы приложения в новой версии. Успешное прохождение тестов подтвердит, что приложение работает корректно и что пользователи не будут сталкиваться с проблемами при использовании сайта.
Кто пишет тесты: регрессионные тесты обычно пишутся командой QA-инженеров.
Примеры инструментов:
Нагрузочное тестирование (Load testing)
Нагрузочное тестирование проводится для определения максимальной нагрузки, которую может выдержать приложение. В процессе проверяется производительность приложения и выявляются возможные проблемы в работе при большой нагрузке.
Пример. Необходимо убедиться, что онлайн-магазин продолжает работать корректно, когда к нему обращается большое количество пользователей.
Для нагрузочного тестирования создается тест-сценарий, который имитирует действия пользователя на сайте, например:
Пользователь открывает главную страницу магазина.
Пользователь ищет товары по определенным категориям.
Пользователь добавляет товары в корзину.
Пользователь оформляет заказ.
Тест-сценарий запускается под разной нагрузкой, например, с одновременным выполнением скрипта на 100, 500 и 1000 пользователей. Анализ результатов тестирования помогает определить, как много пользователей приложение может обрабатывать одновременно, не замедляя работу и не выходя из строя.
Кто пишет тесты: нагрузочные тесты обычно пишутся командой QA-инженеров.
Примеры инструментов:
Тестирование на производительность (Performance testing)
Тестирование на производительность проверяет производительность продукта при различных нагрузках и условиях использования. Цель - убедиться в том, что продукт может обрабатывать большое количество запросов сохраняя скорость и стабильность.
Отличие между тестированием на производительность и нагрузочным тестированием заключается в целях тестирования.
Цель тестирования на производительность - проверить, как быстро работает приложение и с какой скоростью обрабатывает определенный объем данных. Например проверяется скорость открытия страницы, время загрузки данных и т.д.
Нагрузочное тестирование, проверяет как много пользователей может использовать приложение одновременно без существенного замедления работы или падения производительности.
Пример. Как пример теста на производительность используем пример нагрузочного тестирования. Те же условия, тот же тест-сценарий, но главное отличие будет в фокусе тестирования, т.е. в том, на какие показатели будут смотреть тестировщики.
Тестирование на производительность и тестирование на нагрузку могут быть взаимосвязаны и часто проводятся вместе.
Кто пишет тесты: тестирование на производительность обычно пишет команда QA-инженеров.
Примеры инструментов:
Автоматизированное тестирование (Automated testing)
Автоматизированное тестирование - это способ проведения тестирования. Пример интеграционного тестирования, описанный выше, можно выполнить вручную, без использования специальных инструментов, а можно автоматизировать. Для автоматизации используются специальные инструменты и программы.
Автотесты имеют ряд преимуществ перед ручным тестированием, например:
Эффективность и экономия времени: выполняются быстрее, чем ручные, и могут работать 24/7 без остановки.
Повторяемость: можно повторять бесконечное количество раз с одинаковой точностью и результатами.
Объективность: исключается влияние субъективного мнения и человеческих ошибок.
Охват: могут охватывать большее количество функций приложения, чем это возможно в ручном режиме.
Пример: примером может быть любой из приведенных выше, если это тестирование было автоматизировано.
Кто пишет тесты: Автоматизированные тесты обычно пишутся командой QA-инженеров.
Примеры инструментов:
Заключение
В видах тестирования легко запутаться. Во-первых их часто пишут одни и те же люди, во-вторых, у них могут совпадать инструменты, и наконец, даже сами тесты могут быть полностью идентичными. Чтобы понять, какой вид тестирования перед вами, важно выявить какие цели оно преследует.
Модульное тестирование. Цель - протестировать отдельные блоки приложения.
Интеграционное тестирование. Цель - проверить взаимодействие компонентов приложения.
Функциональное тестирование. Цель - проверить работу всех заявленных функций приложения.
Регрессионное тестирование. Цель - проверить, что после изменений уже существующий функционал не сломался.
Нагрузочное тестирование. Цель - проверить максимальную нагрузку, при которой приложение работает корректно.
Тестирование на производительность. Цель - проверить скорость и корректность работы приложения при разной нагрузке.
Автоматизированное тестирование - способ тестирования, при котором тестирование выполняется автоматически с использованием специальных инструментов.
Я постарался описать не все виды тестирования, а те, с которыми, на мой взгляд, чаще всего сталкиваются начинающие разработчики. Если вам интересно углубиться в тему, вот неполный список других видов тестирования:
Список
Тестирование безопасности (Security Testing)
Тестирование доступности (Accessibility Testing)
Тестирование совместимости (Compatibility Testing)
Тестирование локализации (Localization Testing)
Тестирование отказоустойчивости (Fault Tolerance Testing)
Тестирование масштабируемости (Scalability Testing)
Тестирование надежности (Reliability Testing)
В преддверии старта специализации Fullstack Developer от OTUS хочу порекомендовать вам несколько бесплатных уроков, которые будут полезны начинающим fullstack-разработчикам.