Всем привет, меня зовут Дарья Чернышева, я инженер по обеспечению качества команды 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).
Какая задача была у разработчиков?
Собирать приложение в специальную тестовую сборку.
Слушать специальное событие, имитирующее сканирование по заданному заранее Action.
В данных intent извлекать информацию о отсканированном коде.
Выполнять логику, типовую для приложения, словно код был отсканирован реальным сканером.
Записать необходимые действия и поля для 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:
В проекте должен быть достаточный уровень абстракции,
У вас должен быть достаточный ресурс разработчиков.
Благо в нашем проекте 3 разработчика, и они старались придерживаться рекомендаций CleanArchitecture.