Всем привет, меня зовут Дарья Чернышева, я инженер по обеспечению качества команды RuScanner. В этом посте я расскажу про процессы на проекте и о том, как мы при помощи специальных отладочных инструментов Android решили проблему со сканированием штрих-кодов в автоматизации. RuScanner (RS) — приложение для сканирования маркированных товаров и коробов, в которые эти товары упаковываются. Товары сканируются посредством считывания специальной этикетки КИЗ (CIL), а короба — LPN, зашифрованных в штрихкоды.  Приложение написано на платформе Android. Стек технологии: Android 6+; Kotlin, Coroutines, Flow; Clean Architecture, MVVM; Compose; Room; 2D Scanner. Как многие знают, в тестировании на 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.  Данный фреймворк используется на проекте, так как ручные тестировщики могут участвовать в написании автотестов, имея базовые знания языка программирования. 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.