Тестирование продукта RuScanner: как заставить отладчик Android работать во благо тестирования

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

Всем привет, меня зовут Дарья Чернышева, я инженер по обеспечению качества команды RuScanner.

В этом посте я расскажу про процессы на проекте и о том, как мы при помощи специальных отладочных инструментов Android решили проблему со сканированием штрих-кодов в автоматизации.

Подробнее про продукт

RuScanner (RS) — приложение для сканирования маркированных товаров и коробов, в которые эти товары упаковываются. Товары сканируются посредством считывания специальной этикетки КИЗ (CIL), а короба — LPN, зашифрованных в штрихкоды. 

Приложение написано на платформе Android. Стек технологии:

  • Android 6+;

  • Kotlin, Coroutines, Flow;

  • Clean Architecture, MVVM;

  • Compose;

  • Room;

  • 2D Scanner.

Наш workflow

Как многие знают, в тестировании на Android автоматизировать тесты достаточно на 70-80%, но не стоит забывать и про ручное тестировать.

Для того чтобы качественно протестировать наше приложение, нужно иметь на проекте стратегию тестирования.

На первом этапе мы составляем план тестирования, настраиваем тестовое окружение, пишем тест-кейсы, затем выполняем тесты и заводим (если нужно) баг-репорты.

Так как приложение можно использовать не только на специализированных устройствах (Терминалы сбора данных, ТСД), но и на личных устройствах пользователя, в нашей команде при тестировании используются устройства:

  • Urovo i6300;

  • Zebra MC330K 2D;

  • Zebra TC26;

  • Samsung Galaxy S20 FE;

  • Samsung Galaxy A11.

Устройства имеют разное разрешение экранов, разную вариацию операционной системы Android и разных производителей. Поэтому мы тщательно подходим к тестированию UI.

В Автоматизации мы используем стек – Java + TestNG + Maven + Appium + Cucumber + Allure. 

Данный фреймворк используется на проекте, так как ручные тестировщики могут участвовать в написании автотестов, имея базовые знания языка программирования.

Как мы автоматизируем сканирование штрих-кодов на проекте RuScanner

Немножко про Broadcast Receiver

Broadcast Receiver — это механизм для получения широковещательных событий в Android.
Если кратко, то это компоненты в вашем приложении Android, которые прослушивают сообщения (или события) из разных источников:

  • из других приложений;

  • из самой системы;

  • из вашего приложения.

Для передачи событий используется Intent («намерение») – важная сущность в мире Android. Intent используется для передачи сообщений, событий, запуска приложений и в других важных процессах взаимодействия приложений и системы.
У Intent`а есть Action (главный атрибут, обозначающий назначение намерения) и Extras (данные, которые в себе несет Intent).

Какая задача была у разработчиков?

  1. Собирать приложение в специальную тестовую сборку.

  2. Слушать специальное событие, имитирующее сканирование по заданному заранее Action.

  3. В данных intent извлекать информацию о отсканированном коде.

  4. Выполнять логику, типовую для приложения, словно код был отсканирован реальным сканером.

  5. Записать необходимые действия и поля для broadcast — для всех типов 1D/2D-кодов, которые используем в приложении.

Что получилось?

У Android-устройства, на котором включён режим разработчика (или на эмуляторе), есть специальная программа – Android Debug Bridge (ADB, вот инструкция по её установке), которая позволяет всячески манипулировать устройством для целей отладки и разработки. В том числе эта программа позволяет нам отправлять Broadcast-сообщения, необходимые для эмулирования сканирования. К сожалению, adb – это консольная утилита, не имеющая графического интерфейса. 

Далее мы рассмотрим пример нашей команды для отправки broadcast. 

Сама команда: 

adb shell "am broadcast -a ruscanner.message --ei barcodeType 106 --es barcode ']C001234567891911112'"

Разберем в данной строчке все по порядку: 

Adb – программа позволяет связываться с андроид-отладчиком на андроид-устройстве.

Adb shell –вызов консоли Android для выполнения команд.

"am broadcast – это активити-менеджер, которому мы даем команду сделать Broadcast.

-a ruscanner.message – ключ -a указывает action

--ei barcodeType 106 – ключ –ei говорит, что это будет целочисленное поле extra с именем barcodeType

--es barcode ']C001234567891911112'" - ключ –es указывает, что это будет строковая extra с именем barcode. 

Важно: Вы, наверное, заметили, что строковая extra обёрнута в одинарные кавычки. Так происходит потому, что мы отправляем команду в android-shell, а там используется linux (sh) и следует учитывать, что некоторые символы или строковые литералы потребуется экранировать или обернуть в одинарные кавычки”

Приложение пробует распарсить данные, смотрит, есть ли там Extras, есть ли там данные с ключом barcode. Если данные указаны верно, то мы пытаемся из команды извлечь строку и отправляем в поток, который используется для сканирования. 

В приложении RuScanner используется Coroutines Flow. В нашем случае – это поток, который непрерывно шлёт данные, а часть приложения, ответственная за бизнес-логику, читает из этого потока. В него как раз и отправляют все сканирования, который смог распознать broadcast. 

А в итоге?

В итоге небольшой доработкой, которая не влияет на истинность тестирования, мы самым быстрым и простым способом достигли результата. Ещё эта доработка позволяет разработчикам проверять код в эмуляторе. То есть, она полезна не только для тестирования, но и для разработки. Вместе с тем, в продуктовой сборке данный BroadcastReceiver отключается, что не влияет на конечный продукт. 

Есть не только плюсы, но и минусы для способа с Broadcast: 

  1. В проекте должен быть достаточный уровень абстракции,

  2. У вас должен быть достаточный ресурс разработчиков. 

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

Источник: https://habr.com/ru/company/sportmaster_lab/blog/668990/


Интересные статьи

Интересные статьи

Прежде чем приступить к автоматизации тестирования желательно проанализировать приложение. Чем больше приложение готово к автоматизации, тем меньше проблем будет в дальнейшем при разработке автотестов...
Привет, хабровчане!Меня зовут Нурыев Асхат, я ведущий инженер по автоматизации в DINS. За время работы в компании я участвовал в решении множества сложных задач. В этой статье я поделюсь историей улуч...
(Эта статья первоначально появилась на TechBeacon.com)Перекладывание игральных карт колоды в свою пользу называется «подтасовать колоду». За пределами карточной игры этот термин используют в более шир...
Не так давно я начала писать тесты для нагрузочного тестирования с помощью инструмента artillery. Раньше писала тесты для K6, поэтому расскажу о преимуществах artillery по сравнению с К6,...
Привет, Хабр! Сегодня мы начинаем публикацию серии практических материалов для продакт-менеджеров, основателей стартапов и всех остальных, кто хочет приобрести навыки менеджера по раз...