Close

Различные виды тестирования ПО

Сравните разные виды тестирования ПО: модульное, интеграционное, функциональное, приемочное тестирование и другие варианты.

Фотография Стена Питтета
Стен Питтет

Приглашенный автор


Существует множество методов тестирования программного обеспечения, с помощью которых можно убедиться, что изменения в коде будут работать как ожидалось. Однако не все тесты равноценны, и в этой статье мы изучим различия основных методов тестирования.

Сравнение тестирования в ручном и в автоматическом режиме


Важно различать автоматическое тестирование и тестирование, выполняемое вручную. Тестирование в ручном режиме проводит человек, который проверяет работу всех функций приложения вручную либо путем взаимодействия с программным обеспечением и API посредством соответствующего инструментария. Это очень затратный способ, поскольку кто-то должен настраивать среду и проводить тесты. Кроме того, необходимо учитывать человеческий фактор, так как тестировщик может допустить опечатку или пропустить какой-либо этап тестового скрипта.

Автоматические тесты, напротив, выполняются машиной, которая использует заранее написанный тестовый скрипт. Такие тесты могут значительно различаться по сложности — от проверки одного метода в классе до обеспечения условий, в которых выполнение последовательности сложных действий в пользовательском интерфейсе приводит к одинаковым результатам. Такой подход гораздо стабильнее и надежнее по сравнению с тестами, выполняемыми вручную, однако качество автоматического тестирования зависит от качества тестовых скриптов. Если вы только начинаете внедрять тестирование, рекомендуем прочитать наше учебное руководство по непрерывной интеграции, которое поможет создать первый комплект тестов. Ищете дополнительные инструменты для тестирования? Ознакомьтесь с этими руководствами по тестированию DevOps.

Автоматическое тестирование является ключевым компонентом непрерывной интеграции и непрерывной поставки, а также отличным способом масштабировать процесс контроля качества по мере добавления новых возможностей в приложение. Однако проводить ручное тестирование в форме так называемого глубокого тестирования все равно имеет смысл, и в данном руководстве мы это продемонстрируем.

См. решение

Разработка и эксплуатация программного обеспечения с помощью Open DevOps

Связанные материалы

Автоматическое тестирование для DevOps

Виды тестирования


Модульные тесты

Модульные тесты работают на очень низком уровне, близко к исходному коду приложения. Они заключаются в тестировании отдельных методов и функций классов, компонентов или модулей, используемых в ПО. Модульные тесты, как правило, не требуют больших расходов на автоматизацию и могут выполняться сервером непрерывной интеграции очень быстро.

Интеграционное тестирование

В ходе интеграционного тестирования проверяется, хорошо ли работают вместе различные модули и сервисы, используемые приложением. Например, можно протестировать взаимодействие с базой данных или убедиться, что микросервисы работают вместе так, как задумано. Этот вид тестирования является более затратным, поскольку для проведения тестов требуется запуск различных компонентов приложения.

Функциональные тесты

В функциональных тестах основное внимание уделяется бизнес-требованиям к приложению. Они проверяют только результат некоторого действия и не проверяют промежуточные состояния системы при выполнении этого действия.

Иногда возникает путаница между понятиями интеграционных и функциональных тестов, так как и те и другие требуют взаимодействия нескольких компонентов друг с другом. Разница в том, что интеграционный тест нужен просто чтобы убедиться, что вы можете отправлять запросы к базе данных, тогда как функциональный тест будет ожидать получения из базы данных определенного значения в соответствии с требованиями продукта.

Сквозные тесты

Сквозное тестирование копирует поведение пользователя при работе с ПО в контексте всего приложения. Оно обеспечивает контроль того, что различные схемы действий пользователя работают должным образом. Сценарии могут быть как очень простыми (загрузка веб-страницы или вход в систему), так и гораздо более сложными (проверка почтовых уведомлений, онлайн-платежей и т. д.).

Сквозные тесты очень полезны, но их выполнение обходится довольно дорого, к тому же, когда они автоматизированы, такие тесты тяжело обслуживать. Рекомендуется иметь в наличии несколько основных сквозных тестов и активнее полагаться на более низкие уровни тестирования (модульные и интеграционные тесты), чтобы получать возможность быстро выявлять критические изменения.

Приемочное тестирование

Приемочные тесты — это формальные тесты, которые проверяют, отвечает ли система требованиям бизнеса. При этом во время тестирования должно быть запущено само приложение, и основное внимание уделяется воспроизведению поведения пользователей. В ходе этого тестирования возможен даже замер производительности системы, и в случае несоответствия установленным требованиям внесенные изменения могут быть отклонены.

Тестирование производительности

В тестах производительности оценивается работа системы при определенной рабочей нагрузке. С помощью таких тестов можно оценить надежность, скорость, масштабируемость и отзывчивость приложения. Например, это может быть наблюдение за временем отклика при выполнении большого количества запросов или определение поведения системы при работе со значительными объемами данных. Этот вид тестирования позволяет определить, соответствует ли приложение требованиям к производительности, найти узкие места, оценить стабильность при пиковом трафике и многое другое.

Smoke-тестирование

Smoke-тесты — это базовые тесты, которые проверяют основные функциональные возможности приложения. Они должны выполняться быстро, поскольку цель таких тестов — убедиться, что основные возможности системы работают как запланировано.

Smoke-тесты полезно запускать сразу после создания новой сборки (для определения, можно ли запускать более ресурсоемкие тесты) или сразу после развертывания (чтобы убедиться, что приложение работает правильно в новой, только что развернутой среде).

Как автоматизировать тесты


Для автоматизации тестов прежде всего необходимо написать их программными средствами с использованием среды тестирования, которая подходит для вашего приложения. В качестве примера для PHP, Javascript и Ruby можно привести такие среды тестирования, как PHPUnit, Mocha, RSpec соответственно. Существует множество других вариантов для всех языков. Вы можете самостоятельно поискать информацию и обратиться за помощью к сообществам разработчиков, чтобы выяснить, какая из сред тестирования оптимально подойдет в вашем случае.

Если тесты могут быть запущены как скрипт с вашего терминала, можно настроить их автоматический запуск сервером непрерывной интеграции, например Bamboo, или облачным сервисом, таким как Bitbucket Pipelines. Эти инструменты будут отслеживать состояние репозиториев и запускать соответствующий комплект тестов каждый раз, когда в главном репозитории фиксируются изменения.

Благодаря Bitbucket Pipelines каждая отправка кода в репозиторий проверяется

Если вы только начинаете внедрять тестирование, рекомендуем прочитать наше учебное руководство по непрерывной интеграции, которое поможет создать первый комплект тестов.

Глубокое тестирование


Чем больше возможностей и улучшений будет добавлено в код, тем больше тестов придется выполнять, чтобы гарантировать правильность работы системы в целом. К тому же было бы разумно убедиться, что исправленный однажды баг не повторится в последующих релизах. Автоматизация — это ключ к такой возможности, а написание тестов рано или поздно станет частью вашего процесса разработки.

Так стоит ли, с учетом всего сказанного, выполнять тестирование вручную? Если отвечать на этот вопрос кратко — да. И, возможно, следует провести глубокое тестирование, целью которого является выявление неочевидных ошибок.

Длительность сеанса глубокого тестирования не должна превышать двух часов. При этом необходимо четко определить область исследования, чтобы тестировщикам было проще сосредоточиться на конкретной части ПО. После того как все тестировщики будут ознакомлены с задачей, можно переходить к выполнению различных действий для проверки поведения системы.

Дополнительный комментарий к теме тестирования


В завершение этого руководства важно поговорить о целях тестирования. Необходимо проверять не только то, можно ли пользоваться приложением (могут ли пользователи войти в систему и сохранить объект), но и не выйдет ли оно из строя при вводе недопустимых данных или выполнении непредвиденных действий. Вы должны понимать, что произойдет, если пользователь сделает опечатку, попытается сохранить неполную форму или воспользуется неверным API. Необходимо проверить, может ли пользователь легко скомпрометировать данные или получить доступ к ресурсу, к которому не должен иметь доступа. Хороший набор тестов попытается сломать приложение и поможет проанализировать его предельные возможности.

И последнее. Тесты — это тоже код! Так что не забывайте о них во время проверки кода, ведь они могут быть последним рубежом контроля перед рабочей средой.

Sten Pittet
Sten Pittet

Я уже 10 лет работаю в сфере ПО, занимал различные должности: от разработчика до менеджера продукта. Проработав 5 лет в Atlassian, где я участвовал в создании инструментов разработки, теперь я пишу статьи о разработке ПО. За пределами офиса я работаю над тем, чтобы стать хорошим отцом для своего потрясающего малыша.


Поделитесь этой статьей

Рекомендуемые статьи

Добавьте эти ресурсы в закладки, чтобы изучить типы команд DevOps или получать регулярные обновления по DevOps в Atlassian.

Рисунок: DevOps

Сообщество DevOps

Рисунок: DevOps

Узнать больше в блоге

Рисунок: карта

Начните работу бесплатно

Подпишитесь на информационную рассылку по DevOps

Thank you for signing up

продолжение темы
Exploratory testing