Тестирование ПО = процесс исследования/испытания ПО, имеющий своей целью проверку соответствия между реальным и ожидаемым поведением ПО на конечном наборе тестов, выбранных определённым образом (ISO/IEC TR 19759:2005).
Цель тестирования или цель разработки и выполнения тестов:
Задача QC (Quality Control, контроль качества) — контроль и фиксация качества производимых артефактов, промежуточных и конечных результатов работы. Его цель заключается в поисках дефектов и обеспечении их исправления. Таким образом тестирование является неотъемлемой частью контроля качества.
Здесь очень подходит термин Verification с вопросом "Are we building the product right?" — правильно ли мы делаем продукт, проверяется соответствие планам, спецификациям, дизайну, правилам составления кода, проход тест-кейсов. Проверяем CORRECTNESS.
QA (Quality Assurance, обеспечение качества) = часть менеджмента качества, ориентированная на создание и настройку процессов, целью которых является обеспечение гарантии того, что требования к качеству будут выполнены (продукт будет соответствовать ожиданиям качества заказчика).
Состоит из процессов/действий, направленных на обеспечение качества разработки продукта на каждом из его этапов. Эти действия, как правило, предшествуют развитию продукта и продолжаются, пока процесс пребывает в состоянии развития. На самом QA лежит ответственность за разработку и внедрение процессов и стандартов для улучшения жизненного цикла разработки ПО (SDLC), и обеспечение уверенности в том, что эти процессы выполняются. Фокусом QA является предотвращение дефектов на всех этапах его реализации и постоянное его совершенствование.
Занимается вопросами "а какие виды и методы тестирования мы будем использовать?", "как будем измерять качество?" и т.п.
Здесь очень подходит термин Validation с вопросом "Are we building the right product?" — правильный ли продукт мы делаем, удовлетворяет ли продукт нуждам пользователя. Проверяем COMPLETENESS.
Чтобы предоставляемые услуги имели ценность, необходимо, чтобы тестирование было нацелено на проверку функций, которые:
Обычно юнит-тест передаёт функции различные входные данные и проверяет, что она вернёт ожидаемый результат. Например, если у нас есть функция проверки правильности номера телефона, мы даём ей заранее подготовленные номера и проверяем, что она определит их правильно. Если у нас есть функция решения квадратного уравнения, мы проверяем, что она возвращает правильные корни (для этого мы заранее делаем список уравнений с ответами).
Выполняется разработчиками, зачастую методом автоматизированного тестирования.
Интеграционное тестирование (Integration testing) = проверка связи между модулями (компонентами) кода, а также взаимодействия с различными частями системы (операционной системой, оборудованием либо связи между различными системами). Если проводить аналогии, например с тестированием авиадвигателя, то юнит-тесты — это тестирование отдельных деталей, клапанов, заслонок, а интеграционное тестирование — это запуск собранного двигателя на стенде.
Выполняется разработчиками, зачастую методом автоматизированного тестирования.
Системное тестирование (System testing) = процесс тестирования системы в целом с целью проверки того, что она соответствует установленным Спецификациям к Требованиям к ПО (SRS).
Удостовериться, что Система умеет принять какие-то данные от поставщиков, обработать их, передать данные потребителям, всё это в правильной последовательности и формате. Дальнейшая судьба данных нас не волнует. Главное — наша система работает правильно в правильном окружении.
При этом выявляются дефекты как: неверное использование ресурсов системы, непредусмотренные комбинации данных пользовательского уровня, несовместимость с окружением, непредусмотренные варианты использования, отсутствующая или неверная функциональность, неудобство использования и т.д.
Для минимизации рисков, связанных с особенностями поведения в системы в той или иной среде, во время тестирования рекомендуется использовать окружение максимально приближенное к тому, на которое будет установлен продукт после выдачи.
Подробнее этот вид тестирования рассмотрен тут.
Тестирование API (API testing) = процесс тестирования приложения (сервиса) с целью проверки того, что реализация внешних интерфейсов соответствует установленным требованиям.
Тестирование API можно отнести и к интеграционному тестированию и к системному, в зависимости от того что мы в рамках своей задачи считаем тестируемой системой (SUT, system under testing) — отдельный сервис или некую платформу как совокупность сервисов.
Как обычно происходит — вызываем методы API, сверяем реакцию на корректность (логику самого метода, ответные данные, бизнес-логику "за" методом). Подробнее здесь.
Приёмочное тестирование (Acceptance testing) или Приёмо-сдаточные испытания (ПСИ) — формальный процесс тестирования, который проверяет соответствие системы Бизнес/Пользовательским требованиям и проводится с целью: определения удовлетворяет ли система приёмочным критериям, вынесения решения заказчиком или другим уполномоченным лицом принимается приложение или нет. Выполняется на основании набора типичных тестовых случаев и сценариев, разработанных на основании требований к данному приложению.
Сквозное тестирование (End-To-End, E2E или Chain testing) = проверка некоей функциональности (фичи Продукта, услуги) по всему клиентскому сценарию: от инициирующих действий Клиента (либо клиентского приложения) через все задействованные в цепочке системы нашего Продукта до предоставления Клиенту результата.
Для сквозных сценариев при большом количестве систем частенько используется последовательность из уже ранее разработанных тестов для каждой из систем, где конец одного теста есть логическое начало следующего.
Мартин Фаулер предупреждает о том, что написание и поддержка E2E-тестов достаточно дороги, а значит:
Основные группы тестирования | |
---|---|
функциональная группа |
нефункциональная группа |
|
|
тестирование связанное с изменениями (включают и функциональные и нефункциональные тесты) | |
|
Функциональные тесты базируются на функциях и особенностях, а также взаимодействии с другими системами, и могут быть представлены на всех уровнях тестирования: компонентном или модульном (Component/Unit testing), интеграционном (Integration testing), системном (System testing) и приёмочном (Acceptance testing). Функциональные виды тестирования рассматривают внешнее поведение системы.
Нефункциональное тестирование описывает тесты, необходимые для определения характеристик программного обеспечения, которые могут быть измерены различными величинами. В целом, это тестирование того, "Как" система работает.
Функциональные тесты основываются на функциях, выполняемых системой, и могут проводиться на всех уровнях тестирования (компонентном, интеграционном, системном, приёмочном). Как правило, эти функции описываются в требованиях, функциональных спецификациях или в виде вариантов использования системы (use cases).
Функциональное тестирование бывает:
Позитивное тестирование является гораздо более важным, но это не означает, что "негативными" тестами можно пренебречь.
Подробнее о позитивном/негативном тестировании: https://guru99.com/positive-and-negative-testing.htmlТестирование безопасности — это стратегия тестирования, используемая для проверки безопасности системы, а также для анализа рисков, связанных с обеспечением целостного подхода к защите приложения, атак хакеров, вирусов, несанкционированного доступа к конфиденциальным данным.
Сканирование на предмет наличия уязвимостей (Vulnerability Scanning): Выполняется с помощью специальных программ-сканеров уязвимостей.
Сканирование безопасности (Security Scanning): Включается в себя идентификацию сетевых и системных недостатков (слабых мест), а затем предоставляет решения для сокращения таких рисков.
Тест на проникновение (Penetration testing): симулирует нападение злоумышленника. Это тестирование включает анализ конкретной системы с целью проверить потенциальную уязвимость к внешним попыткам взлома.
Оценка риска (Risk Assessment): включает в себя анализ рисков безопасности, наблюдаемых в организации. Риски классифицируются как слабые (low), средние (medium) и высокие (high). Этот вид тестирования рекомендует методы контроля и снижения рисков.
Тестирование ролевой модели = тестирование системы с точки зрения пользователя, наделённого правами доступа к функциям и данным системы согласно ролевой модели, заданной в этой системе.
Тестирование ролевой модели относится к функциональной группе, при этом частично пересекаясь по своему смыслу с тестированием безопасности.
Во многих системах существует ролевая модель, в самом банальном исполнении это администратор и простой пользователь. В какой-нибудь банковской системе это может быть администратор, клиент, оператор, андеррайтер, специалист отдела X, Y, Z и т.д. В какой-нибудь системе складского учёта это может быть администратор, начальник склада, заместитель начальника склада, кладовщик, грузчик.
Каждая роль наделена определённым уровнем прав доступа к тем или иным функциям в АС (автоматизированной системе, ПО), к чтению/изменению/удалению данных на формах GUI, настройкам самой системы и т.п.
В общем случае, тестирование ролевой модели подразумевает проверку того, что пользователю, имеющему в рамках системы такую-то роль:
Тестирование производительности = автоматизированное тестирование, имитирующее работу определённого количества пользователей на каком-либо общем (разделяемом ими) ресурсе. Задачей тестирования производительности является определение масштабируемости приложения под нагрузкой, при этом происходит:
Стрессовое тестирование (stress testing) = тестирование приложения под экстремальными нагрузками, определение способности обрабатывать высокий уровень траффика или обработки данных. Целью является определить переломную точку приложения.
Задачей тестирования стабильности (stability) / надежности (reliability) — является проверка работоспособности приложения при длительном (многочасовом) тестировании со средним уровнем нагрузки. Время выполнения операций может играть в данном виде тестирования второстепенную роль. При этом на первое место выходит отсутствие утечек памяти, перезапусков серверов под нагрузкой и другие аспекты влияющие именно на стабильность работы.
Тестирование выносливости (endurance testing) = убеждение в том, что приложение может безопасно находиться под высокими нагрузками долгий период времени.
Объёмное тестирование (volume testing) = получение оценки производительности при увеличении объёмов данных в базе данных приложения.
Тестирование на отказ и восстановление (Failover and Recovery Testing) проверяет тестируемый продукт с точки зрения способности противостоять и успешно восстанавливаться после возможных сбоев, возникших в связи с ошибками программного обеспечения, отказами оборудования или проблемами связи (например, отказ сети). Целью данного вида тестирования является проверка систем восстановления (или дублирующих основные функции систем), которые, в случае возникновения сбоев, обеспечат сохранность и целостность данных тестируемого продукта.
Тестирование на отказ и восстановление очень важно для систем, работающих по принципу "24x7", например интернет-магазины, ERP-системы.
Дымовые тесты выполняются каждый раз, когда мы получаем новый билд (версию), проекта (системы) на тестирование, при этом считая её относительно нестабильной. Нам нужно убедиться что критически важные функции Приложения/Системы работают согласно ожиданиям. Идея данного вида тестирования заключается в том, чтобы выявить серьёзные проблемы как можно раньше, и отклонить этот билд (вернуть на доработку) на раннем этапе тестирования, чтобы не углубляться в долгие и сложные тесты, не затрачивая тем самым время на заведомо бракованное ПО.
Проверка того, что ранее обнаруженный при тестировании дефект был успешно исправлен.
Используется каждый раз, когда мы получаем относительно стабильный билд ПО, чтобы определить работоспособность в деталях. Иными словами, здесь проходит валидация того, что важные части функциональности системы работают согласно требованиям на низком уровне.
Проводится для того, чтобы убедиться что добавленные/изменённые функции приложения и исправленные дефекты не оказали негативного влияния на уже успешно действующую в Проме функциональность.
РТ занимает львиную долю времени, и как раз для сокращения затрат и существует автоматизация тестирования.
У нас есть веб-сервис с пользовательским интерфейсом и RESTful API. Будучи тестировщиками, мы знаем:
Тогда можно сделать ряд утверждений о том, какие типы тестов нужно использовать в какой момент времени:
Ручное (manual testing) = выполнение тестировщиком тестовых сценариев и тестовых случаев вручную.
К автоматизации тестирования (automation testing) существуют следующие основные подходы:Баг репорт (bug report) = документ, описывающий ситуацию или последовательность действий, приведшую к некорректной работе объекта тестирования, с указанием причин и ожидаемого результата.
Составлять следует стремиться так, чтобы по названию или краткому описанию бага (summary) разработчик понял в чём соль проблемы, а прочитав детальное описание бага (description) он примерно представлял в в каком компоненте или даже его части ему надо искать ошибку.
Значимость/серьёзность (severity) ошибок | |||
---|---|---|---|
0 | остановка системы | server down | остановка работы системы |
1 | Потеря данных | data loss | Потеря пользовательских, операторских, системных данных |
2 | Потеря функциональности | functional loss | Блокирование основной функциональности. Могут включать в себя нефункциональные проблемы, например связанные с производительностью, которые вызывает неприемлемые задержки в использовании функций |
3 | Дыра в безопасности | security loss | |
4 | Потеря функциональности с наличием обходного пути | functional loss but alternate path exists | Блокирование основной функциональности, но для пользователя существует разумный обходной путь |
5 | Частичная потеря функциональности | partial functionality loss | Блокирование использования некоторой несущественной функциональности |
6 | Косметическая ошибка | cosmetic error | Значительные недостатки в пользовательском интерфейсе или в способности системы реагировать на запросы пользователя |
Тестировщики должны защищать качество и мнение пользователей о системе. Но они не должны это делать, выступая в качестве соперников программистов, выдвигая претензии личного характера или в неконструктивной манере. Предпочтительнее, если мы будем это делать путём, объединяющим реалии бизнеса с системной разработкой и сопровождением.
Структура понятного названия таска:
<Где (название страницы)> : <Какой элемент/функция страницы> - <суть ошибки/задания>
Catalog Editor: Copy — not all existing catalogs shown in "select catalog" combobox
или Catalog Library -> Duplicate Catalog — If 'Use audience' option is marked, 'Shared with' data must be copied to the new catalog>
это годные названия. Ради того чтобы понять насколько проблема велика и срочна — не нужно открывать этот issue.
"Organizer", "Catalog properties page" — за такие названия тасков всего 400 лет назад отправляли на костёр. Потому что из него не понятно в чём суть, "ну page, ну и что, в чём проблема-то??".
DO: ("ДЕЙСТВИЯ", "ШАГИ ВОСПРОИЗВЕДЕНИЯ")
Укажите последовательность действий, поведайте — что именно было сделано вами для достижения того состояния системы, при котором вы столкнулись с ошибкой
RESULT: ("РЕЗУЛЬТАТ:")
Опишите последствия ваших действий, расскажите, что случилось, когда достигнута "точка невозвращения" и как баг проявляет себя
EXPECTED RESULT: ("ОЖИДАЕМЫЙ РЕЗУЛЬТАТ:")
Описание ожидаемого поведения системы при прохождении пользователем шагов, указанных в "DO". Ожидаемый результат должен соответствовать требованиям заказчика описанным документации либо здравому смыслу. Разработчик должен знать что ему надо сделать.
ADDITIONAL INFO: ("ДОПИНФО:")
Чтобы сделать хороший баг-репорт отличным — используйте любую возможность дополнить его, как то:
в проекте JIRA:
в Test Adaptavist, связанном с этим проектом: