Доступ к ресурсам для тестов 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)

Я обычно нацеливаю элемент интерфейса через идентификатор ресурса. Это довольно статично. Я что-то пропустил?

Другие вопросы по тегам