Тестирование – важная часть процесса разработки, во время которой выявляются проблемы в работе нового и уже существующего функционала.
Где в качественном продукте место тестированию? Как тест-дизайн сокращает время и баги? Входите ли вы в 10% счастливчиков, которые делают всё правильно? Почему команда всегда не права и как парадокс пестицида в сельском хозяйстве связан с ошибками в ПО? В рамках цикла статей расскажем о тестировании в самых разных его аспектах: от основ и принципов до техник тест-дизайна и рекомендаций по документированию.
Это первая статья и в ней мы собрали основную информацию о тестировании, его целях, видах, методах оценки, а также рассмотрели понятие дефекта. Будет полезно прочесть всем, кто в своей работе так или иначе сталкивается с тестированием, в том числе аналитикам и консультантам. Можно пользоваться и как стартовым материалом в начале изучения темы, и для того, чтобы просто освежить знания.
Что такое тестирование?
Тестирование имеет множество видов и аспектов, соответственно, выделить для него единственно верное определение было бы невозможно. Говоря коротко, это проверка ПО на соответствие требованиям и качеству. В этой статье мы будем опираться на понятийный стандарт ISTQB[1].
Итак, тестирование - процесс, содержащий все активности жизненного цикла программного обеспечения, как динамические, так и статические, касающиеся планирования, подготовки и оценки компонента или системы и связанных с этим результатом работ с целью определить, что они соответствуют описанным требованиям, показать, что они пригодны для заявленных целей и для определения дефектов.
Из этого определения логично проистекает несколько важных признаков тестирования:
Мы в Акелоне любим всё, что связано с качеством. С особенной любовью создаём и масштабируем системы для комплексной цифровизации фармацевтической системы качества. Поэтому вот на этом утверждении ISTQB хотим сделать акцент: тестирование является основным видом контроля качества (QC), который, в свою очередь, является частью обеспечения качества (QA).
Контроль качества (QC) — это корректирующий подход, ориентированный на продукт, который сосредотачивается на действиях, поддерживающих достижение надлежащего уровня качества.
Обеспечение качества (QA) — это превентивный подход, ориентированный на процесс, который сосредотачивается на внедрении и улучшении процессов.
В контроле качества (QC) результаты тестов используются для исправления дефектов, а в рамках обеспечения качества (QA) они обеспечивают обратную связь – насколько хорошо выполняются процессы разработки и тестирования.
Ниже мы обязательно познакомим вас с международным стандартом целей, но говоря человеческим языком, представьте, что большая команда из РП, аналитиков, разработчиков создала продукт, выкатила на прод, а пользователь выявляет баг, - причем он может вообще не иметь отношения к разработке, а, например, касаться соответствия юридическим требованиям (знакомо тем, кто работает с госкомпаниями). Как следствие: баг напрягает команду и часто портит репутацию продукта и компании. Цель – минимизировать ошибки. Проще подключить тестировщика, который заранее их выявит. А вот так звучат типичные, но далеко не исчерпывающие цели его работы на языке международных стандартов ISTQB:
В зависимости от контекста в конкретной ситуации перечисленные выше цели могут различаться. Контекст включает в себя:
Все эти факторы определяют, как именно будут расставлены приоритеты в тестировании и какие методы и инструменты будут использоваться для достижения целей.
Главный принцип – быть уверенным, что команда где-то, да ошиблась и найти эти баги как можно раньше. Здесь перечислим известные среди тестировщиков принципы в исчерпывающей и понятной формулировке ISTQB.
Тестирование программного обеспечения предназначено для выявления дефектов в продукте, но оно не способно доказать их полное отсутствие. Да, мы можем найти и устранить множество различных дефектов, ординарных и экзотичных, но никогда не можем быть уверены, что дефектов больше не осталось.
Таким образом, тестирование помогает минимизировать риск нахождения дефектов, но не исключает его полностью. Иными словами, дефекты в продукте есть всегда.
Этот принцип – логичное следствие предыдущего. Проведение полного тестирования, охватывающего все возможные комбинации данных, сценариев и условий, просто физически невозможно. За исключением самых тривиальных задач. Например, если у нас есть калькулятор, который выполняет только операцию сложения двух целых чисел в пределах 10, то в таком случае мы можем протестировать все варианты. Однако для более сложных систем попытка проверить все возможные сочетания условий потребует огромного количества времени и ресурсов.
Нельзя ставить целью тестирования «протестировать все». Иначе есть риск потерять много времени, а вместе с ним и денег, и при этом не получить гарантии полной работоспособности и надежности продукта.
Начало тестирования на ранних стадиях разработки позволяет значительно сократить время и затраты на устранение дефектов. Чем раньше дефект будет обнаружен и устранен, тем меньше рисков появления ошибок в будущем. За счет этого снижается общая стоимость обеспечения качества продукта, так как в дальнейшем в жизненном цикле программного обеспечения будет меньше отказов и сбоев.
В процессе тестирования часто обнаруживается, что большая часть дефектов сосредоточена в небольшом количестве компонентов системы. Это явление отражает принцип Парето, также известный как «правило 80/20». Согласно этому правилу, 80% результатов обусловлены 20% причин. В контексте тестирования программного обеспечения это означает, что 80% дефектов сосредоточены в 20% функций модулей системы.
Применяя этот принцип на практике, можно заметить, что наибольшее количество дефектов сконцентрировано не по всей системе равномерно, а в отдельных её частях. Например, если на странице авторизации часто возникают ошибки, это указывает на необходимость уделять данной части системы больше времени и ресурсов при тестировании. Понимание таких "горячих точек" помогает эффективно распределять усилия тестировщиков и концентрироваться на наиболее проблемных областях, что повышает общую эффективность тестирования.
Парадокс пестицида описывает ситуацию в сельском хозяйстве, когда использование пестицидов для уничтожения вредителей приводит к неожиданным последствиям: увеличению численности вредителей и развитию их устойчивости к пестицидам. Это происходит из-за того, что пестициды уничтожают не только вредителей, но и их естественных врагов, таких как хищные насекомые и паразиты. В результате численность вредителей может временно снизиться, но затем она начинает быстро расти, так как их естественные враги больше не могут контролировать их популяцию. Кроме того, оставшиеся в живых вредители могут развить устойчивость к пестицидам, что делает последующие применения все менее и менее эффективными.
Аналогично в тестировании программного обеспечения многократное повторение одних и тех же тестов может со временем стать менее эффективным для выявления новых дефектов. Это происходит, потому что система эволюционирует: исправленные дефекты исчезают, а новые появляются в других частях системы. Чтобы эффективно обнаруживать новые дефекты, необходимо адаптировать существующие тесты, обновлять тестовые данные и разрабатывать новые тесты.
Однако в некоторых случаях повторное выполнение одних и тех же тестов может быть полезным. Например, при регрессионном тестировании, которое помогает убедиться, что новые изменения не вызвали ошибок в существующем функционале.
Не существует единого универсального подхода к тестированию, который был бы эффективен во всех ситуациях. Методика и стратегия тестирования зависят от контекста, в котором разрабатывается и используется система.
Например, медицинское программное обеспечение требует более строгого и тщательного тестирования из-за потенциальных последствий для здоровья и жизни пациентов. В то же время, тестирование компьютерной игры может сосредотачиваться только на производительности, графике и пользовательском опыте.
Аналогично, нагрузочное тестирование веб-сайта, который используется для покупки билетов на концерт Майкла Джексона (если бы он был жив) будет критически важным, поскольку ожидается большой наплыв пользователей за короткий период времени. В то время как страница с описанием, как правильно "бить в баклуши", не требует такого интенсивного нагрузочного тестирования.
Тестирование – это не только верификация. Даже если продукт был полностью протестирован на соответствие всем требованиям, это не может гарантировать, что итоговый функционал подойдет конечному пользователю. Для того чтобы определить, выполняет ли продукт бизнес-задачи заказчика, удобен ли он для его целей, необходимо также проводить валидацию. Проще говоря, важно убедиться, что мы не только создали функционал таким, каким намеревались сделать его изначально, но и сделали его «правильным», удобным для пользователя.
В мировой практике существует огромное количество классификаций тестирования, однако в рамках данной статьи мы рассмотрим лишь основные, чтобы охватить ключевые аспекты.
Уровни тестирования – это группы активностей тестирования, которые организованы и управляются как единое целое. Запомнить их проще всего аббревиатурно - ПСИК .
Каждый уровень – это реализация процесса тестирования ПО, находящегося на конкретном уровне разработки, начиная с отдельных модулей и компонентов и заканчивая целыми системами.
Уровни тестирования обычно визуализируются в виде пирамиды, в которой виды тестирования расположены снизу вверх: от более мелких частей системы к самым объемным.
Компонентное тестирование (модульное тестирование, юнит-тестирование) фокусируется на тестировании отдельно взятых компонентов или модулей. Чаще всего выполняется разработчиками. Объектами тестирования в данном случае могут быть функции, методы, классы, то есть наименьшие части кода. Такой вид тестирования помогает выявить дефекты на самых ранних этапах разработки.
Интеграционное тестирование включает в себя два подвида: интеграционное компонентное тестирование и системное интеграционное тестирование.
Компонентное интеграционное тестирование (тестирование интеграции модулей) – проверка интерфейсов и взаимодействия между компонентами одной системы.
Системное тестирование фокусируется на поведении и возможностях системы или продукта целиком, часто включая функциональное тестирование сквозных задач и нефункциональное тестирование характеристик качества ПО.
Системное интеграционное тестирование – проверка интерфейсов тестируемой системы, взаимодействующих с другими системами и внешними сервисами. Это полное тестирование всей системы, состоящей из множества подсистем.
Приемочное тестирование – проверка и демонстрация готовности системы к развертыванию, что означает удовлетворение системой пользовательских бизнес-потребностей. Подразумевается, что такой вид тестирования выполняется будущими пользователями системы.
Как и в любом бизнес-процессе, в тестировании тоже нужен план. На мой взгляд, позволить себе работать без плана могут только QA-синьоры. Планирование тестирования определяет мышление тестировщиков и заставляет их решать будущие проблемы, связанные с рисками, расписанием, людьми, инструментами, затратами, усилиями и так далее.
Обычно содержание плана тестирования включает:
Критерии входа определяют предварительные условия для осуществления запланированных работ. Они включают в себя
Критерии выхода определяют, что должно быть достигнуто для того, чтобы объявить запланированные работы завершенными, и состоят из:
Критерии входа и критерии выхода должны быть определены для каждого уровня тестирования и будут отличаться в зависимости от целей тестирования.
Когда тестовые сценарии и процедуры тестирования определены и собраны в наборы тестов, эти наборы необходимо расположить в соответствии с расписанием тестирования. Расписание, в свою очередь, определяет порядок, в котором тесты должны запускаться.
Наиболее часто используемые следующие стратегии определения приоритетов тестовых сценариев:
Теперь разберем понятие дефекта, которое часто может пониматься по-разному.
Роман Савин в своей книге «Тестирование дот ком, или пособие по жесткому обращению с багами в интернет стартапах» отметил: «Дефект — это отклонение фактического результата от ожидаемого результата».
Это определение прекрасно отражает основную суть: дефекты возникают там, где наши ожидания сталкиваются с реальностью, а реальность оказывается совсем не такой, как мы предполагали.
Однако не совсем корректно говорить о дефекте только как об отклонении между ожиданиями и фактическим результатом. Наши ожидания всегда регламентируются чем-либо — требованиями, спецификациями, стандартами и т.д. Именно они и служат основой для определения того, что считать дефектом.
Исходя из этого, одним из наиболее точных отражений сути дефекта может быть следующее определение:
Дефект — это недостаток рабочего продукта, проявляющийся в несоответствии требованиям или спецификациям, и ухудшающий целевое использование этого продукта.
Важно отметить, что ожидаемый результат, в свою очередь, не всегда строго определён в документации. Например, никто не описывает в требованиях базовые действия, такие как «при нажатии на кнопку программа не должна зависать», поэтому помимо документации необходимо основываться еще и на опыте и здравом смысле.
Таким образом, дефект — это недостаток, который может существенно повлиять на функциональность, надежность и удобство использования продукта. Поэтому своевременное выявление и устранение таких недостатков критически важно не только для конечных пользователей, но и для бизнеса в целом.
Далее разберем термины, которые тем или иным образом связаны с дефектами. На первый взгляд они могут показаться похожими, но в действительности описывают разные аспекты отклонений в работе системы.
Ошибка – это действие человека, которое приводит к некорректным результатам. Ошибки совершают разработчики, тестировщики, аналитики — все участники процесса. Причины этих ошибок могут быть самыми разными: нехватка времени, сложность задачи, усталость или недостаток подготовки. Важно помнить, что ошибки — это естественная часть любого рабочего процесса, особенно в сложных проектах.
Сбой — это кратковременная проблема, которая устраняется без серьёзного вмешательства. Например, временный разрыв соединения с сервером, после чего повторная попытка завершается успешно.
Отказ, в отличие от сбоя, это событие, при котором система теряет работоспособность. Например, модуль интеграции с внешней системой перестаёт работать, полностью нарушая процесс отправки документов.
Ошибки порождают дефекты. Дефекты — это уже последствия ошибок, которые могут проявляться в документации, коде или конфигурациях. Например, если разработчик пропустил проверку на обязательное поле, то есть совершил ошибку, то система позволит отправить документ без этого поля — это дефект, который может в свою очередь привести к сбоям в бизнес-процессе. Но не каждый дефект ведёт к сбоям или отказам. Существуют и внешние факторы, например, электромагнитные помехи или сбои оборудования. Эти события могут нарушить работу программного обеспечения, даже если в системе нет дефектов.
Все эти явления объединяет то, что они являются аномалиями – отклонениями от ожидаемого поведения системы.
_______________________________________________________
Итак, на десяти страницах мы изложили всё, что нужно для старта в тестировании или для того, чтобы освежить взгляд на процесс, если «глаз замылился». Мы постарались собрать воедино основной теоретический материал, связанный с тестированием, и объяснить его на понятных примерах.
Возможно, в статье не хватает кейсов и именно поэтому мы просим вас подключиться к комментированию и привести свои примеры.
В следующих статьях цикла аналитики и тестировщики Акелона расскажут о техниках тест-дизайна и тестовой документации.
Материал для вас подготовила
Полина Пахомова, консультант "Акелона".
[1] ISTQB – некоммерческая организация, занимающаяся сертификацией тестировщиков программного обеспечения и отвечающая за международную квалификацию «Сертифицированный тестировщик ISTQB». Это крупнейшая организация в области сертификации тестировщиков программного обеспечения, представленная более чем в 100 странах.
Авторизуйтесь, чтобы написать комментарий