Статистика QA вакансий и резюме Сентябрь 2023 Хабр
Мы стараемся поддерживать высокий уровень покрытия кода и писать релевантные юнит- и интеграционные тесты — это ответственность команды разработчиков. Эти тесты выполняются в нашем CI-пайплайне при каждом пулл-реквесте. Из-за высокой стоимости внедрения и поддержания таких тестов (обратите внимание на flaky-тесты), тест-кейсы нужно определить тщательно. С этого уровня мы рекомендуем тестировать только те сценарии, которые невозможно проверить с помощью юнит- или интеграционных тестов.
- В этой статье расскажу о том, как устроено тестирование в Jiji, какие методологии и подходы мы используем.
- Но также большое внимание должно уделяться предварительному уровню пирамиды — статическому тестированию, которое проводится перед модульным.
- Важно помнить, что E2E тесты автоматизируются сложнее, дольше, стоят дороже, сложнее поддерживаются и трудно выполняются при регрессе.
- Меня зовут Филипп Кандыба, я Middle Automation QA Engineer в одном из проектов компании Genesis — Jiji.
- Хотя кое-где я буду упоминать характерные для iOS инструменты и термины (например, XCTest), общие принципы и подходы универсальны.
Если вы меняете реализацию под капотом, вы можете поменять весь ваш бэкенд. При обсуждении пирамиды часто не учитывается один момент — уверенность. Единственный тест, который может действительно подтвердить удобство использования приложения, — это тест E2E. Трофей венчают тесты E2E, которые занимают такую же часть пирога тестирования, как и в пирамиде. Технологии изменились настолько, что многие люди считают, что необходим другой подход.
Как писать тест-кейсы: полное руководство
Предполагается, что первичная цель тестирования состоит в достижении как можно большего «освобождения от багов». Но автор модели не стремится к 100% тестовому покрытию, наоборот подчеркивая что это плохая идея сама по себе, ухудшающая качество продукта, когда тестовое покрытие превысило примерно 70%. Но также большое внимание должно уделяться предварительному уровню пирамиды — статическому тестированию, которое проводится перед модульным. Именно такой вид тестовой пирамиды, такой баланс количества тестов и затрат на их создание/выполнение автор считает оптимальным.
Большая часть моего рабочего времени уходит на вещи вроде добавления тестов для поддержки новой функции приложения или перепроверки отчёта о непростом баге. В разработке программного обеспечения существует множество различных видов тестов, каждый из которых имеет свою специфику и цель. В случае с интеграционными тестами редко когда требуется наличие UI, чтобы его проверить.
Уровень системного тестирования
Комбинирование различных видов тестов помогает создать более полную и надежную систему проверки качества программного продукта. В самом верху мы видим ui автотесты или end to end тесты. Обычно такие тесты медленные, сложные, могут быть как автоматизированными, так и ручными, такие автоматизированные тесты как правило не стабильны, так как это ui, ui всегда медленный и не стабильный.
Это позволит познакомиться с проектом изнутри, понять, как все работает, из каких компонентов состоит. В Jiji мы стараемся, так сказать, придерживаться традиций. Поэтому используем пирамиду тестирования и пытаемся следовать всем советам, которые она дает.
Уровень приемочного тестирования
Возможно помогает проектировать тесты или во время регресса смотрит за прогоном этих тестов, и если что-то падает, то принимает меры. Также в расширенной пирамиде появляются ручные исследовательские тесты. Компонентные тесты выделяются в отдельную категорию — как бы «промежуточная стадия» между модульными и приемочными; это тестирование компонентов более крупных чем модули.
Это другое подмножество тестов, которые нельзя перенести в симулятор, потому что им, например, нужна физическая камера или какие-то разрешения. Такие прогоны занимают около 12 минут при средней продолжительности теста в две минуты. Обратите внимание, что, к счастью, мы не запускаем все эти конфигурации для автоматизация тестирования каждого изменения в приложении. Мы внедрили специальную логику, которая выбирает для изменённых модулей и функций только подходящие тесты. Однако если мы спустимся по пирамиде вниз, от сквозных к более низкоуровневым тестам, то скорость и частота запусков вырастут, а объём ручного контроля уменьшится.
Схема уровней тестирования и действий тестировщика
Компонентными называют приёмочные тесты, которые проверяют пользовательский опыт посредством взаимодействия с графическим интерфейсом. Они зависят от возможностей UI-тестирования фреймворка Apple XCTest. Приложение проверяется как чёрный ящик, а для всех внешних взаимодействий, например доступа по сети или пуш-уведомлений, используются заглушки или симуляции.
Внешние зависимости приложения, такие как REST-клиент, должны быть сымитированы. Все современные языки предоставляют фреймворки для юнит-тестирования, такие как XCTest для iOS и JUnit для Android. Локальные зависимости класса, такие как репозиторий, также должны быть заменены моками. Надеюсь, это поможет нам эффективнее планировать тестовое покрытие, а также будет полезно в обслуживании, поддержке и миграции тестов.
Что такое пирамида тестов?
Она позволяет выделять две пятницы в месяце на то, чтобы подумать, расслабиться и поработать без отвлекающих факторов. Я решил посвятить это время углублению в компонентное тестирование. Она часто используется для визуализации и планирования стратегии тестирования в проекте. С другими видами тестирования логика обстоит аналогичным образом, однако часто используются различные DSL, которые упрощают читаемость этих тестов. Старайтесь тестировать бизнес логику отдельно взятого сервиса/группы сервисов.
Переносим сквозные тесты на компонентный уровень
Это даст вам уверенность, что по крайней мере логика внутри вашего приложения работает. Для интеграционных тестов используются те же техники, фреймворки и правила, как и в модульных тестах. Внешние зависимости приложения, такие как REST клиент, должны быть замокированы. Локальные зависимости внутри тестируемого компонента можно использовать реальные, в зависимости от цели теста. Локальные зависимости вне компонента должны быть замокированы.