Тестирование – важный момент перед выпуском в свет той или иной утилиты. Если же мы говорим о тестировании мобильных платформ (Android, iOS), то оно имеет свою специфику.
Огромную роль здесь играет так называемая автоматизация. В статье пойдет речь о том, что собой представляют автотесты, каким образом они запускаются, чем помогают программерам и разработчикам. Информация будет полезна как начинающим, так и тем, кто уже знаком с основами создания софта на Андроиде.
Определение
Тестирование автоматического характера на Android называется автоматизацией тестов. Это – метод проверки ПО, выполняемый через специальные программные средства. Они необходимы для обработки и проверки набора тестовых примеров. Каждый шаг проделывается без «рук» юзера.
ПО автоматизационного характера способно:
- самостоятельно проходить каждый этап приложения;
- вводить тестовые данные в используемую среду;
- проводить сравнение ожиданий от теста и фактически полученные данные;
- формировать отчеты.
Соответствующие тесты приложений обычно требуют немало финансов и задействованных иных ресурсов. Некоторые крупные организации проводят «проверки» многократно. Для реализации поставленной задачи задействуют спецконтент. Он без посторонней помощи справляется с упомянутыми целями. За счет автоматизации удается уменьшить количество тестов, необходимых для ручного запуска.
Классификация
Для написания тестов задействованы специальные приложения. Но разработчики, программеры и тестировщики могут запутаться в предлагаемом контенте. С развитием IT утилит для автоматизации становится все больше. Из-за этого все соответствующие приложения решили условно классифицировать.
Существуют самые разные инструменты для реализации поставленной задачи. Классическое разделение тестов проводится по степени их модульности. Различают три категории:
- Модульное. Предусматривает testing конкретных модулей системы в независимом пространстве. Самый распространенный и известный вариант. Позволяет проводить тесты приложений более детально, а также при необходимости быстро исправлять ошибки и вносить коррективы в конкретные «блоки» системы.
- Интеграционное. Тесты, относящиеся к взаимодействию модулей между собой. Бывает, что конкретный блок хорошо работает обособлено, но в сочетании с остальными компонентами выдает ошибки. Это – более высокий уровень теста.
- Системное. Проводится проверка всей системы приложения. На данном этапе проверяют, насколько получаемые результаты соответствуют первоначальным критериям. Это – глобальный тестинг, нюансы каждого «блока» софта не столь важны. Осуществляется операция по принципам «черного ящика».
В случае с Android можно реализовать все перечисленные методы в автоматическом режиме. Главное подобрать хорошее программное обеспечение для этого.
Преимущества
При использовании автоматизирующих «проверку» программ юзеры и тестировщики сталкиваются с различными нюансами процесса. Они все равно необходимы, так как рассмотренный далее софт просто делает работу по тестингу удобнее в несколько раз.
Автоматизация предусматривает огромное множество преимуществ. Среди них выделяют:
- практически моментальное получение результатов;
- исключение из процесса тестинга человеческих факторов;
- разбор утилит сразу на нескольких платформах;
- наличие возможности покрытия множества локалей.
Это – отличный выход из ситуации, когда нет достаточного количества времени и иных ресурсов на «ручную» проверку. Современный подход к решению поставленной задачи.
Недостатки
Но и минусы при работе с автоматизированными системами для Android/iOS testing тоже встречаются. Некоторые из них для пользователей и разработчиков становятся весьма значимыми.
К недостаткам автоматизации рассматриваемого процесса относят следующие моменты:
- прекращение деятельности с обновлением операционной системы – каждый раз настройку приходится осуществлять «с нуля»;
- сложности при создании тестов для приложений;
- отсутствие стабильной работы для некоторых инструментов;
- разнообразие UI-компонентов, что приводит к трудоемкости и иногда экономической невыгодности проведения операции;
- определенные требования для iOS – IPA-документация должна быть подписана разработчиками.
Автоматизация проверки приложений Андроида и iOS – это весьма распространенный вариант развития событий. Главное определиться с инструментарием, который поможет разрешить возникающие проблемы, а также придерживаться определенного алгоритма действий.
Подходы
В случае с приложениями для автоматизации тестинга найти «что-то свое» не так уж трудно. Позже в статье будут приведены примеры софта, который поможет довольно быстро избавиться от «ручной проверки» утилит. Намного труднее определиться с подходом для реализации поставленной задачи.
Стоит обратить внимание на то, что существуют два варианта развития событий. И каждый имеет сильные-слабые стороны. Перед тестингом предстоит определиться с подходом реализациию
Record and Play
Это – запись всех действий, которые проделываются в приложении. Далее специальный инструмент проводит генерацию понятного задействованной утилитой кода. Следующий этап – это уже автотестинг.
Преимущества:
- скорость реализации;
- отсутствие навыков программирования;
- универсальность.
Недостаток только один и весьма существенный. Любые корректировки в проекте приводят к тому, что приходится создавать новый автотест. И так каждый раз. Не всех пользователей устраивает подобный расклад.
Screen Object
Второй вариант, который является неким паттерном. Он предназначен для того, чтобы проводить организацию архитектуры тестинга приложений. Выражается взаимодействием экранов утилит.
При подобном подходе происходит моделирование экранов или страниц для задействованного приложения. Они «генерируются» как объекты кода. В результате выводится набор классов. Каждый будет отвечать за работу с конкретным дисплеем софта.
Сильные стороны:
- возможность переиспользования кода пока это требуется;
- низкая чувствительность к изменению параметров системы;
- надежность кодификаций;
- понятность структуры.
Разработка подобного варианта отнимает огромное количество времени и ресурсов. Также его трудно реализовать тому, кто не имеет никакого понятия о базовых языках программирования.
Внимание: если хочется провести максимально результативный и эффективный тестинг, придется задуматься над реализацией обоих подходов.
Выбор инструментария
Как только подходы реализации поставленной задачи выбраны, пользователям предстоит определиться со «средой». Утилитой, которая будет осуществлять тестинг приложения в том или ином случае.
Вариантов очень много. Есть как универсальный софт, так и предназначающийся для конкретных мобильных операционных систем. Обратить внимание можно на:
- Espresso;
- UI Automator;
- XCUITest;
- EarlGrey;
- Detox;
- Appium;
- Ranorex;
- TestComplete Mobile.
Последние четыре платформы являются универсальными, первые две – для Андроида, вторая пара сверху – для iOS.
Espresso
Довольно простая среда, подходящая далеко не для всех целей. Его не стоит использовать при контактах с внешними утилитами. Предусматривает:
- тестинг «белого ящика»;
- доступ к исходным кодам приложений;
- тестирование «серого ящика» с доступом к некоторым процессам и структуре.
Наделен софт отличным пользовательским интерфейсом. Имеет весьма мощный API.
UI Automator
Вот утилита, которая используется в основном при автотестинге софта, предназначенного для мобильных устройств. На нем стоит заострить внимание, так как огромным спросом сегодня пользуются именно Android-приложения.
Tests здесь осуществляются не только тестировщиками, но и обычными пользователями. Утилита имеет продвинутую внешнюю интеграцию. Соответственно, фреймворк позволит:
- проводить тесты тех или иных утилит для мобильных устройств;
- «общаться» с операционной системой;
- контактировать с другими утилитами.
UI Automator используется для тестирования «черного ящика». Анализирование здесь проводится с точки внешнего пользователя. Так, словно у разработчика нет доступа к задействованным кодификациям.
Основные преимущества UI Automator:
- наличие средств для отслеживания и анализа разнообразных отображаемых на экране компонентов и элементов в процессе реализации;
- мощный API, позволяющих видеть данные о состоянии устройства и происходящих процессов;
- APIs для кроссплатформенности.
Не стоит рассматривать отдельно средства для iOS, так как они встречаются на практике довольно редко. Программеры и тестировщики предпочитают работать с универсальными средами для реализации поставленной задачи.
Detox
Неплохой вариант для софта, который написан на React Native. Обычно составляются на JavaScript. Генерация приложений для различных мобильных платформ производится из одного и того же кода JS. Они будут максимально схожи между собой.
Основным преимуществом является тестирование по принципам «серого ящика». Фреймворк не будет иметь доступ ко внутренним компонентам. Поэтому останется соотносить внешнее поведение утилиты с тем, что происходит «внутри».
Среда Detox предусматривает возможность обращения к памяти, а также отслеживанию выполняемых процессов. Принципы «серого ящика» способствуют борьбе с неустойчивостью, которые возникают при сквозном тестировании:
- тест способен вылетать самостоятельно без каких-либо кодовых корректировок;
- результаты не детерминированы из-за разнообразия функциональности и процессов;
- требуется осуществлять синхронизацию вручную.
«Серый ящик» помогает получать на выходе лучшую устойчивость и скорость работы. Работает с нативными драйверами посредством JSon. Поддерживает как эмуляторы, так и реальные физические устройства.
Appium
Если пользователь сказал «Хочу провести универсальный тестинг мобильной утилиты», стоит присмотреться к Appium. Написание кодов для платформ возможно через единые API, без дополнительных преобразований.
К принципам работы утилиты относят следующие моменты:
- не требуется перекомпиляция;
- корректировки для автотестинга не обязательны;
- нет необходимости в привязке к одному фреймворку или языку;
- простая API автоматизация.
Данный вариант используется тогда, когда возникает необходимость проверки работы утилиты сразу на нескольких платформах. Отлично годится для тех, кто имел опыт работы с тестингом веб-приложений.
Ranorex
Не слишком популярный инструмент из-за того, что он является платным. Предусматривает как возможность применения программирования для тестинга, так и без скриптов вовсе. Есть поддержка эмуляторов и физических устройств.
Ranorex позволяет:
- создавать тесты;
- проводить настройку тестинга;
- управлять процессами посредством централизации.
Без проблем интегрируется с CI-средой. Предусматривает подгрузку из баз данных SQL, CSV и Excel. Тесты проводятся всеми существующими походами – «черным», «белым», «серым».
TestComplete
В числе самых востребованных утилит для unit test принято выделять TestComplete. Поддерживает не только мобильные платформы, но и десктопные/веб-софт. Ориентация – функциональное и юнит-тестирование.
Предусматривает:
- регрессивный тест;
- data-driven тестинг;
- распределенное тестирование.
Имеет Recorder. Через соответствующие возможности можно посредством записи действий и настроек корректировать команды в редакторе. После предусматривается возможность запуска не только на заданном устройстве, но и посредством экспорта в сторонние приложения.
TestComplete умеет распознавать объекты и элементы для дальнейшего управления путем предложения спецкоманд. Они задействованы при взаимодействии пользователями. С легкостью поддерживает интеграцию с Git, Jira, Jenkins.
Unit-тестинг
Unit тест – это модульный вариант. Он предусматривает проверку приложений и утилит «по блокам». Позволяет добиваться максимальной эффективности при реализации поставленных задач.
Unit-тестирование на Андроиде разделяют на:
- Локальные. Используют исключительно JVM. Подходят для отслеживания бизнес-логики. Она осуществляет взаимодействие с операционными системами.
- Инструментальные. Позволяют посмотреть на логику, которая проводится через Android API. Осуществляется через физические устройства и эмуляторы. Отнимает подобный процесс больше времени, нежели локальные тесты.
Выбор зависит напрямую от конечной цели процесса. Но по возможности рекомендуется составлять локальные тесты. Они более универсальны и полезны.
Стоит дополнительно обратить внимание на организацию пакетов:
- App/scr/main/java – исходный код;
- App/scr/test/java – локальные тесты;
- App/scr/androidTest/java – инструментальный тестинг.
Эта информация будет нужно не только новичкам, но и тем, кто уже имеет навыки в выбранной области. Без понимания мест хранения кодификаций и отчетов может случиться фатальная ошибка.
Настройки
Если программер работает через Android Studio, он может не задумываться над созданием тех или иных пакетов. И предложенная ранее структура не потребуется. В противном случае предстоит запоминать и фиксировать огромное множество данных.
IDE конфигурирует Gradle-файл модуля APP:
Процесс написания тестов можно упростить. Для реализации поставленной задачи программеры пользуются фреймворками. Пример – Mockito. Тут предусматриваются возможности имитирования и наблюдения объектов. Поддерживается подключение вспомогательных проверочных средств и утилит. Для его подключения предстоит указать зависимость testComplete ‘org.mockito:mockito-core:1.10.19’.
Локальный тестинг
Для того, чтобы разобраться в нужной мере в тестинге, стоит рассмотреть процесс на примере соответствия объектов. В приведенном примере их два. Используются числа:
Чтобы провести тест, потребуется:
- Взять созданный класс.
- Разместить в пакете для локальных тестов задействованные методы.
Помечаются соответствующие элементы как «Test. Метод assertEquals() выдает ошибки AsserionError тогда, когда первый (ожидаемый) и второй (итог) не совпадают друг с другом.
Для запуска на класс требуется кликнуть правой кнопкой мыши и выбрать Run ‘ExampleUnitTest’. Получится соответствующий результат.
Первый метод пройдет стадию выполнения, второй выдаст ошибку. Для настройки теста на ожидаемое исключение используется параметр expected:
При подобных обстоятельствах тестинг пройдет успешно, так как исключение ожидаемо. Для длинных операций указывается дополнительное значение timeout. Прописывается в миллисекундах. Если метод не обработается за установленное время, тест потерпит провал:
Есть механизм Matchers, который представляет логические операции совпадения:
Тут:
- is() – оператор «равно»;
- is(not()) – «неравно»;
- hasItem() – проверка на наличие составляющей в списке.
Также «Мокито» используется, чтобы создавать своеобразные «заглушки». Речь идет о mock-объектах. Это – сложные элементы, которые не требуют тестинга. Объявляются:
Для использования аннотации @Mock класс заменяют аннотацией @RunWith или проводят в @Before-методе MockitoAnnotations.
Как только появляется «замоканный» элемент, можно творить различные невообразимые вещи. Пример – переопределение названия приложения из строкового ресурса:
Далее после вызова getString() осуществляется возврат Fake String. Это проводится даже тогда, когда он вызван неявным методом (за пределами тестинга):
Теперь можно заменять все строчки на используемую:
Можно исключить Exception и использовать when….thenThrow. Также есть метод verify. Он проваливает тест, если указанный метод ранее не вызывался:
Сначала метод передается в мок-лист, после указываются методы, интересующие пользователя. Тут задействовано добавление строчки и очистка списка.
Полный потенциал открывается при spy-объектах. За ними можно следить как за фейковыми элементами:
Но есть и другой вариант развития событий. А именно – «инструментальный» тестинг.
Instrumented-тесты
При реализации этой «версии» тестов для Android юзер получает доступ к настоящему контексту приложения. Дополнительно – ко всем возможностям и функционалу Android API. Предусматривает GodMode, который позволяет управлять жизненным циклом активности.
Чтобы распознавать тест в виде инструментального, размещается класс соответствующей аннотации:
Далее проделывается следующее:
- осуществляется пометка тестов;
- проверяется пакет на соответствие приложению.
Инструментарий позволяет прослушивать состояние активностей:
А еще можно управлять их состоянием.
Все это поможет проводить Unit-тестирование в том или ином случае. Если заранее подготовиться к процессу, можно довольно быстро воплотить задумку в жизнь. Главное не торопиться, выбрать методы и платформы, а затем действовать поэтапно.
Внимание: «ручную» проверку тоже рекомендуется осуществлять. И не только при мобильных приложениях, но и во всех других ситуациях. Пользователи иногда способны обнаружить то, что «машины» попросту пропустят. Лишь так удается добиться максимальной результативности.
Как стать тестировщиком
Каждый желающий может освоить рассмотренную сферу в информационных технологиях. Но для реализации поставленной задачи приходится изрядно постараться. Особенно это касается тех, кто долгое время не занимался программированием и разработкой.
Разработчики должны заниматься не только созданием архитектуры утилит и их написанием, но и проверкой. Обычным программерам приходится дополнительно обучаться на тестировщиков.
Сделать это можно несколькими способами:
- Воспользоваться самообразованием. В Сети полно информации по реализации тестинга. И не только для мобильных платформ. Неплохой вариант, но лучше всего он дается не новичкам.
- Обучиться в ВУЗе. Лучше отдавать предпочтение «разработчикам». Особенно, специализирующихся на мобильных утилитах. В процессе ученики освоят все азы процесса, познакомятся с разнообразными способами воплощения задумки в жизнь. Результат – диплом установленной формы.
-
Пройти спецкурсы. В Москве и других регионах России существуют различные образовательные центры. Они обучают очно, заочно и дистанционно. Предусматривают сегментированное наставничество в выбранном направлении. Обучение длится от нескольких месяцев до года. В конце выдается сертификат.
Последний вариант наиболее популярен на сегодняшний день. Он позволяет быстро научиться тем или иным IT-возможностям по строго намеченному пути.
Научиться автоматизации тестирования мобильных приложений людям, которые уже знают азы программирования, проще. Но и с «нуля» этот процесс вполне удается инициировать. Главное – изучать материалы и много практиковаться. В Сети есть и видеоуроки, и сопутствующая литература. Можно остановиться как на предложениях для новичков, так и для уже опытных программеров.
Внимание: немаловажны для процесса обучения такие черты, как усидчивость, целеустремленность и умение работать в команде.
P. S. Большой выбор курсов по тестированию есть и в Otus. Среди них широко представлено и направление автоматизации. Есть варианты как для продвинутых, так и для начинающих пользователей.
<!DOCTYPE html>
<html dir="ltr" lang="ru-RU">
<head>
<meta charset="UTF-8" />
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="profile" href="http://gmpg.org/xfn/11" />
<title>Тестирование мобильного софта: все об автоматизации процесса OTUS</title>
<!-- All in One SEO 4.5.2.1 - aioseo.com -->
<meta name="description" content="Тестирование – важный момент перед выпуском в свет той или иной утилиты. Если же мы говорим о тестировании мобильных платформ (Android, iOS), то оно имеет свою специфику. Огромную роль здесь играет так называемая автоматизация. В статье пойдет речь о том, что собой представляют автотесты, каким образом они запускаются, чем помогают программерам и разработчикам. Информация будет" />
<meta name="robots" content="max-image-preview:large" />
<link rel="canonical" href="https://otus.ru/journal/testirovanie-mobilnogo-softa-vse-ob-avtomatizacii-processa/" />
<meta name="generator" content="All in One SEO (AIOSEO) 4.5.2.1" />
<script type="application/ld+json" class="aioseo-schema">
{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/otus.ru\/journal\/testirovanie-mobilnogo-softa-vse-ob-avtomatizacii-processa\/#article","name":"\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u0444\u0442\u0430: \u0432\u0441\u0435 \u043e\u0431 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 OTUS","headline":"\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u0444\u0442\u0430: \u0432\u0441\u0435 \u043e\u0431 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430","author":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"publisher":{"@id":"https:\/\/otus.ru\/journal\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/otus.ru\/journal\/wp-content\/uploads\/2021\/09\/oj-1080x720-3-1.png","width":1080,"height":720},"datePublished":"2021-09-25T09:35:32+00:00","dateModified":"2022-02-11T16:11:53+00:00","inLanguage":"ru-RU","mainEntityOfPage":{"@id":"https:\/\/otus.ru\/journal\/testirovanie-mobilnogo-softa-vse-ob-avtomatizacii-processa\/#webpage"},"isPartOf":{"@id":"https:\/\/otus.ru\/journal\/testirovanie-mobilnogo-softa-vse-ob-avtomatizacii-processa\/#webpage"},"articleSection":"\u041f\u043e\u043b\u0435\u0437\u043d\u043e\u0435, Android, iOS, \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435"},{"@type":"BreadcrumbList","@id":"https:\/\/otus.ru\/journal\/testirovanie-mobilnogo-softa-vse-ob-avtomatizacii-processa\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/otus.ru\/journal\/#listItem","position":1,"name":"\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430","item":"https:\/\/otus.ru\/journal\/","nextItem":"https:\/\/otus.ru\/journal\/testirovanie-mobilnogo-softa-vse-ob-avtomatizacii-processa\/#listItem"},{"@type":"ListItem","@id":"https:\/\/otus.ru\/journal\/testirovanie-mobilnogo-softa-vse-ob-avtomatizacii-processa\/#listItem","position":2,"name":"\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u0444\u0442\u0430: \u0432\u0441\u0435 \u043e\u0431 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430","previousItem":"https:\/\/otus.ru\/journal\/#listItem"}]},{"@type":"Organization","@id":"https:\/\/otus.ru\/journal\/#organization","name":"\u041e\u0442\u0443\u0441 \u043e\u043d\u043b\u0430\u0439\u043d-\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435","url":"https:\/\/otus.ru\/journal\/","sameAs":["https:\/\/www.youtube.com\/channel\/UCetgtvy93o3i3CvyGXKFU3g"],"contactPoint":{"@type":"ContactPoint","telephone":"+74999389202","contactType":"Customer Support"}},{"@type":"Person","@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author","url":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/","name":"A. Pavlenko","image":{"@type":"ImageObject","@id":"https:\/\/otus.ru\/journal\/testirovanie-mobilnogo-softa-vse-ob-avtomatizacii-processa\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/d4c499a104d7c2522fa41f89e6819499?s=96&d=mm&r=g","width":96,"height":96,"caption":"A. Pavlenko"}},{"@type":"WebPage","@id":"https:\/\/otus.ru\/journal\/testirovanie-mobilnogo-softa-vse-ob-avtomatizacii-processa\/#webpage","url":"https:\/\/otus.ru\/journal\/testirovanie-mobilnogo-softa-vse-ob-avtomatizacii-processa\/","name":"\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u0444\u0442\u0430: \u0432\u0441\u0435 \u043e\u0431 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 OTUS","description":"\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u2013 \u0432\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u043f\u0443\u0441\u043a\u043e\u043c \u0432 \u0441\u0432\u0435\u0442 \u0442\u043e\u0439 \u0438\u043b\u0438 \u0438\u043d\u043e\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u044b. \u0415\u0441\u043b\u0438 \u0436\u0435 \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c (Android, iOS), \u0442\u043e \u043e\u043d\u043e \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u044e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0443. \u041e\u0433\u0440\u043e\u043c\u043d\u0443\u044e \u0440\u043e\u043b\u044c \u0437\u0434\u0435\u0441\u044c \u0438\u0433\u0440\u0430\u0435\u0442 \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u0430\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e\u0439\u0434\u0435\u0442 \u0440\u0435\u0447\u044c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0441\u043e\u0431\u043e\u0439 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u044b, \u043a\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043e\u043d\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f, \u0447\u0435\u043c \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435\u0440\u0430\u043c \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c. \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442","inLanguage":"ru-RU","isPartOf":{"@id":"https:\/\/otus.ru\/journal\/#website"},"breadcrumb":{"@id":"https:\/\/otus.ru\/journal\/testirovanie-mobilnogo-softa-vse-ob-avtomatizacii-processa\/#breadcrumblist"},"author":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"creator":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/otus.ru\/journal\/wp-content\/uploads\/2021\/09\/oj-1080x720-3-1.png","@id":"https:\/\/otus.ru\/journal\/testirovanie-mobilnogo-softa-vse-ob-avtomatizacii-processa\/#mainImage","width":1080,"height":720},"primaryImageOfPage":{"@id":"https:\/\/otus.ru\/journal\/testirovanie-mobilnogo-softa-vse-ob-avtomatizacii-processa\/#mainImage"},"datePublished":"2021-09-25T09:35:32+00:00","dateModified":"2022-02-11T16:11:53+00:00"},{"@type":"WebSite","@id":"https:\/\/otus.ru\/journal\/#website","url":"https:\/\/otus.ru\/journal\/","name":"OTUS JOURNAL","description":"Blog about IT","inLanguage":"ru-RU","publisher":{"@id":"https:\/\/otus.ru\/journal\/#organization"}}]}
</script>
<!-- All in One SEO -->
<link rel='dns-prefetch' href='//otus.ru' />
<link rel='dns-prefetch' href='//fonts.googleapis.com' />
<link rel='stylesheet' id='wp-block-library-css' href='https://otus.ru/journal/wp-includes/css/dist/block-library/style.min.css?ver=6.4.7' type='text/css' media='all' />
<style id='classic-theme-styles-inline-css' type='text/css'>
/*! This file is auto-generated */
.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}
</style>
<style id='global-styles-inline-css' type='text/css'>
body{--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flow > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}body .is-layout-flow > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}body .is-layout-flow > .aligncenter{margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}body .is-layout-constrained > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}body .is-layout-constrained > .aligncenter{margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > :where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width: var(--wp--style--global--content-size);margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > .alignwide{max-width: var(--wp--style--global--wide-size);}body .is-layout-flex{display: flex;}body .is-layout-flex{flex-wrap: wrap;align-items: center;}body .is-layout-flex > *{margin: 0;}body .is-layout-grid{display: grid;}body .is-layout-grid > *{margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}
.wp-block-navigation a:where(:not(.wp-element-button)){color: inherit;}
:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}
:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}
.wp-block-pullquote{font-size: 1.5em;line-height: 1.6;}
</style>
<link rel='stylesheet' id='wbcr-comments-plus-url-span-css' href='https://otus.ru/journal/wp-content/plugins/clearfy/components/comments-plus/assets/css/url-span.css?ver=2.2.0' type='text/css' media='all' />
<link rel='stylesheet' id='wpel-style-css' href='https://otus.ru/journal/wp-content/plugins/wp-external-links/public/css/wpel.css?ver=2.59' type='text/css' media='all' />
<link rel='stylesheet' id='ez-toc-css' href='https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/css/screen.min.css?ver=2.0.61' type='text/css' media='all' />
<style id='ez-toc-inline-css' type='text/css'>
div#ez-toc-container .ez-toc-title {font-size: 120%;}div#ez-toc-container .ez-toc-title {font-weight: 500;}div#ez-toc-container ul li {font-size: 95%;}div#ez-toc-container nav ul ul li {font-size: 90%;}
.ez-toc-container-direction {direction: ltr;}.ez-toc-counter ul{counter-reset: item ;}.ez-toc-counter nav ul li a::before {content: counters(item, ".", decimal) ". ";display: inline-block;counter-increment: item;flex-grow: 0;flex-shrink: 0;margin-right: .2em; float: left; }.ez-toc-widget-direction {direction: ltr;}.ez-toc-widget-container ul{counter-reset: item ;}.ez-toc-widget-container nav ul li a::before {content: counters(item, ".", decimal) ". ";display: inline-block;counter-increment: item;flex-grow: 0;flex-shrink: 0;margin-right: .2em; float: left; }
</style>
<link rel='stylesheet' id='contentberg-fonts-css' href='https://fonts.googleapis.com/css?family=Roboto%3A400%2C500%2C700%7CPT+Serif%3A400%2C400i%2C600%7CIBM+Plex+Serif%3A500' type='text/css' media='all' />
<link rel='stylesheet' id='contentberg-core-css' href='https://otus.ru/journal/wp-content/themes/contentberg/style.css?ver=1.8.3' type='text/css' media='all' />
<link rel='stylesheet' id='contentberg-lightbox-css' href='https://otus.ru/journal/wp-content/themes/contentberg/css/lightbox.css?ver=1.8.3' type='text/css' media='all' />
<link rel='stylesheet' id='font-awesome-css' href='https://otus.ru/journal/wp-content/themes/contentberg/css/fontawesome/css/font-awesome.min.css?ver=1.8.3' type='text/css' media='all' />
<script type="text/javascript" id="breeze-prefetch-js-extra">
/* <![CDATA[ */
var breeze_prefetch = {"local_url":"https:\/\/otus.ru\/journal","ignore_remote_prefetch":"1","ignore_list":["\/wp-admin\/"]};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/breeze/assets/js/js-front-end/breeze-prefetch-links.min.js" id="breeze-prefetch-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery.min.js" id="jquery-core-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery-migrate.min.js" id="jquery-migrate-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/lazysizes.js" id="lazysizes-js"></script>
<link rel="https://api.w.org/" href="https://otus.ru/journal/wp-json/" /><link rel="alternate" type="application/json" href="https://otus.ru/journal/wp-json/wp/v2/posts/2075" /><link rel='shortlink' href='https://otus.ru/journal/?p=2075' />
<link rel="alternate" type="application/json+oembed" href="https://otus.ru/journal/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fotus.ru%2Fjournal%2Ftestirovanie-mobilnogo-softa-vse-ob-avtomatizacii-processa%2F" />
<link rel="alternate" type="text/xml+oembed" href="https://otus.ru/journal/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fotus.ru%2Fjournal%2Ftestirovanie-mobilnogo-softa-vse-ob-avtomatizacii-processa%2F&format=xml" />
<script>var Sphere_Plugin = {"ajaxurl":"https:\/\/otus.ru\/journal\/wp-admin\/admin-ajax.php"};</script><link rel="icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-32x32.png" sizes="32x32" />
<link rel="icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-192x192.png" sizes="192x192" />
<link rel="apple-touch-icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-180x180.png" />
<meta name="msapplication-TileImage" content="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-270x270.png" />
<style type="text/css" id="wp-custom-css">
#menu-item-10406 .wpel-icon {
display: none;
}
#menu-item-10407 .wpel-icon {
display: none;
}
.otus-login-site a .wpel-icon {
display: none;
}
.menu-menju-navykov-container a .wpel-icon {
display: none;
}
.otus-login-site a
{
background: #ffd709;
border-radius: 12px;
color: #0f0f10;
font-size: 14px;
font-weight: 700;
line-height: 20px;
display: block;
text-align: center;
padding: 8px 25px;
}
.main-footer.dark {
background: linear-gradient(90deg, #a64fc5, #4f54e6);
border-color: transparent;
}
.main-footer.bold .copyright {
color: #fff;
}
.main-footer.bold .to-top i {
color: #fff;
}
.main-footer.bold .back-to-top {
color: #fff;
}
.nav__scroll {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
.scrollable-menu .menu {
display: flex;
}
.nav__scroll
{
background: linear-gradient(90deg, #a64fc5, #4f54e6);
}
.scrollable-menu .menu .menu-item {
flex: 0 0 auto;
padding: 15px 15px;
}
.scrollable-menu .menu .menu-item a {
color: #fff;
}
.nav__scroll::-webkit-scrollbar{background-color:#fff;height:5px;}
.nav__scroll::-webkit-scrollbar-thumb{background-color:#dcdcdc;}
.nav__scroll::-webkit-scrollbar-track{-webkit-border-radius:0;border-radius:0;background-color:#fff;}/
body {
min-width: 320px;
}
.banner-click img {
margin: 0 auto;
display: block;
}
.banner-click {
cursor: pointer;
}
.banner-footer-area {
margin-bottom: 20px;
}
.banner-left-area {
margin-top: 40px;
} </style>
<!--Start VDZ Yandex Metrika Plugin-->
<!-- Yandex.Metrika counter --><script type="text/javascript" >(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};m[i].l=1*new Date();k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");ym(34531570, "init", {clickmap:true, trackLinks:true, accurateTrackBounce:true, webvisor:true, trackHash:true, ecommerce:"dataLayer"});</script>
<noscript><div><img src="https://mc.yandex.ru/watch/34531570" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
<!-- /Yandex.Metrika counter --><!--START ADD EVENTS FROM CF7--><script type='text/javascript'>document.addEventListener( 'wpcf7submit', function( event ) {
//event.detail.contactFormId;
if(ym){
//console.log(event.detail);
ym(34531570, 'reachGoal', 'VDZ_SEND_CONTACT_FORM_7');
ym(34531570, 'params', {
page_url: window.location.href,
status: event.detail.status,
locale: event.detail.contactFormLocale,
form_id: event.detail.contactFormId,
});
}
}, false );
</script><!--END ADD EVENTS FROM CF7-->
<!--End VDZ Yandex Metrika Plugin-->
</head>
<body class="post-template-default single single-post postid-2075 single-format-standard right-sidebar lazy-normal has-lb">
<div class="main-wrap">
<header id="main-head" class="main-head head-nav-below has-search-modal simple simple-boxed">
<div class="inner inner-head" data-sticky-bar="0">
<div class="wrap cf wrap-head">
<div class="left-contain">
<span class="mobile-nav"><i class="fa fa-bars"></i></span>
<div class="title">
<a href="https://otus.ru/journal/" title="OTUS JOURNAL" rel="home" data-wpel-link="internal">
<span class="text-logo"><img src="/journal/wp-content/themes/contentberg/img/logo_site.svg" alt="OTUS JOURNAL"></span>
</a>
</div>
</div>
<div class="navigation-wrap inline">
<nav class="navigation inline simple light" data-sticky-bar="0">
<div class="menu-rubriki-container"><ul id="menu-rubriki" class="menu"><li id="menu-item-109" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-cat-1 menu-item-109"><a href="https://otus.ru/journal/category/pro-it/" data-wpel-link="internal"><span>Про IT</span></a></li>
<li id="menu-item-113" class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent menu-cat-4 menu-item-113"><a href="https://otus.ru/journal/category/polza/" data-wpel-link="internal"><span>Полезное</span></a></li>
<li id="menu-item-114" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-cat-3 menu-item-114"><a href="https://otus.ru/journal/category/lifestyle/" data-wpel-link="internal"><span>Лайфстайл</span></a></li>
<li id="menu-item-10406" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10406"><a href="https://otus.ru/catalog/courses" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right"><span>Обучение</span><span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10407" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10407"><a href="https://otus.ru/about" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right"><span>Информация</span><span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </nav>
</div>
<div class="actions">
<div class="otus-login-site">
<a href="https://otus.ru/login/" target="_blank" data-wpel-link="external" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Войти<span class="wpel-icon wpel-image wpel-icon-6"></span></a>
</div>
<a href="#" title="Search" class="search-link"><i class="fa fa-search"></i></a>
</div>
</div>
</div>
</header> <!-- .main-head -->
<div class="nav nav_disable nav_colored nav_transparent course-categories__nav nav__scroll ">
<div class="container wrap">
<div class="links inline simple light scrollable-menu">
<div class="menu-menju-navykov-container"><ul id="menu-menju-navykov" class="menu"><li id="menu-item-10413" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10413"><a href="https://otus.ru/categories/programming/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Программирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10414" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10414"><a href="https://otus.ru/categories/architecture/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Архитектура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10415" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10415"><a href="https://otus.ru/categories/operations/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Инфраструктура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10416" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10416"><a href="https://otus.ru/categories/information-security-courses/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Безопасность<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10417" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10417"><a href="https://otus.ru/categories/data-science/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Data Science<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10418" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10418"><a href="https://otus.ru/categories/gamedev/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">GameDev<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10419" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10419"><a href="https://otus.ru/categories/marketing-business/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Управление<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10420" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10420"><a href="https://otus.ru/categories/analytics/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Аналитика и анализ<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10421" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10421"><a href="https://otus.ru/categories/testing/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Тестирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </div>
</div>
</div>
<div class="main wrap">
<div class="ts-row cf">
<div class="col-8 main-content cf">
<article id="post-2075" class="the-post post-2075 post type-post status-publish format-standard has-post-thumbnail category-polza tag-android-2 tag-ios tag-testirovanie">
<header class="post-header the-post-header cf">
<div class="post-meta the-post-meta">
<span class="post-cat">
<a href="https://otus.ru/journal/category/polza/" class="category" data-wpel-link="internal">Полезное</a>
</span>
<h1 class="post-title">
Тестирование мобильного софта: все об автоматизации процесса
</h1>
<a href="https://otus.ru/journal/testirovanie-mobilnogo-softa-vse-ob-avtomatizacii-processa/" class="date-link" data-wpel-link="internal"><time class="post-date">25 сентября, 2021</time></a>
</div>
<div class="featured">
<a href="https://otus.ru/journal/wp-content/uploads/2021/09/oj-1080x720-3-1.png" class="image-link" data-wpel-link="internal"><img width="770" height="515" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20770%20515%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-contentberg-main size-contentberg-main lazyload wp-post-image" alt="Тестирование мобильного софта: все об автоматизации процесса" title="Тестирование мобильного софта: все об автоматизации процесса" decoding="async" fetchpriority="high" data-srcset="https://otus.ru/journal/wp-content/uploads/2021/09/oj-1080x720-3-1-770x515.png 770w, https://otus.ru/journal/wp-content/uploads/2021/09/oj-1080x720-3-1-300x200.png 300w, https://otus.ru/journal/wp-content/uploads/2021/09/oj-1080x720-3-1-1024x683.png 1024w, https://otus.ru/journal/wp-content/uploads/2021/09/oj-1080x720-3-1-150x100.png 150w, https://otus.ru/journal/wp-content/uploads/2021/09/oj-1080x720-3-1-270x180.png 270w" data-src="https://otus.ru/journal/wp-content/uploads/2021/09/oj-1080x720-3-1-770x515.png" data-sizes="(max-width: 770px) 100vw, 770px" /> </a>
</div>
</header><!-- .post-header -->
<div class="post-content description cf entry-content content-normal">
<div id="ez-toc-container" class="ez-toc-v2_0_61 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction">
<div class="ez-toc-title-container">
<p class="ez-toc-title " >Содержание</p>
<span class="ez-toc-title-toggle"><a href="#" class="ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle" aria-label="Toggle Table of Content"><span class="ez-toc-js-icon-con"><span class=""><span class="eztoc-hide" style="display:none;">Toggle</span><span class="ez-toc-icon-toggle-span"><svg style="fill: #999;color:#999" xmlns="http://www.w3.org/2000/svg" class="list-377408" width="20px" height="20px" viewBox="0 0 24 24" fill="none"><path d="M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z" fill="currentColor"></path></svg><svg style="fill: #999;color:#999" class="arrow-unsorted-368013" xmlns="http://www.w3.org/2000/svg" width="10px" height="10px" viewBox="0 0 24 24" version="1.2" baseProfile="tiny"><path d="M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z"/></svg></span></span></span></a></span></div>
<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-1" href="#%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5" title="Определение">Определение</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-2" href="#%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F" title="Классификация">Классификация</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-3" href="#%D0%9F%D1%80%D0%B5%D0%B8%D0%BC%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B0" title="Преимущества">Преимущества</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-4" href="#%D0%9D%D0%B5%D0%B4%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B8" title="Недостатки">Недостатки</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-5" href="#%D0%9F%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B" title="Подходы">Подходы</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-6" href="#Record_and_Play" title="Record and Play">Record and Play</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-7" href="#Screen_Object" title="Screen Object">Screen Object</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-8" href="#%D0%92%D1%8B%D0%B1%D0%BE%D1%80_%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%80%D0%B8%D1%8F" title="Выбор инструментария">Выбор инструментария</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-9" href="#Espresso" title="Espresso">Espresso</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-10" href="#UI_Automator" title="UI Automator">UI Automator</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-11" href="#Detox" title="Detox">Detox</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-12" href="#Appium" title="Appium">Appium</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-13" href="#Ranorex" title="Ranorex">Ranorex</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-14" href="#TestComplete" title="TestComplete">TestComplete</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-15" href="#Unit-%D1%82%D0%B5%D1%81%D1%82%D0%B8%D0%BD%D0%B3" title="Unit-тестинг">Unit-тестинг</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-16" href="#%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B8" title="Настройки">Настройки</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-17" href="#%D0%9B%D0%BE%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D1%82%D0%B5%D1%81%D1%82%D0%B8%D0%BD%D0%B3" title="Локальный тестинг">Локальный тестинг</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-18" href="#Instrumented-%D1%82%D0%B5%D1%81%D1%82%D1%8B" title="Instrumented-тесты">Instrumented-тесты</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-19" href="#%D0%9A%D0%B0%D0%BA_%D1%81%D1%82%D0%B0%D1%82%D1%8C_%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D1%89%D0%B8%D0%BA%D0%BE%D0%BC" title="Как стать тестировщиком">Как стать тестировщиком</a></li></ul></nav></div>
<p>Тестирование – важный момент перед выпуском в свет той или иной утилиты. Если же мы говорим о <a href="https://otus.ru/journal/testirovanie-ot-a-do-ya/" data-wpel-link="internal">тестировании</a> мобильных платформ (Android, iOS), то оно имеет свою специфику.</p>
<p>Огромную роль здесь играет так называемая автоматизация. В статье пойдет речь о том, что собой представляют автотесты, каким образом они запускаются, чем помогают программерам и разработчикам. Информация будет полезна как начинающим, так и тем, кто уже знаком с основами создания софта на Андроиде.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5"></span>Определение<span class="ez-toc-section-end"></span></h2>
<p>Тестирование автоматического характера на Android называется автоматизацией тестов. Это – метод проверки ПО, выполняемый через специальные программные средства. Они необходимы для обработки и проверки набора тестовых примеров. Каждый шаг проделывается без «рук» юзера.</p>
<p>ПО автоматизационного характера способно:</p>
<ul><li>самостоятельно проходить каждый этап приложения;</li><li>вводить тестовые данные в используемую среду;</li><li>проводить сравнение ожиданий от теста и фактически полученные данные;</li><li>формировать отчеты.</li></ul>
<p>Соответствующие тесты приложений обычно требуют немало финансов и задействованных иных ресурсов. Некоторые крупные организации проводят «проверки» многократно. Для реализации поставленной задачи задействуют спецконтент. Он без посторонней помощи справляется с упомянутыми целями. За счет автоматизации удается уменьшить количество тестов, необходимых для ручного запуска.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F"></span>Классификация<span class="ez-toc-section-end"></span></h2>
<p>Для написания тестов задействованы специальные приложения. Но разработчики, программеры и тестировщики могут запутаться в предлагаемом контенте. С развитием IT утилит для автоматизации становится все больше. Из-за этого все соответствующие приложения решили условно классифицировать.</p>
<p>Существуют самые разные инструменты для реализации поставленной задачи. Классическое разделение тестов проводится по степени их модульности. Различают три категории:</p>
<ol type="1"><li>Модульное. Предусматривает testing конкретных модулей системы в независимом пространстве. Самый распространенный и известный вариант. Позволяет проводить тесты приложений более детально, а также при необходимости быстро исправлять ошибки и вносить коррективы в конкретные «блоки» системы.</li><li>Интеграционное. Тесты, относящиеся к взаимодействию модулей между собой. Бывает, что конкретный блок хорошо работает обособлено, но в сочетании с остальными компонентами выдает ошибки. Это – более высокий уровень теста.</li><li>Системное. Проводится проверка всей системы приложения. На данном этапе проверяют, насколько получаемые результаты соответствуют первоначальным критериям. Это – глобальный <a href="https://otus.ru/journal/testing-i-programmirovanie-kak-stat-testirovshhikom/" data-wpel-link="internal">тестинг</a>, нюансы каждого «блока» софта не столь важны. Осуществляется операция по принципам «черного ящика».</li></ol>
<p>В случае с Android можно реализовать все перечисленные методы в автоматическом режиме. Главное подобрать хорошее программное обеспечение для этого.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D1%80%D0%B5%D0%B8%D0%BC%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B0"></span>Преимущества<span class="ez-toc-section-end"></span></h2>
<p>При использовании автоматизирующих «проверку» программ юзеры и тестировщики сталкиваются с различными нюансами процесса. Они все равно необходимы, так как рассмотренный далее софт просто делает работу по тестингу удобнее в несколько раз.</p>
<p>Автоматизация предусматривает огромное множество преимуществ. Среди них выделяют:</p>
<ul><li>практически моментальное получение результатов;</li><li>исключение из процесса тестинга человеческих факторов;</li><li>разбор утилит сразу на нескольких платформах;</li><li>наличие возможности покрытия множества локалей.</li></ul>
<p>Это – отличный выход из ситуации, когда нет достаточного количества времени и иных ресурсов на «ручную» проверку. Современный подход к решению поставленной задачи.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9D%D0%B5%D0%B4%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B8"></span>Недостатки<span class="ez-toc-section-end"></span></h2>
<p>Но и минусы при работе с автоматизированными системами для Android/iOS testing тоже встречаются. Некоторые из них для пользователей и разработчиков становятся весьма значимыми.</p>
<p>К недостаткам автоматизации рассматриваемого процесса относят следующие моменты:</p>
<ul><li>прекращение деятельности с обновлением операционной системы – каждый раз настройку приходится осуществлять «с нуля»;</li><li>сложности при создании тестов для приложений;</li><li>отсутствие стабильной работы для некоторых инструментов;</li><li>разнообразие UI-компонентов, что приводит к трудоемкости и иногда экономической невыгодности проведения операции;</li><li>определенные требования для iOS – IPA-документация должна быть подписана разработчиками.</li></ul>
<p>Автоматизация проверки приложений Андроида и iOS – это весьма распространенный вариант развития событий. Главное определиться с инструментарием, который поможет разрешить возникающие проблемы, а также придерживаться определенного алгоритма действий.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B"></span>Подходы<span class="ez-toc-section-end"></span></h2>
<p>В случае с приложениями для автоматизации тестинга найти «что-то свое» не так уж трудно. Позже в статье будут приведены примеры софта, который поможет довольно быстро избавиться от «ручной проверки» утилит. Намного труднее определиться с подходом для реализации поставленной задачи.</p>
<p>Стоит обратить внимание на то, что существуют два варианта развития событий. И каждый имеет сильные-слабые стороны. Перед тестингом предстоит определиться с подходом реализациию</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="Record_and_Play"></span>Record and Play<span class="ez-toc-section-end"></span></h3>
<p>Это – запись всех действий, которые проделываются в приложении. Далее специальный инструмент проводит генерацию понятного задействованной утилитой кода. Следующий этап – это уже автотестинг.</p>
<p>Преимущества:</p>
<ul><li>скорость реализации;</li><li>отсутствие навыков программирования;</li><li>универсальность.</li></ul>
<p>Недостаток только один и весьма существенный. Любые корректировки в проекте приводят к тому, что приходится создавать новый автотест. И так каждый раз. Не всех пользователей устраивает подобный расклад.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="Screen_Object"></span>Screen Object<span class="ez-toc-section-end"></span></h3>
<p>Второй вариант, который является неким паттерном. Он предназначен для того, чтобы проводить организацию архитектуры тестинга приложений. Выражается взаимодействием экранов утилит.</p>
<p>При подобном подходе происходит моделирование экранов или страниц для задействованного приложения. Они «генерируются» как объекты кода. В результате выводится набор классов. Каждый будет отвечать за работу с конкретным дисплеем софта.</p>
<p>Сильные стороны:</p>
<ul><li>возможность переиспользования кода пока это требуется;</li><li>низкая чувствительность к изменению параметров системы;</li><li>надежность кодификаций;</li><li>понятность структуры.</li></ul>
<p>Разработка подобного варианта отнимает огромное количество времени и ресурсов. Также его трудно реализовать тому, кто не имеет никакого понятия о базовых языках программирования.</p>
<p>Внимание: если хочется провести максимально результативный и эффективный тестинг, придется задуматься над реализацией обоих подходов.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%92%D1%8B%D0%B1%D0%BE%D1%80_%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%80%D0%B8%D1%8F"></span>Выбор инструментария<span class="ez-toc-section-end"></span></h2>
<p>Как только подходы реализации поставленной задачи выбраны, пользователям предстоит определиться со «средой». Утилитой, которая будет осуществлять тестинг приложения в том или ином случае.</p>
<p>Вариантов очень много. Есть как универсальный софт, так и предназначающийся для конкретных мобильных операционных систем. Обратить внимание можно на:</p>
<ul><li>Espresso;</li><li>UI Automator;</li><li>XCUITest;</li><li>EarlGrey;</li><li>Detox;</li><li>Appium;</li><li>Ranorex;</li><li>TestComplete Mobile.</li></ul>
<p>Последние четыре платформы являются универсальными, первые две – для Андроида, вторая пара сверху – для iOS.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="Espresso"></span>Espresso<span class="ez-toc-section-end"></span></h3>
<p>Довольно простая среда, подходящая далеко не для всех целей. Его не стоит использовать при контактах с внешними утилитами. Предусматривает:</p>
<ul><li>тестинг «белого ящика»;</li><li>доступ к исходным кодам приложений;</li><li>тестирование «серого ящика» с доступом к некоторым процессам и структуре.</li></ul>
<p>Наделен софт отличным пользовательским интерфейсом. Имеет весьма мощный API.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="UI_Automator"></span>UI Automator<span class="ez-toc-section-end"></span></h3>
<p>Вот утилита, которая используется в основном при автотестинге софта, предназначенного для мобильных устройств. На нем стоит заострить внимание, так как огромным спросом сегодня пользуются именно Android-приложения.</p>
<p>Tests здесь осуществляются не только тестировщиками, но и обычными пользователями. Утилита имеет продвинутую внешнюю интеграцию. Соответственно, фреймворк позволит:</p>
<ul><li>проводить тесты тех или иных утилит для мобильных устройств;</li><li>«общаться» с операционной системой;</li><li>контактировать с другими утилитами.</li></ul>
<p>UI Automator используется для тестирования «черного ящика». Анализирование здесь проводится с точки внешнего пользователя. Так, словно у разработчика нет доступа к задействованным кодификациям.</p>
<p>Основные преимущества UI Automator:</p>
<ul><li>наличие средств для отслеживания и анализа разнообразных отображаемых на экране компонентов и элементов в процессе реализации;</li><li>мощный API, позволяющих видеть данные о состоянии устройства и происходящих процессов;</li><li>APIs для кроссплатформенности.</li></ul>
<p>Не стоит рассматривать отдельно средства для iOS, так как они встречаются на практике довольно редко. Программеры и тестировщики предпочитают работать с универсальными средами для реализации поставленной задачи.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="Detox"></span>Detox<span class="ez-toc-section-end"></span></h3>
<p>Неплохой вариант для софта, который написан на React Native. Обычно составляются на JavaScript. Генерация приложений для различных мобильных платформ производится из одного и того же кода JS. Они будут максимально схожи между собой.</p>
<p>Основным преимуществом является тестирование по принципам «серого ящика». Фреймворк не будет иметь доступ ко внутренним компонентам. Поэтому останется соотносить внешнее поведение утилиты с тем, что происходит «внутри».</p>
<p>Среда Detox предусматривает возможность обращения к памяти, а также отслеживанию выполняемых процессов. Принципы «серого ящика» способствуют борьбе с неустойчивостью, которые возникают при сквозном тестировании:</p>
<ul><li>тест способен вылетать самостоятельно без каких-либо кодовых корректировок;</li><li>результаты не детерминированы из-за разнообразия функциональности и процессов;</li><li>требуется осуществлять синхронизацию вручную.</li></ul>
<p>«Серый ящик» помогает получать на выходе лучшую устойчивость и скорость работы. Работает с нативными драйверами посредством JSon. Поддерживает как эмуляторы, так и реальные физические устройства.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="Appium"></span>Appium<span class="ez-toc-section-end"></span></h3>
<p>Если пользователь сказал «Хочу провести универсальный тестинг мобильной утилиты», стоит присмотреться к Appium. Написание кодов для платформ возможно через единые API, без дополнительных преобразований.</p>
<p>К принципам работы утилиты относят следующие моменты:</p>
<ul><li>не требуется перекомпиляция;</li><li>корректировки для автотестинга не обязательны;</li><li>нет необходимости в привязке к одному фреймворку или языку;</li><li>простая API автоматизация.</li></ul>
<p>Данный вариант используется тогда, когда возникает необходимость проверки работы утилиты сразу на нескольких платформах. Отлично годится для тех, кто имел опыт работы с тестингом веб-приложений.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="Ranorex"></span>Ranorex<span class="ez-toc-section-end"></span></h3>
<p>Не слишком популярный инструмент из-за того, что он является платным. Предусматривает как возможность применения программирования для тестинга, так и без <a href="https://otus.ru/journal/osnovy-raboty-so-skriptami/" data-wpel-link="internal">скриптов</a> вовсе. Есть поддержка эмуляторов и физических устройств.</p>
<p>Ranorex позволяет:</p>
<ul><li>создавать тесты;</li><li>проводить настройку тестинга;</li><li>управлять процессами посредством централизации.</li></ul>
<p>Без проблем интегрируется с CI-средой. Предусматривает подгрузку из баз данных SQL, CSV и Excel. Тесты проводятся всеми существующими походами – «черным», «белым», «серым».</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="TestComplete"></span>TestComplete<span class="ez-toc-section-end"></span></h3>
<p>В числе самых востребованных утилит для unit test принято выделять TestComplete. Поддерживает не только мобильные платформы, но и десктопные/веб-софт. Ориентация – функциональное и юнит-тестирование.</p>
<p>Предусматривает:</p>
<ul><li>регрессивный тест;</li><li>data-driven тестинг;</li><li>распределенное тестирование.</li></ul>
<p>Имеет Recorder. Через соответствующие возможности можно посредством записи действий и настроек корректировать команды в редакторе. После предусматривается возможность запуска не только на заданном устройстве, но и посредством экспорта в сторонние приложения.</p>
<p>TestComplete умеет распознавать объекты и элементы для дальнейшего управления путем предложения спецкоманд. Они задействованы при взаимодействии пользователями. С легкостью поддерживает интеграцию с Git, Jira, Jenkins.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="Unit-%D1%82%D0%B5%D1%81%D1%82%D0%B8%D0%BD%D0%B3"></span>Unit-тестинг<span class="ez-toc-section-end"></span></h2>
<p><a href="https://otus.ru/journal/unit-testirovanie-opisanie-i-osobennosti/" data-wpel-link="internal">Unit тест</a> – это модульный вариант. Он предусматривает проверку приложений и утилит «по блокам». Позволяет добиваться максимальной эффективности при реализации поставленных задач.</p>
<p>Unit-тестирование на Андроиде разделяют на:</p>
<ol type="1"><li>Локальные. Используют исключительно JVM. Подходят для отслеживания бизнес-логики. Она осуществляет взаимодействие с операционными системами.</li><li>Инструментальные. Позволяют посмотреть на логику, которая проводится через Android API. Осуществляется через физические устройства и эмуляторы. Отнимает подобный процесс больше времени, нежели локальные тесты.</li></ol>
<p>Выбор зависит напрямую от конечной цели процесса. Но по возможности рекомендуется составлять локальные тесты. Они более универсальны и полезны.</p>
<p>Стоит дополнительно обратить внимание на организацию пакетов:</p>
<ul><li>App/scr/main/java – исходный код;</li><li>App/scr/test/java – локальные тесты;</li><li>App/scr/androidTest/java – инструментальный тестинг.</li></ul>
<p>Эта информация будет нужно не только новичкам, но и тем, кто уже имеет навыки в выбранной области. Без понимания мест хранения кодификаций и отчетов может случиться фатальная ошибка.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B8"></span>Настройки<span class="ez-toc-section-end"></span></h3>
<p>Если программер работает через Android Studio, он может не задумываться над созданием тех или иных пакетов. И предложенная ранее структура не потребуется. В противном случае предстоит запоминать и фиксировать огромное множество данных.</p>
<p>IDE конфигурирует Gradle-файл модуля APP:</p>
<figure class="wp-block-image size-large"><img decoding="async" width="592" height="368" src="https://otus.ru/journal/wp-content/uploads/2021/09/1-1.jpg" alt="Тестирование мобильного софта: все об автоматизации процесса" class="wp-image-2077" srcset="https://otus.ru/journal/wp-content/uploads/2021/09/1-1.jpg 592w, https://otus.ru/journal/wp-content/uploads/2021/09/1-1-300x186.jpg 300w, https://otus.ru/journal/wp-content/uploads/2021/09/1-1-150x93.jpg 150w" sizes="(max-width: 592px) 100vw, 592px" /></figure>
<p>Процесс написания тестов можно упростить. Для реализации поставленной задачи программеры пользуются фреймворками. Пример – Mockito. Тут предусматриваются возможности имитирования и наблюдения объектов. Поддерживается подключение вспомогательных проверочных средств и утилит. Для его подключения предстоит указать зависимость testComplete ‘org.mockito:mockito-core:1.10.19’.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9B%D0%BE%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D1%82%D0%B5%D1%81%D1%82%D0%B8%D0%BD%D0%B3"></span>Локальный тестинг<span class="ez-toc-section-end"></span></h3>
<p>Для того, чтобы разобраться в нужной мере в тестинге, стоит рассмотреть процесс на примере соответствия объектов. В приведенном примере их два. Используются числа:</p>
<figure class="wp-block-image size-large"><img decoding="async" width="644" height="371" src="https://otus.ru/journal/wp-content/uploads/2021/09/2-1.jpg" alt="Тестирование мобильного софта: все об автоматизации процесса" class="wp-image-2078" srcset="https://otus.ru/journal/wp-content/uploads/2021/09/2-1.jpg 644w, https://otus.ru/journal/wp-content/uploads/2021/09/2-1-300x173.jpg 300w, https://otus.ru/journal/wp-content/uploads/2021/09/2-1-150x86.jpg 150w" sizes="(max-width: 644px) 100vw, 644px" /></figure>
<p>Чтобы провести тест, потребуется:</p>
<ol type="1"><li>Взять созданный класс.</li><li>Разместить в пакете для локальных тестов задействованные методы.</li></ol>
<p>Помечаются соответствующие элементы как «Test. Метод assertEquals() выдает ошибки AsserionError тогда, когда первый (ожидаемый) и второй (итог) не совпадают друг с другом.</p>
<p>Для запуска на класс требуется кликнуть правой кнопкой мыши и выбрать Run ‘ExampleUnitTest’. Получится соответствующий результат.</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="731" height="107" src="https://otus.ru/journal/wp-content/uploads/2021/09/3-1.jpg" alt="Тестирование мобильного софта: все об автоматизации процесса" class="wp-image-2079" srcset="https://otus.ru/journal/wp-content/uploads/2021/09/3-1.jpg 731w, https://otus.ru/journal/wp-content/uploads/2021/09/3-1-300x44.jpg 300w, https://otus.ru/journal/wp-content/uploads/2021/09/3-1-150x22.jpg 150w" sizes="(max-width: 731px) 100vw, 731px" /></figure>
<p>Первый метод пройдет стадию выполнения, второй выдаст ошибку. Для настройки теста на ожидаемое исключение используется параметр expected:</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="613" height="146" src="https://otus.ru/journal/wp-content/uploads/2021/09/4-1.jpg" alt="Тестирование мобильного софта: все об автоматизации процесса" class="wp-image-2080" srcset="https://otus.ru/journal/wp-content/uploads/2021/09/4-1.jpg 613w, https://otus.ru/journal/wp-content/uploads/2021/09/4-1-300x71.jpg 300w, https://otus.ru/journal/wp-content/uploads/2021/09/4-1-150x36.jpg 150w" sizes="(max-width: 613px) 100vw, 613px" /></figure>
<p>При подобных обстоятельствах тестинг пройдет успешно, так как исключение ожидаемо. Для длинных операций указывается дополнительное значение timeout. Прописывается в миллисекундах. Если метод не обработается за установленное время, тест потерпит провал:</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="415" height="82" src="https://otus.ru/journal/wp-content/uploads/2021/09/5-1.jpg" alt="Тестирование мобильного софта: все об автоматизации процесса" class="wp-image-2081" srcset="https://otus.ru/journal/wp-content/uploads/2021/09/5-1.jpg 415w, https://otus.ru/journal/wp-content/uploads/2021/09/5-1-300x59.jpg 300w, https://otus.ru/journal/wp-content/uploads/2021/09/5-1-150x30.jpg 150w" sizes="(max-width: 415px) 100vw, 415px" /></figure>
<p>Есть механизм Matchers, который представляет логические операции совпадения:</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="426" height="127" src="https://otus.ru/journal/wp-content/uploads/2021/09/6-1.jpg" alt="Тестирование мобильного софта: все об автоматизации процесса" class="wp-image-2082" srcset="https://otus.ru/journal/wp-content/uploads/2021/09/6-1.jpg 426w, https://otus.ru/journal/wp-content/uploads/2021/09/6-1-300x89.jpg 300w, https://otus.ru/journal/wp-content/uploads/2021/09/6-1-150x45.jpg 150w" sizes="(max-width: 426px) 100vw, 426px" /></figure>
<p>Тут:</p>
<ul><li>is() – оператор «равно»;</li><li>is(not()) – «неравно»;</li><li>hasItem() – проверка на наличие составляющей в списке.</li></ul>
<p>Также «Мокито» используется, чтобы создавать своеобразные «заглушки». Речь идет о mock-объектах. Это – сложные элементы, которые не требуют тестинга. Объявляются:</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="540" height="226" src="https://otus.ru/journal/wp-content/uploads/2021/09/7-1.jpg" alt="Тестирование мобильного софта: все об автоматизации процесса" class="wp-image-2083" srcset="https://otus.ru/journal/wp-content/uploads/2021/09/7-1.jpg 540w, https://otus.ru/journal/wp-content/uploads/2021/09/7-1-300x126.jpg 300w, https://otus.ru/journal/wp-content/uploads/2021/09/7-1-150x63.jpg 150w" sizes="(max-width: 540px) 100vw, 540px" /></figure>
<p>Для использования аннотации @Mock класс заменяют аннотацией @RunWith или проводят в @Before-методе MockitoAnnotations.</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="470" height="149" src="https://otus.ru/journal/wp-content/uploads/2021/09/8-1.jpg" alt="Тестирование мобильного софта: все об автоматизации процесса" class="wp-image-2084" srcset="https://otus.ru/journal/wp-content/uploads/2021/09/8-1.jpg 470w, https://otus.ru/journal/wp-content/uploads/2021/09/8-1-300x95.jpg 300w, https://otus.ru/journal/wp-content/uploads/2021/09/8-1-150x48.jpg 150w" sizes="(max-width: 470px) 100vw, 470px" /></figure>
<p>Как только появляется «замоканный» элемент, можно творить различные невообразимые вещи. Пример – переопределение названия приложения из строкового ресурса:</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="596" height="109" src="https://otus.ru/journal/wp-content/uploads/2021/09/9-1.jpg" alt="Тестирование мобильного софта: все об автоматизации процесса" class="wp-image-2085" srcset="https://otus.ru/journal/wp-content/uploads/2021/09/9-1.jpg 596w, https://otus.ru/journal/wp-content/uploads/2021/09/9-1-300x55.jpg 300w, https://otus.ru/journal/wp-content/uploads/2021/09/9-1-150x27.jpg 150w" sizes="(max-width: 596px) 100vw, 596px" /></figure>
<p>Далее после вызова getString() осуществляется возврат Fake String. Это проводится даже тогда, когда он вызван неявным методом (за пределами тестинга):</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="558" height="114" src="https://otus.ru/journal/wp-content/uploads/2021/09/10.jpg" alt="Тестирование мобильного софта: все об автоматизации процесса" class="wp-image-2086" srcset="https://otus.ru/journal/wp-content/uploads/2021/09/10.jpg 558w, https://otus.ru/journal/wp-content/uploads/2021/09/10-300x61.jpg 300w, https://otus.ru/journal/wp-content/uploads/2021/09/10-150x31.jpg 150w, https://otus.ru/journal/wp-content/uploads/2021/09/10-554x114.jpg 554w" sizes="(max-width: 558px) 100vw, 558px" /></figure>
<p>Теперь можно заменять все строчки на используемую:</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="485" height="76" src="https://otus.ru/journal/wp-content/uploads/2021/09/11.jpg" alt="Тестирование мобильного софта: все об автоматизации процесса" class="wp-image-2087" srcset="https://otus.ru/journal/wp-content/uploads/2021/09/11.jpg 485w, https://otus.ru/journal/wp-content/uploads/2021/09/11-300x47.jpg 300w, https://otus.ru/journal/wp-content/uploads/2021/09/11-150x24.jpg 150w" sizes="(max-width: 485px) 100vw, 485px" /></figure>
<p>Можно исключить Exception и использовать when….thenThrow. Также есть метод verify. Он проваливает тест, если указанный метод ранее не вызывался:</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="588" height="187" src="https://otus.ru/journal/wp-content/uploads/2021/09/12.jpg" alt="Тестирование мобильного софта: все об автоматизации процесса" class="wp-image-2088" srcset="https://otus.ru/journal/wp-content/uploads/2021/09/12.jpg 588w, https://otus.ru/journal/wp-content/uploads/2021/09/12-300x95.jpg 300w, https://otus.ru/journal/wp-content/uploads/2021/09/12-150x48.jpg 150w" sizes="(max-width: 588px) 100vw, 588px" /></figure>
<p>Сначала метод передается в мок-лист, после указываются методы, интересующие пользователя. Тут задействовано добавление строчки и очистка списка.</p>
<p>Полный потенциал открывается при spy-объектах. За ними можно следить как за фейковыми элементами:</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="625" height="286" src="https://otus.ru/journal/wp-content/uploads/2021/09/13.jpg" alt="Тестирование мобильного софта: все об автоматизации процесса" class="wp-image-2089" srcset="https://otus.ru/journal/wp-content/uploads/2021/09/13.jpg 625w, https://otus.ru/journal/wp-content/uploads/2021/09/13-300x137.jpg 300w, https://otus.ru/journal/wp-content/uploads/2021/09/13-150x69.jpg 150w" sizes="(max-width: 625px) 100vw, 625px" /></figure>
<p>Но есть и другой вариант развития событий. А именно – «инструментальный» тестинг.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="Instrumented-%D1%82%D0%B5%D1%81%D1%82%D1%8B"></span>Instrumented-тесты<span class="ez-toc-section-end"></span></h3>
<p>При реализации этой «версии» тестов для Android юзер получает доступ к настоящему контексту приложения. Дополнительно – ко всем возможностям и функционалу Android API. Предусматривает GodMode, который позволяет управлять жизненным циклом активности.</p>
<p>Чтобы распознавать тест в виде инструментального, размещается класс соответствующей аннотации:</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="605" height="121" src="https://otus.ru/journal/wp-content/uploads/2021/09/14.jpg" alt="Тестирование мобильного софта: все об автоматизации процесса" class="wp-image-2090" srcset="https://otus.ru/journal/wp-content/uploads/2021/09/14.jpg 605w, https://otus.ru/journal/wp-content/uploads/2021/09/14-300x60.jpg 300w, https://otus.ru/journal/wp-content/uploads/2021/09/14-150x30.jpg 150w" sizes="(max-width: 605px) 100vw, 605px" /></figure>
<p>Далее проделывается следующее:</p>
<ul><li>осуществляется пометка тестов;</li><li>проверяется пакет на соответствие приложению.</li></ul>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="786" height="176" src="https://otus.ru/journal/wp-content/uploads/2021/09/15.jpg" alt="Тестирование мобильного софта: все об автоматизации процесса" class="wp-image-2091" srcset="https://otus.ru/journal/wp-content/uploads/2021/09/15.jpg 786w, https://otus.ru/journal/wp-content/uploads/2021/09/15-300x67.jpg 300w, https://otus.ru/journal/wp-content/uploads/2021/09/15-150x34.jpg 150w, https://otus.ru/journal/wp-content/uploads/2021/09/15-768x172.jpg 768w" sizes="(max-width: 786px) 100vw, 786px" /></figure>
<p>Инструментарий позволяет прослушивать состояние активностей:</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="834" height="232" src="https://otus.ru/journal/wp-content/uploads/2021/09/16.jpg" alt="Тестирование мобильного софта: все об автоматизации процесса" class="wp-image-2093" srcset="https://otus.ru/journal/wp-content/uploads/2021/09/16.jpg 834w, https://otus.ru/journal/wp-content/uploads/2021/09/16-300x83.jpg 300w, https://otus.ru/journal/wp-content/uploads/2021/09/16-150x42.jpg 150w, https://otus.ru/journal/wp-content/uploads/2021/09/16-768x214.jpg 768w" sizes="(max-width: 834px) 100vw, 834px" /></figure>
<p>А еще можно управлять их состоянием.</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="806" height="147" src="https://otus.ru/journal/wp-content/uploads/2021/09/17.jpg" alt="Тестирование мобильного софта: все об автоматизации процесса" class="wp-image-2094" srcset="https://otus.ru/journal/wp-content/uploads/2021/09/17.jpg 806w, https://otus.ru/journal/wp-content/uploads/2021/09/17-300x55.jpg 300w, https://otus.ru/journal/wp-content/uploads/2021/09/17-150x27.jpg 150w, https://otus.ru/journal/wp-content/uploads/2021/09/17-768x140.jpg 768w" sizes="(max-width: 806px) 100vw, 806px" /></figure>
<p>Все это поможет проводить Unit-тестирование в том или ином случае. Если заранее подготовиться к процессу, можно довольно быстро воплотить задумку в жизнь. Главное не торопиться, выбрать методы и платформы, а затем действовать поэтапно.</p>
<p>Внимание: «ручную» проверку тоже рекомендуется осуществлять. И не только при мобильных приложениях, но и во всех других ситуациях. Пользователи иногда способны обнаружить то, что «машины» попросту пропустят. Лишь так удается добиться максимальной результативности.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9A%D0%B0%D0%BA_%D1%81%D1%82%D0%B0%D1%82%D1%8C_%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D1%89%D0%B8%D0%BA%D0%BE%D0%BC"></span>Как стать тестировщиком<span class="ez-toc-section-end"></span></h2>
<p>Каждый желающий может освоить рассмотренную сферу в информационных технологиях. Но для реализации поставленной задачи приходится изрядно постараться. Особенно это касается тех, кто долгое время не занимался программированием и разработкой.</p>
<p>Разработчики должны заниматься не только созданием архитектуры утилит и их написанием, но и проверкой. Обычным программерам приходится дополнительно обучаться на тестировщиков.</p>
<p>Сделать это можно несколькими способами:</p>
<ol type="1"><li>Воспользоваться самообразованием. В Сети полно информации по реализации тестинга. И не только для мобильных платформ. Неплохой вариант, но лучше всего он дается не новичкам.</li><li>Обучиться в ВУЗе. Лучше отдавать предпочтение «разработчикам». Особенно, специализирующихся на мобильных утилитах. В процессе ученики освоят все азы процесса, познакомятся с разнообразными способами воплощения задумки в жизнь. Результат – диплом установленной формы.</li><li><a href="https://otus.ru/categories/testing/?utm_source=oj" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Пройти спецкурсы<span class="wpel-icon wpel-image wpel-icon-6"></span></a>. В Москве и других регионах России существуют различные образовательные центры. Они обучают очно, заочно и дистанционно. Предусматривают сегментированное наставничество в выбранном направлении. Обучение длится от нескольких месяцев до года. В конце выдается сертификат.</li></ol>
<p>Последний вариант наиболее популярен на сегодняшний день. Он позволяет быстро научиться тем или иным IT-возможностям по строго намеченному пути.</p>
<p>Научиться автоматизации тестирования мобильных приложений людям, которые уже знают азы программирования, проще. Но и с «нуля» этот процесс вполне удается инициировать. Главное – изучать материалы и много практиковаться. В Сети есть и видеоуроки, и сопутствующая литература. Можно остановиться как на предложениях для новичков, так и для уже опытных программеров.</p>
<p>Внимание: немаловажны для процесса обучения такие черты, как усидчивость, целеустремленность и умение работать в команде.</p>
<p>P. S. <a href="https://otus.ru/categories/testing/?utm_source=oj" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Большой выбор курсов по тестированию<span class="wpel-icon wpel-image wpel-icon-6"></span></a> есть и в Otus. Среди них широко представлено и направление автоматизации. Есть варианты как для продвинутых, так и для начинающих пользователей. </p>
<figure class="wp-block-image size-large"><a href="https://otus.ru/lessons/kotlin-qa-engineer/?utm_source=oj&utm_medium=affilate&utm_campaign=kotlin-qa" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer"><img loading="lazy" decoding="async" width="970" height="70" src="https://otus.ru/journal/wp-content/uploads/2022/02/KotlinQA_Headline_970x70.jpg" alt="Тестирование мобильного софта: все об автоматизации процесса" class="wp-image-2920" srcset="https://otus.ru/journal/wp-content/uploads/2022/02/KotlinQA_Headline_970x70.jpg 970w, https://otus.ru/journal/wp-content/uploads/2022/02/KotlinQA_Headline_970x70-300x22.jpg 300w, https://otus.ru/journal/wp-content/uploads/2022/02/KotlinQA_Headline_970x70-150x11.jpg 150w, https://otus.ru/journal/wp-content/uploads/2022/02/KotlinQA_Headline_970x70-768x55.jpg 768w" sizes="(max-width: 970px) 100vw, 970px" /></a></figure>
</div><!-- .post-content -->
<div class="the-post-foot cf">
<div class="tag-share cf">
<div class="post-tags"><a href="https://otus.ru/journal/tag/android-2/" rel="tag" data-wpel-link="internal">Android</a><a href="https://otus.ru/journal/tag/ios/" rel="tag" data-wpel-link="internal">iOS</a><a href="https://otus.ru/journal/tag/testirovanie/" rel="tag" data-wpel-link="internal">тестирование</a></div>
<div class="post-share">
<div class="post-share-icons cf">
<span class="counters">
</span>
<a href="https://www.facebook.com/sharer.php?u=https%3A%2F%2Fotus.ru%2Fjournal%2Ftestirovanie-mobilnogo-softa-vse-ob-avtomatizacii-processa%2F" class="link facebook wpel-icon-right" target="_blank" title="Share on Facebook" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-facebook"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fotus.ru%2Fjournal%2Ftestirovanie-mobilnogo-softa-vse-ob-avtomatizacii-processa%2F&text=%D0%A2%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%BC%D0%BE%D0%B1%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE%20%D1%81%D0%BE%D1%84%D1%82%D0%B0%3A%20%D0%B2%D1%81%D0%B5%20%D0%BE%D0%B1%20%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8%20%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%B0" class="link twitter wpel-icon-right" target="_blank" title="Share on Twitter" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-twitter"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fotus.ru%2Fjournal%2Ftestirovanie-mobilnogo-softa-vse-ob-avtomatizacii-processa%2F" class="link linkedin wpel-icon-right" target="_blank" title="LinkedIn" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-linkedin"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://pinterest.com/pin/create/button/?url=https%3A%2F%2Fotus.ru%2Fjournal%2Ftestirovanie-mobilnogo-softa-vse-ob-avtomatizacii-processa%2F&media=https%3A%2F%2Fotus.ru%2Fjournal%2Fwp-content%2Fuploads%2F2021%2F09%2Foj-1080x720-3-1.png&description=%D0%A2%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%BC%D0%BE%D0%B1%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE%20%D1%81%D0%BE%D1%84%D1%82%D0%B0%3A%20%D0%B2%D1%81%D0%B5%20%D0%BE%D0%B1%20%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8%20%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%B0" class="link pinterest wpel-icon-right" target="_blank" title="Pinterest" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-pinterest-p"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
</div>
</div>
</div>
</div>
<div class="post-nav">
<div class="post previous cf">
<a href="https://otus.ru/journal/igrovye-dvizhki-dlya-brauzerov-kak-sozdat-svoju-igru/" title="Prev Post" class="nav-icon" data-wpel-link="internal">
<i class="fa fa-angle-left"></i>
</a>
<span class="content">
<a href="https://otus.ru/journal/igrovye-dvizhki-dlya-brauzerov-kak-sozdat-svoju-igru/" class="image-link" rel="previous" data-wpel-link="internal">
<img width="150" height="100" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20150%20100%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-thumbnail size-thumbnail lazyload wp-post-image" alt="Игровые движки для браузеров: как создать свою игру" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2021/09/oj-1080x720-2-2-150x100.png 150w, https://otus.ru/journal/wp-content/uploads/2021/09/oj-1080x720-2-2-300x200.png 300w, https://otus.ru/journal/wp-content/uploads/2021/09/oj-1080x720-2-2-1024x683.png 1024w, https://otus.ru/journal/wp-content/uploads/2021/09/oj-1080x720-2-2-768x512.png 768w, https://otus.ru/journal/wp-content/uploads/2021/09/oj-1080x720-2-2-270x180.png 270w, https://otus.ru/journal/wp-content/uploads/2021/09/oj-1080x720-2-2-770x515.png 770w, https://otus.ru/journal/wp-content/uploads/2021/09/oj-1080x720-2-2-370x245.png 370w, https://otus.ru/journal/wp-content/uploads/2021/09/oj-1080x720-2-2.png 1080w" data-src="https://otus.ru/journal/wp-content/uploads/2021/09/oj-1080x720-2-2-150x100.png" data-sizes="(max-width: 150px) 100vw, 150px" title="Игровые движки для браузеров: как создать свою игру" /> </a>
<div class="post-meta">
<span class="label">Prev Post</span>
<div class="post-meta post-meta-b">
<h2 class="post-title">
<a href="https://otus.ru/journal/igrovye-dvizhki-dlya-brauzerov-kak-sozdat-svoju-igru/" data-wpel-link="internal">Игровые движки для браузеров: как создать свою игру</a>
</h2>
<div class="below">
<a href="https://otus.ru/journal/igrovye-dvizhki-dlya-brauzerov-kak-sozdat-svoju-igru/" class="meta-item date-link" data-wpel-link="internal"><time class="post-date" datetime="2021-09-25T08:54:27+00:00">25 сентября, 2021</time></a>
<span class="meta-sep"></span>
<span class="meta-item read-time">7 Mins Read</span>
</div>
</div> </div>
</span>
</div>
<div class="post next cf">
<a href="https://otus.ru/journal/kak-stat-programmistom-na-js/" title="Next Post" class="nav-icon" data-wpel-link="internal">
<i class="fa fa-angle-right"></i>
</a>
<span class="content">
<a href="https://otus.ru/journal/kak-stat-programmistom-na-js/" class="image-link" rel="next" data-wpel-link="internal">
<img width="150" height="100" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20150%20100%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-thumbnail size-thumbnail lazyload wp-post-image" alt="Как стать программистом на JS" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2021/09/oj-1080x720-4-1-150x100.png 150w, https://otus.ru/journal/wp-content/uploads/2021/09/oj-1080x720-4-1-300x200.png 300w, https://otus.ru/journal/wp-content/uploads/2021/09/oj-1080x720-4-1-1024x683.png 1024w, https://otus.ru/journal/wp-content/uploads/2021/09/oj-1080x720-4-1-768x512.png 768w, https://otus.ru/journal/wp-content/uploads/2021/09/oj-1080x720-4-1-270x180.png 270w, https://otus.ru/journal/wp-content/uploads/2021/09/oj-1080x720-4-1-770x515.png 770w, https://otus.ru/journal/wp-content/uploads/2021/09/oj-1080x720-4-1-370x245.png 370w, https://otus.ru/journal/wp-content/uploads/2021/09/oj-1080x720-4-1.png 1080w" data-src="https://otus.ru/journal/wp-content/uploads/2021/09/oj-1080x720-4-1-150x100.png" data-sizes="(max-width: 150px) 100vw, 150px" title="Как стать программистом на JS" /> </a>
<div class="post-meta">
<span class="label">Next Post</span>
<div class="post-meta post-meta-b">
<h2 class="post-title">
<a href="https://otus.ru/journal/kak-stat-programmistom-na-js/" data-wpel-link="internal">Как стать программистом на JS</a>
</h2>
<div class="below">
<a href="https://otus.ru/journal/kak-stat-programmistom-na-js/" class="meta-item date-link" data-wpel-link="internal"><time class="post-date" datetime="2021-09-25T09:49:43+00:00">25 сентября, 2021</time></a>
<span class="meta-sep"></span>
<span class="meta-item read-time">7 Mins Read</span>
</div>
</div> </div>
</span>
</div>
</div>
<section class="related-posts grid-3">
<h4 class="section-head"><span class="title">Читать ещё</span></h4>
<div class="ts-row posts cf">
<article class="post col-4">
<a href="https://otus.ru/journal/uroven-gotovnosti-cto-k-2026/" title="Уровень готовности CTO к 2026" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Уровень готовности CTO к 2026" title="Уровень готовности CTO к 2026" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-270x180.jpg 270w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-370x245.jpg 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-270x180.jpg" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/uroven-gotovnosti-cto-k-2026/" class="post-link" data-wpel-link="internal">Уровень готовности CTO к 2026</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-11-16T19:50:59+00:00">16 ноября, 2025</time>
</div>
</div>
</article >
<article class="post col-4">
<a href="https://otus.ru/journal/novye-uroki-noyabrya-tolko-top-temy-po-programmirovaniju/" title="Новые уроки ноября: только топ-темы по программированию" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Новые уроки ноября: только топ-темы по программированию" title="Новые уроки ноября: только топ-темы по программированию" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-270x180.jpg 270w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-370x245.jpg 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-270x180.jpg" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/novye-uroki-noyabrya-tolko-top-temy-po-programmirovaniju/" class="post-link" data-wpel-link="internal">Новые уроки ноября: только топ-темы по программированию</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-11-09T23:24:11+00:00">9 ноября, 2025</time>
</div>
</div>
</article >
<article class="post col-4">
<a href="https://otus.ru/journal/schjot-idjot-na-chasy/" title="Счёт идёт на часы" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Счёт идёт на часы" title="Счёт идёт на часы" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-270x180.png 270w, https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-770x515.png 770w, https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-370x245.png 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-270x180.png" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/schjot-idjot-na-chasy/" class="post-link" data-wpel-link="internal">Счёт идёт на часы</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-10-30T15:04:59+00:00">30 октября, 2025</time>
</div>
</div>
</article >
</div>
</section>
</article> <!-- .the-post -->
</div>
<aside class="col-4 sidebar">
<div class="inner">
<ul>
<li id="search-2" class="widget widget_search"><h5 class="widget-title"><span>Поиск по блогу</span></h5>
<form method="get" class="search-form" action="https://otus.ru/journal/">
<label>
<span class="screen-reader-text">Search for:</span>
<input type="search" class="search-field" placeholder="Введите запрос и нажмите Enter" value="" name="s" title="Search for:" />
</label>
<button type="submit" class="search-submit"><i class="fa fa-search"></i></button>
</form>
</li>
<li id="tag_cloud-5" class="widget widget_tag_cloud"><h5 class="widget-title"><span>Метки</span></h5><div class="tagcloud"><a href="https://otus.ru/journal/tag/android-2/" class="tag-cloud-link tag-link-74 tag-link-position-1" style="font-size: 12.472222222222pt;" aria-label="Android (34 элемента)" data-wpel-link="internal">Android</a>
<a href="https://otus.ru/journal/tag/c-3/" class="tag-cloud-link tag-link-91 tag-link-position-2" style="font-size: 10.916666666667pt;" aria-label="C (23 элемента)" data-wpel-link="internal">C</a>
<a href="https://otus.ru/journal/tag/c-2/" class="tag-cloud-link tag-link-81 tag-link-position-3" style="font-size: 12.666666666667pt;" aria-label="C# (35 элементов)" data-wpel-link="internal">C#</a>
<a href="https://otus.ru/journal/tag/c/" class="tag-cloud-link tag-link-20 tag-link-position-4" style="font-size: 12.472222222222pt;" aria-label="c++ (34 элемента)" data-wpel-link="internal">c++</a>
<a href="https://otus.ru/journal/tag/computer-science/" class="tag-cloud-link tag-link-209 tag-link-position-5" style="font-size: 15.972222222222pt;" aria-label="computer science (78 элементов)" data-wpel-link="internal">computer science</a>
<a href="https://otus.ru/journal/tag/css/" class="tag-cloud-link tag-link-288 tag-link-position-6" style="font-size: 8.6805555555556pt;" aria-label="CSS (13 элементов)" data-wpel-link="internal">CSS</a>
<a href="https://otus.ru/journal/tag/data-science/" class="tag-cloud-link tag-link-151 tag-link-position-7" style="font-size: 8pt;" aria-label="Data Science (11 элементов)" data-wpel-link="internal">Data Science</a>
<a href="https://otus.ru/journal/tag/devops/" class="tag-cloud-link tag-link-98 tag-link-position-8" style="font-size: 10.138888888889pt;" aria-label="devops (19 элементов)" data-wpel-link="internal">devops</a>
<a href="https://otus.ru/journal/tag/docker/" class="tag-cloud-link tag-link-143 tag-link-position-9" style="font-size: 8.2916666666667pt;" aria-label="Docker (12 элементов)" data-wpel-link="internal">Docker</a>
<a href="https://otus.ru/journal/tag/gamedev/" class="tag-cloud-link tag-link-25 tag-link-position-10" style="font-size: 11.694444444444pt;" aria-label="gamedev (28 элементов)" data-wpel-link="internal">gamedev</a>
<a href="https://otus.ru/journal/tag/hr/" class="tag-cloud-link tag-link-103 tag-link-position-11" style="font-size: 8pt;" aria-label="hr (11 элементов)" data-wpel-link="internal">hr</a>
<a href="https://otus.ru/journal/tag/html/" class="tag-cloud-link tag-link-217 tag-link-position-12" style="font-size: 11.208333333333pt;" aria-label="HTML (25 элементов)" data-wpel-link="internal">HTML</a>
<a href="https://otus.ru/journal/tag/ios/" class="tag-cloud-link tag-link-101 tag-link-position-13" style="font-size: 8.9722222222222pt;" aria-label="iOS (14 элементов)" data-wpel-link="internal">iOS</a>
<a href="https://otus.ru/journal/tag/it/" class="tag-cloud-link tag-link-50 tag-link-position-14" style="font-size: 10.527777777778pt;" aria-label="IT (21 элемент)" data-wpel-link="internal">IT</a>
<a href="https://otus.ru/journal/tag/java/" class="tag-cloud-link tag-link-75 tag-link-position-15" style="font-size: 15.680555555556pt;" aria-label="Java (73 элемента)" data-wpel-link="internal">Java</a>
<a href="https://otus.ru/journal/tag/javascript/" class="tag-cloud-link tag-link-83 tag-link-position-16" style="font-size: 14.319444444444pt;" aria-label="JavaScript (53 элемента)" data-wpel-link="internal">JavaScript</a>
<a href="https://otus.ru/journal/tag/linux/" class="tag-cloud-link tag-link-141 tag-link-position-17" style="font-size: 11.888888888889pt;" aria-label="Linux (29 элементов)" data-wpel-link="internal">Linux</a>
<a href="https://otus.ru/journal/tag/machine-learning/" class="tag-cloud-link tag-link-167 tag-link-position-18" style="font-size: 8.6805555555556pt;" aria-label="Machine Learning (13 элементов)" data-wpel-link="internal">Machine Learning</a>
<a href="https://otus.ru/journal/tag/otus-book/" class="tag-cloud-link tag-link-261 tag-link-position-19" style="font-size: 9.9444444444444pt;" aria-label="otus book (18 элементов)" data-wpel-link="internal">otus book</a>
<a href="https://otus.ru/journal/tag/php/" class="tag-cloud-link tag-link-45 tag-link-position-20" style="font-size: 10.527777777778pt;" aria-label="PHP (21 элемент)" data-wpel-link="internal">PHP</a>
<a href="https://otus.ru/journal/tag/python/" class="tag-cloud-link tag-link-27 tag-link-position-21" style="font-size: 16.944444444444pt;" aria-label="Python (99 элементов)" data-wpel-link="internal">Python</a>
<a href="https://otus.ru/journal/tag/qa/" class="tag-cloud-link tag-link-155 tag-link-position-22" style="font-size: 11.402777777778pt;" aria-label="qa (26 элементов)" data-wpel-link="internal">qa</a>
<a href="https://otus.ru/journal/tag/sql/" class="tag-cloud-link tag-link-38 tag-link-position-23" style="font-size: 12.861111111111pt;" aria-label="SQL (37 элементов)" data-wpel-link="internal">SQL</a>
<a href="https://otus.ru/journal/tag/team-lead/" class="tag-cloud-link tag-link-364 tag-link-position-24" style="font-size: 9.9444444444444pt;" aria-label="team lead (18 элементов)" data-wpel-link="internal">team lead</a>
<a href="https://otus.ru/journal/tag/unity/" class="tag-cloud-link tag-link-24 tag-link-position-25" style="font-size: 8pt;" aria-label="unity (11 элементов)" data-wpel-link="internal">unity</a>
<a href="https://otus.ru/journal/tag/algoritmy/" class="tag-cloud-link tag-link-30 tag-link-position-26" style="font-size: 9.9444444444444pt;" aria-label="Алгоритмы (18 элементов)" data-wpel-link="internal">Алгоритмы</a>
<a href="https://otus.ru/journal/tag/bazy-dannyh/" class="tag-cloud-link tag-link-40 tag-link-position-27" style="font-size: 10.138888888889pt;" aria-label="Базы данных (19 элементов)" data-wpel-link="internal">Базы данных</a>
<a href="https://otus.ru/journal/tag/matematika/" class="tag-cloud-link tag-link-44 tag-link-position-28" style="font-size: 10.916666666667pt;" aria-label="Математика (23 элемента)" data-wpel-link="internal">Математика</a>
<a href="https://otus.ru/journal/tag/arhitektura-po/" class="tag-cloud-link tag-link-10 tag-link-position-29" style="font-size: 9.4583333333333pt;" aria-label="архитектура ПО (16 элементов)" data-wpel-link="internal">архитектура ПО</a>
<a href="https://otus.ru/journal/tag/bazy-dannyh-2/" class="tag-cloud-link tag-link-251 tag-link-position-30" style="font-size: 10.138888888889pt;" aria-label="базы данных (19 элементов)" data-wpel-link="internal">базы данных</a>
<a href="https://otus.ru/journal/tag/vebinar/" class="tag-cloud-link tag-link-201 tag-link-position-31" style="font-size: 13.930555555556pt;" aria-label="вебинар (48 элементов)" data-wpel-link="internal">вебинар</a>
<a href="https://otus.ru/journal/tag/dajdzhest/" class="tag-cloud-link tag-link-308 tag-link-position-32" style="font-size: 10.722222222222pt;" aria-label="дайджест (22 элемента)" data-wpel-link="internal">дайджест</a>
<a href="https://otus.ru/journal/tag/zapis-vebinara/" class="tag-cloud-link tag-link-226 tag-link-position-33" style="font-size: 14.902777777778pt;" aria-label="запись вебинара (61 элемент)" data-wpel-link="internal">запись вебинара</a>
<a href="https://otus.ru/journal/tag/zapis-uroka/" class="tag-cloud-link tag-link-272 tag-link-position-34" style="font-size: 16.069444444444pt;" aria-label="запись урока (80 элементов)" data-wpel-link="internal">запись урока</a>
<a href="https://otus.ru/journal/tag/informacionnaya-bezopasnost/" class="tag-cloud-link tag-link-232 tag-link-position-35" style="font-size: 10.138888888889pt;" aria-label="информационная безопасность (19 элементов)" data-wpel-link="internal">информационная безопасность</a>
<a href="https://otus.ru/journal/tag/karera-v-it/" class="tag-cloud-link tag-link-292 tag-link-position-36" style="font-size: 9.9444444444444pt;" aria-label="карьера в IT (18 элементов)" data-wpel-link="internal">карьера в IT</a>
<a href="https://otus.ru/journal/tag/podborka/" class="tag-cloud-link tag-link-7 tag-link-position-37" style="font-size: 12.666666666667pt;" aria-label="подборка (35 элементов)" data-wpel-link="internal">подборка</a>
<a href="https://otus.ru/journal/tag/podborka-statej/" class="tag-cloud-link tag-link-219 tag-link-position-38" style="font-size: 15.777777777778pt;" aria-label="подборка статей (75 элементов)" data-wpel-link="internal">подборка статей</a>
<a href="https://otus.ru/journal/tag/programmirovanie/" class="tag-cloud-link tag-link-65 tag-link-position-39" style="font-size: 22pt;" aria-label="программирование (332 элемента)" data-wpel-link="internal">программирование</a>
<a href="https://otus.ru/journal/tag/proekt/" class="tag-cloud-link tag-link-321 tag-link-position-40" style="font-size: 11.888888888889pt;" aria-label="проект (29 элементов)" data-wpel-link="internal">проект</a>
<a href="https://otus.ru/journal/tag/proektnaya-rabota/" class="tag-cloud-link tag-link-310 tag-link-position-41" style="font-size: 11.597222222222pt;" aria-label="проектная работа (27 элементов)" data-wpel-link="internal">проектная работа</a>
<a href="https://otus.ru/journal/tag/seti/" class="tag-cloud-link tag-link-181 tag-link-position-42" style="font-size: 12.958333333333pt;" aria-label="сети (38 элементов)" data-wpel-link="internal">сети</a>
<a href="https://otus.ru/journal/tag/testirovanie/" class="tag-cloud-link tag-link-69 tag-link-position-43" style="font-size: 13.930555555556pt;" aria-label="тестирование (48 элементов)" data-wpel-link="internal">тестирование</a>
<a href="https://otus.ru/journal/tag/upravlenie-komandoj/" class="tag-cloud-link tag-link-63 tag-link-position-44" style="font-size: 11.694444444444pt;" aria-label="управление командой (28 элементов)" data-wpel-link="internal">управление командой</a>
<a href="https://otus.ru/journal/tag/habr-2/" class="tag-cloud-link tag-link-203 tag-link-position-45" style="font-size: 13.930555555556pt;" aria-label="хабр (48 элементов)" data-wpel-link="internal">хабр</a></div>
</li>
</ul>
</div>
</aside>
</div> <!-- .ts-row -->
</div> <!-- .main -->
<footer class="main-footer dark bold">
<section class="lower-footer cf">
<div class="wrap">
<div class="links">
<div class="menu-menju-navykov-container"><ul id="menu-menju-navykov-1" class="menu"><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10413"><a href="https://otus.ru/categories/programming/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Программирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10414"><a href="https://otus.ru/categories/architecture/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Архитектура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10415"><a href="https://otus.ru/categories/operations/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Инфраструктура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10416"><a href="https://otus.ru/categories/information-security-courses/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Безопасность<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10417"><a href="https://otus.ru/categories/data-science/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Data Science<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10418"><a href="https://otus.ru/categories/gamedev/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">GameDev<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10419"><a href="https://otus.ru/categories/marketing-business/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Управление<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10420"><a href="https://otus.ru/categories/analytics/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Аналитика и анализ<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10421"><a href="https://otus.ru/categories/testing/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Тестирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </div>
<p class="copyright"> © 2015-2026 OTUS </p>
<div class="to-top">
<a href="#" class="back-to-top"><i class="fa fa-angle-up"></i> Top</a>
</div>
</div>
</section>
</footer>
</div> <!-- .main-wrap -->
<div class="mobile-menu-container off-canvas" id="mobile-menu">
<a href="#" class="close"><i class="fa fa-times"></i></a>
<div class="logo">
</div>
<ul class="mobile-menu"></ul>
</div>
<div class="search-modal-wrap">
<div class="search-modal-box" role="dialog" aria-modal="true">
<form method="get" class="search-form" action="https://otus.ru/journal/">
<input type="search" class="search-field" name="s" placeholder="Search..." value="" required />
<button type="submit" class="search-submit visuallyhidden">Submit</button>
<p class="message">
Type above and press <em>Enter</em> to search. Press <em>Esc</em> to cancel. </p>
</form>
</div>
</div>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/clearfy/components/comments-plus/assets/js/url-span.js" id="wbcr-comments-plus-url-span-js"></script>
<script type="text/javascript" id="ez-toc-scroll-scriptjs-js-extra">
/* <![CDATA[ */
var eztoc_smooth_local = {"scroll_offset":"30"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/js/smooth_scroll.min.js" id="ez-toc-scroll-scriptjs-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/vendor/js-cookie/js.cookie.min.js" id="ez-toc-js-cookie-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/vendor/sticky-kit/jquery.sticky-kit.min.js" id="ez-toc-jquery-sticky-kit-js"></script>
<script type="text/javascript" id="ez-toc-js-js-extra">
/* <![CDATA[ */
var ezTOC = {"smooth_scroll":"1","visibility_hide_by_default":"","scroll_offset":"30","fallbackIcon":"<span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span>"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/js/front.min.js" id="ez-toc-js-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/custom-script.js" id="custom-script-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/magnific-popup.js" id="magnific-popup-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jquery.fitvids.js" id="jquery-fitvids-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/imagesloaded.min.js" id="imagesloaded-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/object-fit-images.js" id="object-fit-images-js"></script>
<script type="text/javascript" id="contentberg-theme-js-extra">
/* <![CDATA[ */
var Bunyad = {"custom_ajax_url":"\/journal\/testirovanie-mobilnogo-softa-vse-ob-avtomatizacii-processa\/"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/theme.js" id="contentberg-theme-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/theia-sticky-sidebar.js" id="theia-sticky-sidebar-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jquery.slick.js" id="jquery-slick-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jarallax.js" id="jarallax-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/masonry.min.js" id="masonry-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery.masonry.min.js" id="jquery-masonry-js"></script>
</body>
</html>
<!-- Cache served by breeze CACHE - Last modified: Tue, 10 Mar 2026 15:12:57 GMT -->