Доступ к ресурсам для тестов Android UI Automator
Я работаю над набором тестов с использованием UI Automator на Android. У меня это работает, но мои текущие тесты сделаны с большим количеством строковых литералов.
Строковые литералы были хороши, когда я просто пытался заставить вещи работать, но они будут плохими в будущем. Если приложение изменилось, строковые литералы должны быть изменены, чтобы соответствовать. Также глупо, что мои тесты должны быть полностью переделаны для тестирования локализованных сборок на других языках.
В самом приложении все строки хранятся в ресурсах. Каждая строка имеет инвариантный идентификатор... вот пример:
<string name="more_options">More options</string>
Код приложения всегда будет использовать имя more_options
искать строковый ресурс, а не жестко кодировать "More options"
в код.
Итак, я хочу импортировать все строковые ресурсы, сохранить их в каком-либо объекте карты, а затем в моем тестовом коде UI Automator использовать что-то вроде m.get("more_options")
а не буквальная строка "More options"
как и сейчас.
Что бы я ни делал, я хочу, чтобы он был просто частью файла JAR, который создается и отправляется на устройство для запуска тестов. Я не хочу, например, отправить файлы ресурсов строки XML на устройство и попытаться прочитать их во время выполнения теста. Я хочу, чтобы данные были встроены в файл JAR.
Я посмотрел на файлы, созданные при создании приложения, и имена, такие как more_options
просто установлены в целые числа. Это должны быть указатели или указатели на хранилище ресурсов, но я не уверен, как я могу скопировать это хранилище в мой проект UI Automator и подключить его; в приложении Android вы используете Context
объект для доступа к ресурсам, и JAR-файл UI Automator не имеет Context
,
Это должно быть распространенной проблемой, и люди, должно быть, уже решили ее, но мои поиски в Google не нашли никаких дискуссий о том, как люди решают эту проблему.
Если я не получу совета, я напишу скрипт Python, который импортирует файл XML и напишет файл Java, в котором есть функция, которая создает нужную мне карту, а затем вызову ее из моих тестовых программ AutoItor UI Automator. (У меня есть сценарий Python, который запускает последовательность инструментов командной строки для запуска теста AutoItor UI, в любом случае... Я не против заставить это делать больше работы.) Но я считаю, что должно быть решение на чисто Java для этого, вероятно, требуется захват уже скомпилированных файлов из исходного каталога приложения.
3 ответа
Я застрял с подобной проблемой. В итоге я создал статическую хеш-карту в Java для всех строковых литералов. Поэтому у меня были файлы для разных языков с одинаковым ключом и их локализованными значениями.
Затем написал модуль для управления языком устройства во время выполнения и возврата соответствующего локализованного значения для ключа.
Вы можете получить контекст:
val context = InstrumentationRegistry.getTargetContext()
а затем в ваших тестах:
context.getString(R.string.more_options)
Я обычно нацеливаю элемент интерфейса через идентификатор ресурса. Это довольно статично. Я что-то пропустил?