Что такое тестирование ПО
Допустим, не так давно вы создали приложение, которое помогает пользователям распланировать свой день. Вы интегрировали списки дел с динамическими обновлениями погоды и напоминаниями, привязанными к геоположению. Однако прежде, чем поделиться этим приложением с миром, следует убедиться в идеальной работе всех функций - от синхронизации с метеосервисами до триггера напоминаний, когда пользователь оказывается в нужном месте.
Для этих целей вы обращаетесь к тестированию ПО: оцениваете функционал приложения и проверяете, что при разных условиях оно будет работать корректно. В итоге смысл не в том, чтобы найти баги или дефекты; нужно убедиться в надежном функционировании приложения и его соответствии заявленным требованиям.
Это как тест-драйв машины перед покупкой. Вы хотите проверить, что в машине все работает, она легка в управлении и не рассыпется сразу после выезда с парковки. Но вернемся к примеру с программой-планировщиком. Тут вам стоит проверить, смогут ли пользователи добавлять, удалять или отмечать задачи выполненными. Кроме того, не лишним будет протестировать, как поведет себя приложение при внезапном отключении, или если кто-то попытается добавить тысячу задач одновременно.
Зачем нужно тестирование?
Допустим, вы решили не проводить тестирование и сразу запустили свой планировщик. Сначала у каких-то пользователей все было хорошо, а потом внезапно поддержку завалили жалобами, потому что у пользователей теряются сохраненные задачи, при каких-то сценариях приложение выключается и т.д. А что вы получаете в итоге? Разочарованных пользователей, плохие отзывы и, возможно, подпорченную репутацию бренда.
Тестирование помогает избегать таких сценариев, отлавливая ошибки до того, как их заметят пользователи. Это что-то вроде вычитки книги перед публикацией: важно убедиться, что продукт безупречен и готов к релизу. Поэтому тестирование гарантирует, что ваш продукт:
- надежно работает в ожидаемых и непредвиденных ситуациях;
- обеспечивает хороший пользовательский опыт, сохраняя лояльность клиентов;
- соответствует бизнес-целям и заявленным требованиям.
На чем базируется тестирование ПО
В основе тестирования программного обеспечения лежит ряд ключевых принципов, которым подчиняется весь процесс:
- Тестируйте рано и часто. Чем раньше начнете тестировать, тем проще устранить ошибки. Например, если не ждать готовности приложения, а тестировать сразу, как только доделаете какой-то функционал, то можно изрядно сэкономить время и силы.
- Нельзя протестировать все. Исчерпывающее тестирование – это непрактично, особенно если говорить о сложных программах. В итоге, вместо того, чтобы проверять всевозможные комбинации входных данных, лучше сконцентрируйтесь на ключевых задачах (например, убедитесь, что пользователи точно смогут сохранять задачи в приложении).
- Парадокс пестицида. Если постоянно выполнять одни и те же тесты, то вы, скорее всего, отловите самые очевидные баги, но пропустите другие ошибки. Например, постоянно тестируя приложение с одинаковыми входными данными (допустим, с пятью задачами), вы не сможете отследить ошибки, которые возникнут у пользователей при добавлении сотен задач. Чередуйте разные тесты и выявляйте разные проблемы.
- Скопление дефектов. Баги часто кучкуются в группах, то есть в каких-то частях программы ошибок больше. Поэтому если вы найдете баг в каком-то функционале (например, при удалении задачи), то лучше основательно покопаться в нем и поискать другие проблемы.
Чего можно достичь с помощью тестирования
Эффективное тестирование программного обеспечения позволяет уверенно запускать продукт в массы, потому что вы понимаете: он – надежен. Вот, чего вы сможете достичь:
- Меньше багов в продакшне. Отловить ошибки на ранних этапах означает создать меньше проблем для пользователей в дальнейшем.
- Довольные клиенты. Плавный опыт, без ошибок – это довольные пользователи, которые с большей долей вероятности останутся с вами.
- Снижение затрат. Исправить ошибку во время разработки гораздо дешевле, чем сделать это после запуска продукта.
- Повышение безопасности. При тестировании можно найти уязвимости в системе безопасности, которые могли бы привести к раскрытию пользовательских данных или совершению вредоносных атак.
Представим ситуацию: мы тестируем функцию в приложении. Допустим, она нужна для синхронизации пользовательских задач между устройствами. Тщательно протестировав ее на Android или iOS, мы будем уверены в том, что задачи пользователя никуда не денутся, даже если он переключится с телефона на планшет. В итоге все это ведет к более плавному и приятному опыту.
Что случится, если не тестировать ПО
Давайте разберем такой сценарий: мы решили обойтись без тестирования и сразу выпустили свое приложение. Сначала пользователи в восторге, но уже через неделю возникают проблемы, потому что:
- приложение выключается. При каждой попытке пользователей удалить завершенные задачи, приложение внезапно закрывается.
- теряются данные. Пользователи сообщают, что иногда после закрытия и повторного открытия приложения задачи пропадают.
- бреши в безопасности. Кое-кто из продвинутых пользователей замечает, что из-за утечки данных, может получить доступ к чужим спискам задач.
Без надлежащего тестирования как раз и возникают такие проблемы, что ведет к плохим отзывам, потере клиентов, а в случае с брешами в безопасности – возможным юридическим проблемам.
Преимущества тестирования
Недостатки тестирования
Типы и уровни тестирования
Существует несколько уровней и типов тестирования. Каждый из них проводится с определенной целью - обеспечить корректную работу вашей системы.
Типы тестирования:
- Функциональное тестирование. Проверяет, что все основные функции программы работают так, как нужно. Для приложения-планировщика мы протестируем, что пользователи могут добавлять, изменять и удалять задачи.
- Тестирование производительности. Измеряет, насколько хорошо работает ПО в разных условиях. Например, как поведет себя планировщик, если в него одновременно добавят сотни задач. Будет ли он тормозить? Отключаться?
- Тестирование безопасности. Гарантирует безопасность и отсутствие уязвимостей в приложении. Эффективно ли приложение защищает пользовательские данные? Может ли оно противостоять попыткам взлома?
- Юзабилити-тестирование. Оценивает пользовательский опыт. Легко ли ориентироваться в приложении? Будет ли оно интуитивно понятным для пользователя?
Уровни тестирования:
- Модульное тестирование. Тестируются отдельные компоненты или части кода. Например, тестируется функция для добавления новой задачи и проверяется независимость ее работы.
- Интеграционное тестирование. Проверяется совместная работа разных компонентов. Например, тестируется слаженная работа планировщика при синхронизации задач между устройствами.
- Системное тестирование. Проверяется корректность системы в целом. Отвечает ли приложение общим требованиям и справляется ли оно со всевозможными реальными задачами?
- Приемочное тестирование. Перед релизом еще раз проверяется, что программа соответствует бизнес-требованиям и потребностям пользователей.
Автоматизированное и ручное тестирование
Остается еще одно важное решение при тестировании, потому что нужно выбрать: ручное, автоматизированное, или оба сразу
Ручное тестирование:
При ручном тестировании тестировщики (люди) выявляют проблемы в процессе работы в приложении:
- Исследовательское тестирование. Тестировщики изучают возможности программы в произвольном порядке, параллельно выявляя баги.
- Юзабилити-тестирование. Цель тестирования - пользовательский опыт и обратная связь.
В примере с программой-планировщиком ручной тестировщик проверит, насколько интуитивно понятен интерфейс приложения, и все ли функционирует так, как надо.
Автоматизированное тестирование:
В автоматизированном тестировании тест-кейсы выполняются автоматически через скрипты и инструменты. Идеально для:
- регрессионного тестирования: проверка работоспособности старого функционала при добавлении нового кода.
- нагрузочного тестирования: тестируется работа системы при нагрузке (моделируется наплыв пользователей или большой объем данных).
- Регрессионное тестирование: обеспечение работоспособности старых функций после добавления нового кода.
В итоге через автотесты можно систематически проверять, что добавление, сохранение и синхронизация задач в нашем планировщике происходят без ошибок.
Когда и кто тестирует ПО
Бытует ошибочное мнение о том, что программное обеспечение тестируется только в конце разработки. Однако тестирование - это непрерывный процесс, который следует внедрять на каждом этапе жизненного цикла разработки ПО (SDLC - от англ. Stage of Software Development Lifecycle). Давайте разберемся, когда проводится тестирование, и кто за него отвечает.
Когда проводится тестирование ПО
Программное обеспечение тестируют на разных этапах разработки, а не только в конце. Вот, как тестирование вписывается в классические стадии цикла разработки:
1. На этапе сбора требований
Разработчики еще не начали писать код, а тестировщики уже могут сесть с ними и бизнес-аналитиками и разобраться в требованиях к системе. Потому что так будет проще создавать тест-кейсы, через которые проверят соответствие продукта бизнес-требованиям и нуждам пользователей.
Пример с планировщиком: написать тесты для проверки программы на соответствие проектным требованиям: добавлять, сохранять, удалять и синхронизировать задачи.
2. В процессе разработки
Разработчики пишут код и запускают модульные и интеграционные тесты, проверяя, что отдельные компоненты программы работают должным образом.
Пример с планировщиком: написать функционал «Добавить задачу», протестировать его, проверить корректность работы, и в итоге только потом переходить к другим разделам.
3. После разработки (системное тестирование)
Если программа уже готова, приступают к тестированию на уровне системы, проверяя слаженную работу всех компонентов.
Пример с планировщиком: проверить, получится ли у пользователей добавлять по несколько задач. Затем синхронизировать задачи между устройствами и найти любые узкие места в производительности
4. Перед релизом (приемочное тестирование)
На этом этапе выполняется пользовательское приемочное тестирование (UAT-тесты). Проверяют, что программа соответствует бизнес-целям и готова к практическому использованию. Чаще всего это финальная стадия тестирования перед релизом.
Пример с планировщиком: дать группе пользователей протестировать приложение и оценить, насколько оно соответствует их потребностям, а также корректно ли работает планировщик при разных сценариях.
5. После развертывания (эксплуатационное тестирование)
Тестирование не прекращается даже после релиза программы. Особенно при выходе обновлений и появлении новых функций. Через регрессионные тесты отслеживают, чтобы новые изменения не затронули уже существующий функционал.
Пример с планировщиком: При добавлении новой функции (например, напоминалки о задаче) протестировать, что существующий функционал планировщика по-прежнему работает без сбоев.
Кто тестирует ПО
В тестирование программного обеспечения вовлечено несколько ролей, и каждая занимается чем-то своим. Ниже перечислены ответственные за тестирование на разных стадиях:
1. Разработчики:
- Модульное тестирование. Разработчики пишут и проводят модульные тесты, проверяя корректную работу отдельных функций и модулей. Как правило, данный тип тестирования автоматизирован.
- Интеграционное тестирование. Еще разработчики выполняют интеграционное тестирование. Они проверяют слаженную работу различных модулей системы.
- Пример с планировщиком: разработчик, работающий над функционалом “добавить задачу”, сначала пишет модульные тесты и проверяет корректную работу этой функции, и только потом интегрирует ее с остальной частью системы.
2. QA-тестировщики (обеспечение качества):
- Функциональное тестирование. QA-тестировщики проверяют, соответствует ли функционал ПО заявленным требованиям..
- Ручное и исследовательское тестирование. QA-тестировщики вручную тестируют приложение и выискивают баги, которые могли пропустить автотесты.
- Регрессионное тестирование. QA-тестировщики часто проводят регрессионные тесты, проверяя, что новые обновления не поломают существующий функционал.
- Пример с планировщиком: QA-тестировщик проверяет, может ли пользователь удалить задачу и отменить это удаление. Приложение должно без проблем отработать этот процесс на разных устройствах..
3. Автоматизаторы тестирования (инженеры по автоматизированному тестированию):
- Автоматизированное тестирование. Эти специалисты разрабатывают и пишут сценарии для автоматизации повторяющихся задач (особенно в регрессионном тестировании и тестировании производительности).
- Пример с планировщиком: автоматизатор может написать сценарий, чтобы протестировать производительность планировщика при быстром добавлении/удалении тысяч задач.
4. Конечные пользователи или бизнес-пользователи (UAT):
- Приемочное тестирование (UAT). До официального запуска продукта конечные пользователи тестируют его на реальных сценариях и проверяют на соответствие пользовательским потребностям.
- Пример с планировщиком: на этапе UAT вы можете дать доступ к планировщику бизнес-пользователям или небольшой группе конечных пользователей. Они проверят, что приложение удобно в работе и соответствует их потребностям.
5. Эксперты по безопасности (тестирование безопасности):
- Пентестеры. Эти специалисты выявляют уязвимости в безопасности. Чтобы найти слабые места в защите, пентестеры пользуются методами, которые имитируют кибератаки.
- Пример с планировщиком: эксперт по безопасности попытается взломать приложение и получить доступ к спискам задач пользователей, либо их личной информации. Так он проверит и убедится в безопасности вашего приложения.
6. Тестировщики производительности:
- Нагрузочное и стресс-тестирование. Эти тестировщики анализируют, насколько хорошо программное обеспечение работает в разных условиях (высокая нагрузка со стороны пользователей, ограниченные ресурсы системы и т.д.).
- Пример с планировщиком: тестировщик проверит, будет ли тормозить или отключаться программа, если сымитировать одновременный доступ сотен или тысяч пользователей.
Когда лучше проводить разные виды тестирования
Вот краткое руководство о том, когда лучше использовать те или иные виды тестирования на стадиях цикла разработки:
- Модульное тестирование: во время разработки; выполняется разработчиками.
- Интеграционное тестирование: по мере готовности разных модулей; обычно проводится разработчиками или автоматизаторами тестирования.
- Функциональное и системное тестирование: как только готова полная версия ПО; выполняется QA-тестировщиками.
- Тестирование производительности и безопасности: когда система почти доделана; проводится специализированными тестировщиками.
- Приемочное тестирование: перед выходом продукта; участвуют реальные конечные пользователи и бизнес-пользователи.
- Регрессионное тестирование: после каждого выхода обновлений или исправления ошибок; проверяют, что больше ничего не сломалось.
Заключение
Тестирование программного обеспечения – это не разовая задача, а постоянный процесс, который ведется на протяжении всего жизненного цикла разработки. Разработчики, QA-тестировщики, автоматизаторы, конечные пользователи и даже эксперты по безопасности – все они вносят свой вклад в обеспечение надежности, безопасности и приятного использования вашего продукта. Начиная с самых первых модульных тестов и заканчивая регрессионными после релиза, тестируя ПО вы получаете корректно работающий, функциональный продукт, который соответствует ожиданиям пользователей.
Информация написана на основе статьи «What Are The Fundamentals of Software Testing?».