Автоматизировать тестирование игр может быть сложно, если игровые приложения созданы на разных платформах пользовательского интерфейса. Тесты Game Loop позволяют интегрировать собственные тесты с Test Lab и легко запускать их на выбранных вами устройствах. Тест Game Loop запускает тест через ваше игровое приложение, имитируя действия реального игрока. В этом руководстве показано, как запустить тест Game Loop, а затем просматривать и управлять результатами теста в консоли Firebase .
В зависимости от вашего игрового движка вы можете реализовать тесты с одним или несколькими циклами. Цикл – это полный или частичный запуск теста игрового приложения. Игровые циклы можно использовать для:
- Запустите уровень своей игры так, как в него играл бы конечный пользователь. Вы можете либо запрограммировать ввод пользователя, либо позволить пользователю бездействовать, либо заменить пользователя ИИ, если это имеет смысл в вашей игре (например, скажем, у вас есть игровое приложение для гоночных автомобилей и уже реализован ИИ. Вы можете легко поручить ИИ-драйверу отвечать за ввод пользователя).
- Запустите игру с настройками самого высокого качества и проверьте, поддерживают ли ее устройства.
- Запустите технический тест (скомпилируйте несколько шейдеров, запустите их, проверьте, что выходные данные соответствуют ожиданиям и т. д.).
Вы можете запустить тест Game Loop на одном тестовом устройстве, наборе тестовых устройств или в Test Lab . Однако мы не рекомендуем запускать тесты Game Loop на виртуальных устройствах, поскольку они имеют более низкую частоту кадров графики, чем физические устройства.
Прежде чем начать
Чтобы реализовать тест, сначала необходимо настроить приложение для тестов Game Loop.
В манифесте приложения добавьте новый фильтр намерений в свою активность :
<activity android:name=".MyActivity"> <intent-filter> <action android:name="com.google.intent.action.TEST_LOOP"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="application/javascript"/> </intent-filter> <intent-filter> ... (other intent filters here) </intent-filter> </activity>
Это позволяет Test Lab запускать вашу игру, запуская ее с определенным намерением.
В свой код (мы рекомендуем внутри объявления метода
onCreate
) добавьте следующее:val launchIntent = intent if (launchIntent.action == "com.google.intent.action.TEST_LOOP") { val scenario = launchIntent.getIntExtra("scenario", 0) // Code to handle your game loop here }
Intent launchIntent = getIntent(); if(launchIntent.getAction().equals("com.google.intent.action.TEST_LOOP")) { int scenario = launchIntent.getIntExtra("scenario", 0); // Code to handle your game loop here }
Это позволяет вашей активности проверять намерение, которое ее запускает. При желании вы также можете добавить этот код позже (например, после первоначальной загрузки игрового движка).
Рекомендуется: В конце теста добавьте:
yourActivity.finish()
yourActivity.finish();
Приложение закроется после завершения теста Game Loop. Тест использует структуру пользовательского интерфейса вашего приложения для запуска следующего цикла, и закрытие вашего приложения сообщает ему, что тест завершен.
Создайте и запустите тест Game Loop.
После того как вы настроите свое приложение для тестов Game Loop, вы можете сразу же создать тест и запустить его в своем игровом приложении. Вы можете запустить тест в Test Lab используя консоль Firebase или интерфейс командной строки (CLI) gcloud , либо на локальном устройстве с помощью Test Loop Manager .
Запуск на локальном устройстве
Test Loop Manager от Test Lab — это приложение с открытым исходным кодом, которое помогает интегрировать тесты Game Loop и запускать их на локальных устройствах. Это также позволяет вашей команде по обеспечению качества запускать одни и те же игровые циклы на своих устройствах.
Чтобы запустить тест на локальном устройстве с помощью диспетчера тестового цикла:
- Загрузите Test Loop Manager на телефон или планшет и установите его, выполнив:
adb install testloopmanager.apk
- На своем устройстве откройте приложение Test Loop Apps на телефоне или планшете. Приложение отображает список приложений на вашем устройстве, которые можно запускать с помощью игровых циклов. Если вы не видите здесь своего игрового приложения, убедитесь, что ваш фильтр намерений соответствует фильтру, описанному в первом шаге раздела «Перед началом работы» .
- Выберите игровое приложение, затем выберите количество циклов, которые вы хотите запустить. Примечание. На этом этапе вы можете выбрать запуск подмножества циклов вместо одного цикла. Дополнительную информацию об одновременном запуске нескольких циклов см. в разделе Дополнительные функции .
- Нажмите «Выполнить тест» . Тест начнет выполняться немедленно.
Запустить в Test Lab
Вы можете запустить тест Game Loop в Test Lab используя консоль Firebase или интерфейс командной строки gcloud. Прежде чем начать, откройте консоль Firebase и создайте проект, если вы еще этого не сделали.
Используйте консоль Firebase
- В консоли Firebase нажмите Test Lab на левой панели.
- Нажмите «Запустить первый тест» (или «Запустить тест», если в вашем проекте ранее выполнялся тест).
- Выберите Game Loop в качестве типа теста и нажмите «Продолжить» .
- Нажмите «Обзор» , а затем перейдите к файлу
.apk
вашего приложения. Примечание. На этом этапе вы можете выбрать запуск подмножества циклов вместо одного цикла. Дополнительную информацию об одновременном запуске нескольких циклов см. в разделе Дополнительные функции . - Нажмите Продолжить .
- Выберите физические устройства, которые будут использоваться для тестирования вашего приложения.
- Нажмите «Начать тесты» .
Дополнительную информацию о начале работы с консолью Firebase см. в разделе Начало тестирования с помощью консоли Firebase .
Используйте командную строку gcloud (CLI)
Если вы еще этого не сделали, скачайте и установите Google Cloud SDK.
Войдите в интерфейс командной строки gcloud, используя свою учетную запись Google:
gcloud auth login
Настройте свой проект Firebase в gcloud, где
PROJECT_ID
— это идентификатор вашего проекта Firebase:gcloud config set project PROJECT_ID
Запустите свой первый тест:
gcloud firebase test android run \ --type=game-loop --app=<var>path-to-apk</var> \ --device model=herolte,version=23
Дополнительную информацию о начале работы с интерфейсом командной строки gcloud см. в разделе Начало тестирования из командной строки gcloud.
Дополнительные функции
Test Lab предлагает несколько дополнительных функций, которые позволяют дополнительно настраивать тесты, включая возможность записи выходных данных, поддержку нескольких игровых циклов и метки для связанных циклов.
Записать выходные данные
Ваш тест Game Loop может записывать выходные данные в файл, указанный в методе launchIntent.getData()
. После запуска теста вы можете получить доступ к этим выходным данным в разделе Test Lab консоли Firebase (см. пример выходного файла теста Game Loop ).
Test Lab следует рекомендациям по совместному использованию файла между приложениями, описанным в разделе «Общий доступ к файлу» . В методе onCreate()
вашей активности, где находится ваше намерение, вы можете проверить файл вывода данных, выполнив следующий код:
val launchIntent = intent val logFile = launchIntent.data logFile?.let { Log.i(TAG, "Log file ${it.encodedPath}") // ... }
Intent launchIntent = getIntent(); Uri logFile = launchIntent.getData(); if (logFile != null) { Log.i(TAG, "Log file " + logFile.getEncodedPath()); // ... }
Если вы хотите выполнить запись в файл со стороны C++ вашего игрового приложения, вы можете передать дескриптор файла вместо пути к файлу:
val launchIntent = intent val logFile = launchIntent.data var fd = -1 logFile?.let { Log.i(TAG, "Log file ${it.encodedPath}") fd = try { contentResolver .openAssetFileDescriptor(logFile, "w")!! .parcelFileDescriptor .fd } catch (e: FileNotFoundException) { e.printStackTrace() -1 } catch (e: NullPointerException) { e.printStackTrace() -1 } } // C++ code invoked here. // native_function(fd);
Intent launchIntent = getIntent(); Uri logFile = launchIntent.getData(); int fd = -1; if (logFile != null) { Log.i(TAG, "Log file " + logFile.getEncodedPath()); try { fd = getContentResolver() .openAssetFileDescriptor(logFile, "w") .getParcelFileDescriptor() .getFd(); } catch (FileNotFoundException e) { e.printStackTrace(); fd = -1; } catch (NullPointerException e) { e.printStackTrace(); fd = -1; } } // C++ code invoked here. // native_function(fd);
#include <unistd.h> JNIEXPORT void JNICALL Java_my_package_name_MyActivity_native_function(JNIEnv *env, jclass type, jint log_file_descriptor) { // The file descriptor needs to be duplicated. int my_file_descriptor = dup(log_file_descriptor); }
Пример выходного файла
Вы можете использовать файлы выходных данных (отформатированные, как в примере ниже) для отображения результатов тестирования игрового цикла в разделе Test Lab консоли Firebase . Области, обозначенные как /.../
могут содержать любые необходимые вам настраиваемые поля, если они не конфликтуют с именами других полей, используемых в этом файле:
{ "name": "test name", "start_timestamp": 0, // Timestamp of the test start (in us). Can be absolute or relative "driver_info": "...", "frame_stats": [ { "timestamp": 1200000, // Timestamp at which this section was written It contains value regarding the period start_timestamp(0) -> this timestamp (1200000 us) "avg_frame_time": 15320, // Average time to render a frame in ns "nb_swap": 52, // Number of frame rendered "threads": [ { "name": "physics", "Avg_time": 8030 // Average time spent in this thread per frame in us }, { "name": "AI", "Avg_time": 2030 // Average time spent in this thread per frame in us } ], /.../ // Any custom field you want (vertices display on the screen, nb units …) }, { // Next frame data here, same format as above } ], "loading_stats": [ { "name": "assets_level_1", "total_time": 7850, // in us /.../ }, { "name": "victory_screen", "total_time": 554, // in us /.../ } ], /.../, // You can add custom fields here }
Несколько игровых циклов
Возможно, вам будет полезно запустить несколько игровых циклов в вашем приложении. Цикл — это полный прогон вашего игрового приложения от начала до конца. Например, если в вашей игре несколько уровней, вам может потребоваться один игровой цикл для запуска каждого уровня вместо одного цикла, который проходит через все уровни. Таким образом, если ваше приложение выйдет из строя на уровне 32, вы сможете напрямую запустить этот игровой цикл, чтобы воспроизвести сбой и протестировать исправления ошибок.
Чтобы ваше приложение могло запускать несколько циклов одновременно:
Если вы запускаете тест с помощью Test Loop Manager:
Добавьте следующую строку в манифест вашего приложения внутри элемента
<application>
:<meta-data android:name="com.google.test.loops" android:value="5" />
Это намерение запуска содержит целевой цикл в качестве целочисленного параметра. В поле
android:value
вы можете указать целое число от 1 до 1024 (максимальное количество циклов, разрешенное для одного теста). Обратите внимание, что циклы индексируются начиная с 1, а не с 0.В приложении Test Loop Manager появится экран выбора, позволяющий выбрать, какой цикл(ы) вы хотите запустить. Если вы выберете несколько циклов, каждый цикл запускается последовательно после завершения предыдущего цикла.
Если вы запускаете тест с помощью консоли Firebase , введите список или диапазон номеров циклов в поле «Сценарии» .
Если вы запускаете тест с помощью интерфейса командной строки gcloud, укажите список номеров циклов, используя флаг
--scenario-numbers
. Например,--scenario-numbers=1,3,5
запускает циклы 1, 3 и 5.Если вы пишете на C++ и хотите изменить поведение своего цикла, передайте в свой собственный код C++ следующее:
val launchIntent = intent val scenario = launchIntent.getIntExtra("scenario", 0)
Intent launchIntent = getIntent(); int scenario = launchIntent.getIntExtra("scenario", 0);
Теперь вы можете изменить поведение вашего цикла на основе полученного значения
int
.
Обозначьте игровые циклы
Когда вы помечаете свои игровые циклы одной или несколькими метками сценариев, вы и ваша команда контроля качества можете легко запустить набор связанных игровых циклов (например, «все игровые циклы совместимости») и протестировать их в одной матрице. Вы можете создавать свои собственные метки или использовать предопределенные метки, предлагаемые Test Lab :
-
com.google.test.loops.player_experience
: циклы, используемые для воспроизведения реального опыта пользователя во время игры. Цель тестирования с помощью этих циклов — выявить проблемы, с которыми реальный пользователь может столкнуться во время игры. -
com.google.test.loops.gpu_compatibility
: для циклов, используемых для проверки проблем, связанных с графическим процессором. Целью тестирования с помощью этих циклов является выполнение кода графического процессора, который может работать неправильно в рабочей среде, чтобы выявить проблемы с оборудованием и драйверами. -
com.google.test.loops.compatibility
: циклы, используемые для проверки широкого спектра проблем совместимости, включая проблемы ввода-вывода и проблемы OpenSSL. -
com.google.test.loops.performance
: циклы, используемые для проверки производительности устройства. Например, игра может запускаться с самыми сложными настройками графики, чтобы увидеть, как ведет себя новое устройство.
Чтобы ваше приложение могло выполнять циклы с одной и той же меткой:
Если вы запускаете тест с помощью Test Loop Manager:
В манифесте вашего приложения добавьте следующую строку метаданных и замените LABEL_NAME меткой по вашему выбору:
<meta-data android:name="com.google.test.loops.LABEL_NAME" android:value="1,3-5" />
В поле
android:value
вы можете указать диапазон или набор целых чисел от 1 до 1024 (максимальное количество циклов, разрешенное для одного теста), которые представляют циклы, которые вы хотите пометить. Обратите внимание, что циклы индексируются, начиная с 1, а не с 0. Например,android:value="1,3-5"
применяет LABEL_NAME к циклам 1, 3, 4 и 5.В приложении «Диспетчер тестовых циклов» введите одну или несколько меток в поле «Метки» .
Если вы запускаете тест с помощью консоли Firebase , введите один или несколько ярлыков в поле «Ярлыки» .
Если вы запускаете тест с помощью интерфейса командной строки gcloud, укажите одну или несколько меток сценария с помощью флага
--scenario-labels
(например,--scenario-labels=performance,gpu
).
Поддержка лицензирования приложений
Test Lab поддерживает приложения, использующие службу лицензирования приложений , предлагаемую Google Play. Чтобы успешно проверить лицензию при тестировании вашего приложения с помощью Test Lab , вам необходимо опубликовать свое приложение в производственном канале в магазине Play. Чтобы протестировать свое приложение в альфа- или бета-канале с помощью Test Lab , снимите проверку лицензии перед загрузкой приложения в Test Lab .
Известные проблемы
Тесты игрового цикла в Test Lab имеют следующие известные проблемы:
- Некоторые сбои не поддерживают обратные трассировки. Например, некоторые сборки выпуска могут подавлять вывод процесса
debuggerd
с помощьюprctl(PR_SET_DUMPABLE, 0)
. Чтобы узнать больше, см.debuggerd
. - Уровень API 19 в настоящее время не поддерживается из-за ошибок прав доступа к файлам.
Автоматизировать тестирование игр может быть сложно, если игровые приложения созданы на разных платформах пользовательского интерфейса. Тесты Game Loop позволяют интегрировать собственные тесты с Test Lab и легко запускать их на выбранных вами устройствах. Тест Game Loop запускает тест через ваше игровое приложение, имитируя действия реального игрока. В этом руководстве показано, как запустить тест Game Loop, а затем просматривать и управлять результатами теста в консоли Firebase .
В зависимости от вашего игрового движка вы можете реализовать тесты с одним или несколькими циклами. Цикл – это полный или частичный запуск теста игрового приложения. Игровые циклы можно использовать для:
- Запустите уровень своей игры так, как в него играл бы конечный пользователь. Вы можете либо запрограммировать ввод пользователя, либо позволить пользователю бездействовать, либо заменить пользователя ИИ, если это имеет смысл в вашей игре (например, скажем, у вас есть игровое приложение для гоночных автомобилей и уже реализован ИИ. Вы можете легко поручить ИИ-драйверу отвечать за ввод пользователя).
- Запустите игру с настройками самого высокого качества и проверьте, поддерживают ли ее устройства.
- Запустите технический тест (скомпилируйте несколько шейдеров, запустите их, проверьте, что выходные данные соответствуют ожиданиям и т. д.).
Вы можете запустить тест Game Loop на одном тестовом устройстве, наборе тестовых устройств или в Test Lab . Однако мы не рекомендуем запускать тесты Game Loop на виртуальных устройствах, поскольку они имеют более низкую частоту кадров графики, чем физические устройства.
Прежде чем начать
Чтобы реализовать тест, сначала необходимо настроить приложение для тестов Game Loop.
В манифесте приложения добавьте новый фильтр намерений в свою активность :
<activity android:name=".MyActivity"> <intent-filter> <action android:name="com.google.intent.action.TEST_LOOP"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="application/javascript"/> </intent-filter> <intent-filter> ... (other intent filters here) </intent-filter> </activity>
Это позволяет Test Lab запускать вашу игру, запуская ее с определенным намерением.
В свой код (мы рекомендуем внутри объявления метода
onCreate
) добавьте следующее:val launchIntent = intent if (launchIntent.action == "com.google.intent.action.TEST_LOOP") { val scenario = launchIntent.getIntExtra("scenario", 0) // Code to handle your game loop here }
Intent launchIntent = getIntent(); if(launchIntent.getAction().equals("com.google.intent.action.TEST_LOOP")) { int scenario = launchIntent.getIntExtra("scenario", 0); // Code to handle your game loop here }
Это позволяет вашей активности проверять намерение, которое ее запускает. При желании вы также можете добавить этот код позже (например, после первоначальной загрузки игрового движка).
Рекомендуется: В конце теста добавьте:
yourActivity.finish()
yourActivity.finish();
Приложение закроется после завершения теста Game Loop. Тест использует структуру пользовательского интерфейса вашего приложения для запуска следующего цикла, и закрытие вашего приложения сообщает ему, что тест завершен.
Создайте и запустите тест Game Loop.
После того как вы настроите свое приложение для тестов Game Loop, вы можете сразу же создать тест и запустить его в своем игровом приложении. Вы можете запустить тест в Test Lab используя консоль Firebase или интерфейс командной строки (CLI) gcloud , либо на локальном устройстве с помощью Test Loop Manager .
Запуск на локальном устройстве
Test Loop Manager от Test Lab — это приложение с открытым исходным кодом, которое помогает интегрировать тесты Game Loop и запускать их на локальных устройствах. Это также позволяет вашей команде по обеспечению качества запускать одни и те же игровые циклы на своих устройствах.
Чтобы запустить тест на локальном устройстве с помощью диспетчера тестового цикла:
- Загрузите Test Loop Manager на телефон или планшет и установите его, выполнив:
adb install testloopmanager.apk
- На своем устройстве откройте приложение Test Loop Apps на телефоне или планшете. Приложение отображает список приложений на вашем устройстве, которые можно запускать с помощью игровых циклов. Если вы не видите здесь своего игрового приложения, убедитесь, что ваш фильтр намерений соответствует фильтру, описанному в первом шаге раздела «Перед началом работы» .
- Выберите игровое приложение, затем выберите количество циклов, которые вы хотите запустить. Примечание. На этом этапе вы можете выбрать запуск подмножества циклов вместо одного цикла. Дополнительную информацию об одновременном запуске нескольких циклов см. в разделе Дополнительные функции .
- Нажмите «Выполнить тест» . Тест начнет выполняться немедленно.
Запустить в Test Lab
Вы можете запустить тест Game Loop в Test Lab используя консоль Firebase или интерфейс командной строки gcloud. Прежде чем начать, откройте консоль Firebase и создайте проект, если вы еще этого не сделали.
Используйте консоль Firebase
- В консоли Firebase нажмите Test Lab на левой панели.
- Нажмите «Запустить первый тест» (или «Запустить тест», если в вашем проекте ранее выполнялся тест).
- Выберите Game Loop в качестве типа теста и нажмите «Продолжить» .
- Нажмите «Обзор» , а затем перейдите к файлу
.apk
вашего приложения. Примечание. На этом этапе вы можете выбрать запуск подмножества циклов вместо одного цикла. Дополнительную информацию об одновременном запуске нескольких циклов см. в разделе Дополнительные функции . - Нажмите Продолжить .
- Выберите физические устройства, которые будут использоваться для тестирования вашего приложения.
- Нажмите «Начать тесты» .
Дополнительную информацию о начале работы с консолью Firebase см. в разделе Начало тестирования с помощью консоли Firebase .
Используйте командную строку gcloud (CLI)
Если вы еще этого не сделали, загрузите и установите Google Cloud SDK.
Войдите в интерфейс командной строки gcloud, используя свою учетную запись Google:
gcloud auth login
Настройте свой проект Firebase в gcloud, где
PROJECT_ID
— это идентификатор вашего проекта Firebase:gcloud config set project PROJECT_ID
Запустите свой первый тест:
gcloud firebase test android run \ --type=game-loop --app=<var>path-to-apk</var> \ --device model=herolte,version=23
Дополнительную информацию о начале работы с интерфейсом командной строки gcloud см. в разделе Начало тестирования из командной строки gcloud.
Дополнительные функции
Test Lab предлагает несколько дополнительных функций, которые позволяют дополнительно настраивать тесты, включая возможность записи выходных данных, поддержку нескольких игровых циклов и метки для связанных циклов.
Записать выходные данные
Ваш тест Game Loop может записывать выходные данные в файл, указанный в методе launchIntent.getData()
. После запуска теста вы можете получить доступ к этим выходным данным в разделе Test Lab консоли Firebase (см. пример выходного файла теста Game Loop ).
Test Lab следует рекомендациям по совместному использованию файла между приложениями, описанным в разделе «Общий доступ к файлу» . В методе onCreate()
вашей активности, где находится ваше намерение, вы можете проверить файл вывода данных, выполнив следующий код:
val launchIntent = intent val logFile = launchIntent.data logFile?.let { Log.i(TAG, "Log file ${it.encodedPath}") // ... }
Intent launchIntent = getIntent(); Uri logFile = launchIntent.getData(); if (logFile != null) { Log.i(TAG, "Log file " + logFile.getEncodedPath()); // ... }
Если вы хотите выполнить запись в файл со стороны C++ вашего игрового приложения, вы можете передать дескриптор файла вместо пути к файлу:
val launchIntent = intent val logFile = launchIntent.data var fd = -1 logFile?.let { Log.i(TAG, "Log file ${it.encodedPath}") fd = try { contentResolver .openAssetFileDescriptor(logFile, "w")!! .parcelFileDescriptor .fd } catch (e: FileNotFoundException) { e.printStackTrace() -1 } catch (e: NullPointerException) { e.printStackTrace() -1 } } // C++ code invoked here. // native_function(fd);
Intent launchIntent = getIntent(); Uri logFile = launchIntent.getData(); int fd = -1; if (logFile != null) { Log.i(TAG, "Log file " + logFile.getEncodedPath()); try { fd = getContentResolver() .openAssetFileDescriptor(logFile, "w") .getParcelFileDescriptor() .getFd(); } catch (FileNotFoundException e) { e.printStackTrace(); fd = -1; } catch (NullPointerException e) { e.printStackTrace(); fd = -1; } } // C++ code invoked here. // native_function(fd);
#include <unistd.h> JNIEXPORT void JNICALL Java_my_package_name_MyActivity_native_function(JNIEnv *env, jclass type, jint log_file_descriptor) { // The file descriptor needs to be duplicated. int my_file_descriptor = dup(log_file_descriptor); }
Пример выходного файла
Вы можете использовать файлы выходных данных (отформатированные, как в примере ниже) для отображения результатов тестирования игрового цикла в разделе Test Lab консоли Firebase . Области, обозначенные как /.../
могут содержать любые необходимые вам настраиваемые поля, если они не конфликтуют с именами других полей, используемых в этом файле:
{ "name": "test name", "start_timestamp": 0, // Timestamp of the test start (in us). Can be absolute or relative "driver_info": "...", "frame_stats": [ { "timestamp": 1200000, // Timestamp at which this section was written It contains value regarding the period start_timestamp(0) -> this timestamp (1200000 us) "avg_frame_time": 15320, // Average time to render a frame in ns "nb_swap": 52, // Number of frame rendered "threads": [ { "name": "physics", "Avg_time": 8030 // Average time spent in this thread per frame in us }, { "name": "AI", "Avg_time": 2030 // Average time spent in this thread per frame in us } ], /.../ // Any custom field you want (vertices display on the screen, nb units …) }, { // Next frame data here, same format as above } ], "loading_stats": [ { "name": "assets_level_1", "total_time": 7850, // in us /.../ }, { "name": "victory_screen", "total_time": 554, // in us /.../ } ], /.../, // You can add custom fields here }
Несколько игровых циклов
Возможно, вам будет полезно запустить несколько игровых циклов в вашем приложении. Цикл — это полный прогон вашего игрового приложения от начала до конца. Например, если в вашей игре несколько уровней, вам может потребоваться один игровой цикл для запуска каждого уровня вместо одного цикла, который проходит через все уровни. Таким образом, если ваше приложение выйдет из строя на уровне 32, вы сможете напрямую запустить этот игровой цикл, чтобы воспроизвести сбой и протестировать исправления ошибок.
Чтобы ваше приложение могло запускать несколько циклов одновременно:
Если вы запускаете тест с помощью Test Loop Manager:
Добавьте следующую строку в манифест вашего приложения внутри элемента
<application>
:<meta-data android:name="com.google.test.loops" android:value="5" />
Это намерение запуска содержит целевой цикл в качестве целочисленного параметра. В поле
android:value
вы можете указать целое число от 1 до 1024 (максимальное количество циклов, разрешенное для одного теста). Обратите внимание, что циклы индексируются начиная с 1, а не с 0.В приложении Test Loop Manager появится экран выбора, позволяющий выбрать, какой цикл(ы) вы хотите запустить. Если вы выберете несколько циклов, каждый цикл запускается последовательно после завершения предыдущего цикла.
Если вы запускаете тест с помощью консоли Firebase , введите список или диапазон номеров циклов в поле «Сценарии» .
Если вы запускаете тест с помощью интерфейса командной строки gcloud, укажите список номеров циклов, используя флаг
--scenario-numbers
. Например,--scenario-numbers=1,3,5
запускает циклы 1, 3 и 5.Если вы пишете на C++ и хотите изменить поведение своего цикла, передайте в свой собственный код C++ следующее:
val launchIntent = intent val scenario = launchIntent.getIntExtra("scenario", 0)
Intent launchIntent = getIntent(); int scenario = launchIntent.getIntExtra("scenario", 0);
Теперь вы можете изменить поведение вашего цикла на основе полученного значения
int
.
Обозначьте игровые циклы
Когда вы помечаете свои игровые циклы одной или несколькими метками сценариев, вы и ваша команда контроля качества можете легко запустить набор связанных игровых циклов (например, «все игровые циклы совместимости») и протестировать их в одной матрице. Вы можете создавать свои собственные метки или использовать предопределенные метки, предлагаемые Test Lab :
-
com.google.test.loops.player_experience
: циклы, используемые для воспроизведения реального опыта пользователя во время игры. Цель тестирования с помощью этих циклов — выявить проблемы, с которыми реальный пользователь может столкнуться во время игры. -
com.google.test.loops.gpu_compatibility
: для циклов, используемых для проверки проблем, связанных с графическим процессором. Целью тестирования с помощью этих циклов является выполнение кода графического процессора, который может работать неправильно в рабочей среде, чтобы выявить проблемы с оборудованием и драйверами. -
com.google.test.loops.compatibility
: циклы, используемые для проверки широкого спектра проблем совместимости, включая проблемы ввода-вывода и проблемы OpenSSL. -
com.google.test.loops.performance
: циклы, используемые для проверки производительности устройства. Например, игра может запускаться с самыми сложными настройками графики, чтобы увидеть, как ведет себя новое устройство.
Чтобы ваше приложение могло выполнять циклы с одной и той же меткой:
Если вы запускаете тест с помощью Test Loop Manager:
В манифесте вашего приложения добавьте следующую строку метаданных и замените LABEL_NAME меткой по вашему выбору:
<meta-data android:name="com.google.test.loops.LABEL_NAME" android:value="1,3-5" />
В поле
android:value
вы можете указать диапазон или набор целых чисел от 1 до 1024 (максимальное количество циклов, разрешенное для одного теста), которые представляют циклы, которые вы хотите пометить. Обратите внимание, что циклы индексируются, начиная с 1, а не с 0. Например,android:value="1,3-5"
применяет LABEL_NAME к циклам 1, 3, 4 и 5.В приложении «Диспетчер тестовых циклов» введите одну или несколько меток в поле «Метки» .
Если вы запускаете тест с помощью консоли Firebase , введите один или несколько ярлыков в поле «Ярлыки» .
Если вы запускаете тест с помощью интерфейса командной строки gcloud, укажите одну или несколько меток сценария с помощью флага
--scenario-labels
(например,--scenario-labels=performance,gpu
).
Поддержка лицензирования приложений
Test Lab поддерживает приложения, использующие службу лицензирования приложений , предлагаемую Google Play. Чтобы успешно проверить лицензию при тестировании вашего приложения с помощью Test Lab , вам необходимо опубликовать свое приложение в производственном канале в магазине Play. Чтобы протестировать свое приложение в альфа- или бета-канале с помощью Test Lab , снимите проверку лицензии перед загрузкой приложения в Test Lab .
Известные проблемы
Тесты игрового цикла в Test Lab имеют следующие известные проблемы:
- Некоторые сбои не поддерживают обратные трассировки. Например, некоторые сборки выпуска могут подавлять вывод процесса
debuggerd
с помощьюprctl(PR_SET_DUMPABLE, 0)
. Чтобы узнать больше, см.debuggerd
. - Уровень API 19 в настоящее время не поддерживается из-за ошибок прав доступа к файлам.
Автоматизировать тестирование игр может быть сложно, если игровые приложения созданы на разных платформах пользовательского интерфейса. Тесты Game Loop позволяют интегрировать собственные тесты с Test Lab и легко запускать их на выбранных вами устройствах. Тест Game Loop запускает тест через ваше игровое приложение, имитируя действия реального игрока. В этом руководстве показано, как запустить тест Game Loop, а затем просмотреть результаты теста и управлять ими в консоли Firebase .
В зависимости от вашего игрового движка вы можете реализовать тесты с одним или несколькими циклами. Цикл – это полный или частичный запуск теста игрового приложения. Игровые циклы можно использовать для:
- Запустите уровень своей игры так, как в него играл бы конечный пользователь. Вы можете либо запрограммировать ввод пользователя, либо позволить пользователю бездействовать, либо заменить пользователя ИИ, если это имеет смысл в вашей игре (например, скажем, у вас есть игровое приложение для гоночных автомобилей и уже реализован ИИ. Вы можете легко поручить ИИ-драйверу отвечать за ввод пользователя).
- Запустите игру с настройками самого высокого качества и проверьте, поддерживают ли ее устройства.
- Запустите технический тест (скомпилируйте несколько шейдеров, запустите их, проверьте, что выходные данные соответствуют ожиданиям и т. д.).
Вы можете запустить тест Game Loop на одном тестовом устройстве, наборе тестовых устройств или в Test Lab . Однако мы не рекомендуем запускать тесты Game Loop на виртуальных устройствах, поскольку они имеют более низкую частоту кадров графики, чем физические устройства.
Прежде чем начать
Чтобы реализовать тест, сначала необходимо настроить приложение для тестов Game Loop.
В манифесте приложения добавьте новый фильтр намерений в свою активность :
<activity android:name=".MyActivity"> <intent-filter> <action android:name="com.google.intent.action.TEST_LOOP"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="application/javascript"/> </intent-filter> <intent-filter> ... (other intent filters here) </intent-filter> </activity>
Это позволяет Test Lab запускать вашу игру, запуская ее с определенным намерением.
В свой код (мы рекомендуем внутри объявления метода
onCreate
) добавьте следующее:val launchIntent = intent if (launchIntent.action == "com.google.intent.action.TEST_LOOP") { val scenario = launchIntent.getIntExtra("scenario", 0) // Code to handle your game loop here }
Intent launchIntent = getIntent(); if(launchIntent.getAction().equals("com.google.intent.action.TEST_LOOP")) { int scenario = launchIntent.getIntExtra("scenario", 0); // Code to handle your game loop here }
Это позволяет вашей активности проверять намерение, которое ее запускает. При желании вы также можете добавить этот код позже (например, после первоначальной загрузки игрового движка).
Рекомендуется: В конце теста добавьте:
yourActivity.finish()
yourActivity.finish();
Приложение закроется после завершения теста Game Loop. Тест использует структуру пользовательского интерфейса вашего приложения для запуска следующего цикла, и закрытие вашего приложения сообщает ему, что тест завершен.
Создайте и запустите тест Game Loop.
После того как вы настроите свое приложение для тестов Game Loop, вы можете сразу же создать тест и запустить его в своем игровом приложении. Вы можете запустить тест в Test Lab используя консоль Firebase или интерфейс командной строки (CLI) gcloud , либо на локальном устройстве с помощью Test Loop Manager .
Запуск на локальном устройстве
Test Loop Manager от Test Lab — это приложение с открытым исходным кодом, которое помогает интегрировать тесты Game Loop и запускать их на локальных устройствах. Это также позволяет вашей команде по обеспечению качества запускать одни и те же игровые циклы на своих устройствах.
Чтобы запустить тест на локальном устройстве с помощью диспетчера тестового цикла:
- Загрузите Test Loop Manager на телефон или планшет и установите его, выполнив:
adb install testloopmanager.apk
- На своем устройстве откройте приложение Test Loop Apps на телефоне или планшете. Приложение отображает список приложений на вашем устройстве, которые можно запускать с помощью игровых циклов. Если вы не видите здесь своего игрового приложения, убедитесь, что ваш фильтр намерений соответствует фильтру, описанному в первом шаге раздела «Перед началом работы» .
- Выберите игровое приложение, затем выберите количество циклов, которые вы хотите запустить. Примечание. На этом этапе вы можете выбрать запуск подмножества циклов вместо одного цикла. Дополнительную информацию об одновременном запуске нескольких циклов см. в разделе Дополнительные функции .
- Нажмите «Выполнить тест» . Тест начнет выполняться немедленно.
Запустить в Test Lab
Вы можете запустить тест Game Loop в Test Lab используя консоль Firebase или интерфейс командной строки gcloud. Прежде чем начать, откройте консоль Firebase и создайте проект, если вы еще этого не сделали.
Используйте консоль Firebase
- В консоли Firebase нажмите Test Lab на левой панели.
- Нажмите «Запустить первый тест» (или «Запустить тест», если в вашем проекте ранее выполнялся тест).
- Выберите Game Loop в качестве типа теста и нажмите «Продолжить» .
- Нажмите «Обзор» , а затем перейдите к файлу
.apk
вашего приложения. Примечание. На этом этапе вы можете выбрать запуск подмножества циклов вместо одного цикла. Дополнительную информацию об одновременном запуске нескольких циклов см. в разделе Дополнительные функции . - Нажмите Продолжить .
- Выберите физические устройства, которые будут использоваться для тестирования вашего приложения.
- Нажмите «Начать тесты» .
Дополнительную информацию о начале работы с консолью Firebase см. в разделе Начало тестирования с помощью консоли Firebase .
Используйте командную строку gcloud (CLI)
Если вы еще этого не сделали, загрузите и установите Google Cloud SDK.
Войдите в интерфейс командной строки gcloud, используя свою учетную запись Google:
gcloud auth login
Настройте свой проект Firebase в gcloud, где
PROJECT_ID
— это идентификатор вашего проекта Firebase:gcloud config set project PROJECT_ID
Запустите свой первый тест:
gcloud firebase test android run \ --type=game-loop --app=<var>path-to-apk</var> \ --device model=herolte,version=23
Дополнительную информацию о начале работы с интерфейсом командной строки gcloud см. в разделе Начало тестирования из командной строки gcloud.
Дополнительные функции
Test Lab предлагает несколько дополнительных функций, которые позволяют дополнительно настраивать тесты, включая возможность записи выходных данных, поддержку нескольких игровых циклов и метки для связанных циклов.
Записать выходные данные
Ваш тест Game Loop может записывать выходные данные в файл, указанный в методе launchIntent.getData()
. После запуска теста вы можете получить доступ к этим выходным данным в разделе Test Lab консоли Firebase (см. пример выходного файла теста Game Loop ).
Test Lab следует рекомендациям по совместному использованию файла между приложениями, описанным в разделе «Общий доступ к файлу» . В методе onCreate()
вашей активности, где находится ваше намерение, вы можете проверить файл вывода данных, выполнив следующий код:
val launchIntent = intent val logFile = launchIntent.data logFile?.let { Log.i(TAG, "Log file ${it.encodedPath}") // ... }
Intent launchIntent = getIntent(); Uri logFile = launchIntent.getData(); if (logFile != null) { Log.i(TAG, "Log file " + logFile.getEncodedPath()); // ... }
Если вы хотите выполнить запись в файл со стороны C++ вашего игрового приложения, вы можете передать дескриптор файла вместо пути к файлу:
val launchIntent = intent val logFile = launchIntent.data var fd = -1 logFile?.let { Log.i(TAG, "Log file ${it.encodedPath}") fd = try { contentResolver .openAssetFileDescriptor(logFile, "w")!! .parcelFileDescriptor .fd } catch (e: FileNotFoundException) { e.printStackTrace() -1 } catch (e: NullPointerException) { e.printStackTrace() -1 } } // C++ code invoked here. // native_function(fd);
Intent launchIntent = getIntent(); Uri logFile = launchIntent.getData(); int fd = -1; if (logFile != null) { Log.i(TAG, "Log file " + logFile.getEncodedPath()); try { fd = getContentResolver() .openAssetFileDescriptor(logFile, "w") .getParcelFileDescriptor() .getFd(); } catch (FileNotFoundException e) { e.printStackTrace(); fd = -1; } catch (NullPointerException e) { e.printStackTrace(); fd = -1; } } // C++ code invoked here. // native_function(fd);
#include <unistd.h> JNIEXPORT void JNICALL Java_my_package_name_MyActivity_native_function(JNIEnv *env, jclass type, jint log_file_descriptor) { // The file descriptor needs to be duplicated. int my_file_descriptor = dup(log_file_descriptor); }
Пример выходного файла
Вы можете использовать файлы выходных данных (отформатированные, как в примере ниже) для отображения результатов тестирования игрового цикла в разделе Test Lab консоли Firebase . Области, обозначенные как /.../
могут содержать любые необходимые вам настраиваемые поля, если они не конфликтуют с именами других полей, используемых в этом файле:
{ "name": "test name", "start_timestamp": 0, // Timestamp of the test start (in us). Can be absolute or relative "driver_info": "...", "frame_stats": [ { "timestamp": 1200000, // Timestamp at which this section was written It contains value regarding the period start_timestamp(0) -> this timestamp (1200000 us) "avg_frame_time": 15320, // Average time to render a frame in ns "nb_swap": 52, // Number of frame rendered "threads": [ { "name": "physics", "Avg_time": 8030 // Average time spent in this thread per frame in us }, { "name": "AI", "Avg_time": 2030 // Average time spent in this thread per frame in us } ], /.../ // Any custom field you want (vertices display on the screen, nb units …) }, { // Next frame data here, same format as above } ], "loading_stats": [ { "name": "assets_level_1", "total_time": 7850, // in us /.../ }, { "name": "victory_screen", "total_time": 554, // in us /.../ } ], /.../, // You can add custom fields here }
Несколько игровых циклов
Возможно, вам будет полезно запустить несколько игровых циклов в вашем приложении. Цикл — это полный прогон вашего игрового приложения от начала до конца. Например, если в вашей игре несколько уровней, вам может потребоваться один игровой цикл для запуска каждого уровня вместо одного цикла, который проходит через все уровни. Таким образом, если ваше приложение выйдет из строя на уровне 32, вы сможете напрямую запустить этот игровой цикл, чтобы воспроизвести сбой и протестировать исправления ошибок.
Чтобы ваше приложение могло запускать несколько циклов одновременно:
Если вы запускаете тест с помощью Test Loop Manager:
Добавьте следующую строку в манифест вашего приложения внутри элемента
<application>
:<meta-data android:name="com.google.test.loops" android:value="5" />
Это намерение запуска содержит целевой цикл в качестве целочисленного параметра. В поле
android:value
вы можете указать целое число от 1 до 1024 (максимальное количество циклов, разрешенное для одного теста). Обратите внимание, что циклы индексируются начиная с 1, а не с 0.В приложении Test Loop Manager появится экран выбора, позволяющий выбрать, какой цикл(ы) вы хотите запустить. Если вы выберете несколько циклов, каждый цикл запускается последовательно после завершения предыдущего цикла.
Если вы запускаете тест с помощью консоли Firebase , введите список или диапазон номеров циклов в поле «Сценарии» .
Если вы запускаете тест с помощью интерфейса командной строки gcloud, укажите список номеров циклов, используя флаг
--scenario-numbers
. Например,--scenario-numbers=1,3,5
запускает циклы 1, 3 и 5.Если вы пишете на C++ и хотите изменить поведение своего цикла, передайте в свой собственный код C++ следующее:
val launchIntent = intent val scenario = launchIntent.getIntExtra("scenario", 0)
Intent launchIntent = getIntent(); int scenario = launchIntent.getIntExtra("scenario", 0);
Теперь вы можете изменить поведение вашего цикла на основе полученного значения
int
.
Обозначьте игровые циклы
Когда вы помечаете свои игровые циклы одной или несколькими метками сценариев, вы и ваша команда контроля качества можете легко запустить набор связанных игровых циклов (например, «все игровые циклы совместимости») и протестировать их в одной матрице. Вы можете создавать свои собственные метки или использовать предопределенные метки, предлагаемые Test Lab :
-
com.google.test.loops.player_experience
: циклы, используемые для воспроизведения реального опыта пользователя во время игры. Цель тестирования с помощью этих циклов — выявить проблемы, с которыми реальный пользователь может столкнуться во время игры. -
com.google.test.loops.gpu_compatibility
: для петли, используемых для тестирования вопросов, связанных с графическим процессором. Цель тестирования с этими циклами состоит в том, чтобы выполнить код графического процессора, который может не работать должным образом в производстве, чтобы разоблачить проблемы с оборудованием и драйверами. -
com.google.test.loops.compatibility
. -
com.google.test.loops.performance
: для петли, используемых для проверки производительности устройства. Например, игра может работать в самых сложных настройках графики, чтобы увидеть, как ведет себя новое устройство.
Чтобы ваше приложение запустило петли с той же меткой:
Если вы проводите тест с менеджером Test Loop:
В манифесте вашего приложения добавьте следующую метада-линию и замените LABEL_NAME на метку по вашему выбору:
<meta-data android:name="com.google.test.loops.LABEL_NAME" android:value="1,3-5" />
В поле
android:value
вы можете указать диапазон или набор целых чисел от 1 до 1024 (максимальное количество петель, разрешенных для одного теста), которые представляют петли, которые вы хотите пометить. Обратите внимание LABEL_NAME что петли индексируютсяandroid:value="1,3-5"
начиная с 1, а не 0.В приложении Test Loop Manager введите одну или несколько ярлыков в поле Labels .
Если вы проводите тест на консоли Firebase , введите одну или несколько метков, в поле метки .
Если вы проводите тест с GCLOUD CLI, укажите одну или несколько меток сценариев, используя флаг-
--scenario-labels
(например,--scenario-labels=performance,gpu
).
Поддержка лицензирования приложений
Test Lab поддерживает приложения, которые используют сервис лицензирования приложений , предлагаемый Google Play. Чтобы успешно проверить лицензирование при тестировании вашего приложения с помощью Test Lab , вы должны опубликовать свое приложение в производственный канал в Play Store. Чтобы проверить ваше приложение в альфа -или бета -канале, используя Test Lab , удалите проверку лицензирования перед загрузкой вашего приложения в Test Lab .
Известные проблемы
Игровые тесты в Test Lab имеют следующие известные проблемы:
- Некоторые сбои не поддерживают Backtraces. Например, некоторые сборки выпуска могут подавить выходной сигнал процесса
debuggerd
с использованиемprctl(PR_SET_DUMPABLE, 0)
. Чтобы узнать больше, см.debuggerd
. - Уровень API 19 в настоящее время не поддерживается из -за ошибок разрешения на файл.
Это может быть трудно автоматизировать игровые тестирование, когда игровые приложения построены на разных рамках пользовательского интерфейса. Тесты петли игры позволяют интегрировать свои собственные тесты с помощью Test Lab и легко запускать их на устройствах, которые вы выберете. Тест на игровой цикл проходит ваш тест через ваше игровое приложение, имитируя действия реального игрока. Это руководство показывает вам, как запустить тест на игровой цикл, а затем просмотреть и управлять результатами теста в консоли Firebase .
В зависимости от вашего игрового двигателя вы можете реализовать тесты с помощью одиночных или нескольких петлей. Цикл-это полный или частичный проход вашего теста в вашем игровом приложении. Петли игры можно использовать для:
- Запустите уровень вашей игры так же, как и конечный пользователь. Вы можете либо скрепить ввод пользователя, пусть пользователь будет простоя, либо заменить пользователя ИИ, если он имеет смысл в вашей игре (например, скажем, у вас есть приложение для гоночных автомобильных игр и уже реализовано ИИ. Вы можете легко поставить драйвер AI, отвечающий за ввод пользователя).
- Запустите свою игру в настройке высочайшего качества, чтобы увидеть, поддерживают ли ее устройства.
- Запустите технический тест (составьте несколько шейдеров, выполните их, проверьте, что вывод, как и ожидалось, и т. Д.).
Вы можете запустить тест петли игры на одном тестовом устройстве, набор тестовых устройств или в Test Lab . Тем не менее, мы не рекомендуем запускать тесты петли игры на виртуальных устройствах, потому что они имеют более низкую частоту графических кадров, чем физические устройства.
Прежде чем начать
Чтобы реализовать тест, вы должны сначала настроить приложение для тестов петли игры.
В манифесте вашего приложения добавьте в свою деятельность новый фильтр намерений:
<activity android:name=".MyActivity"> <intent-filter> <action android:name="com.google.intent.action.TEST_LOOP"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="application/javascript"/> </intent-filter> <intent-filter> ... (other intent filters here) </intent-filter> </activity>
Это позволяет Test Lab запустить вашу игру, запустив ее с определенным намерением.
В вашем коде (мы рекомендуем внутри объявления метода
onCreate
) добавьте следующее:val launchIntent = intent if (launchIntent.action == "com.google.intent.action.TEST_LOOP") { val scenario = launchIntent.getIntExtra("scenario", 0) // Code to handle your game loop here }
Intent launchIntent = getIntent(); if(launchIntent.getAction().equals("com.google.intent.action.TEST_LOOP")) { int scenario = launchIntent.getIntExtra("scenario", 0); // Code to handle your game loop here }
Это позволяет вашей деятельности проверять намерение, которое его запускает. Вы также можете добавить этот код позже, если вы предпочитаете (например, после первоначальной загрузки игрового двигателя).
Рекомендуется: в конце теста добавьте:
yourActivity.finish()
yourActivity.finish();
Это закрывает ваше приложение, когда тест петли игры завершен. Тест опирается на структуру пользовательского интерфейса вашего приложения, чтобы запустить следующий цикл, а закрытие вашего приложения говорит, что тест завершен.
Создать и запустить тест петли игры
После настройки своего приложения для тестов петли игры вы можете немедленно создать тест и запустить его в своем игровом приложении. Вы можете запустить тест в Test Lab используя либо консоль Firebase , либо интерфейс командной строки GCLOUD (CLI) , либо на локальном устройстве, используя диспетчер тестов .
Запустить на локальном устройстве
Test Lab Lab Loop Manager - это приложение с открытым исходным кодом, которое помогает интегрировать тесты петли Game и запустить их на ваших локальных устройствах. Это также позволяет вашей команде по обеспечению качества запускать те же игровые петли на своих устройствах.
Чтобы запустить тест на локальном устройстве, используя диспетчер тестов:
- Загрузите диспетчер тестов на телефон или планшет и установите, запустив:
adb install testloopmanager.apk
- На вашем устройстве откройте приложение для тестового цикла на вашем телефоне или планшете. Приложение отображает список приложений на вашем устройстве, которые можно запускать с помощью игровых петлей. Если вы не видите здесь игровое приложение, убедитесь, что ваш фильтр намерения соответствует тому, что описано на первом этапе раздела, прежде чем начать .
- Выберите свое игровое приложение, затем выберите количество циклов, которые вы хотите запустить. Примечание. На этом этапе вы можете запустить подмножество петель вместо одного цикла. Для получения дополнительной информации о запуске нескольких петель одновременно см. Дополнительные функции .
- Нажмите «Запустить тест» . Ваш тест начинает сразу работать.
Запустить в Test Lab
Вы можете запустить тест петли игры в Test Lab используя либо консоль Firebase , либо Gcloud CLI. Прежде чем начать, если вы еще этого не сделали, откройте консоль Firebase и создайте проект.
Используйте консоли Firebase
- В консоли Firebase нажмите Test Lab с левой панели.
- Нажмите «Запустить свой первый тест» (или запустите тест, если ваш проект ранее запустил тест).
- Выберите Game Loop как тип теста, а затем нажмите « Продолжить» .
- Нажмите «Обзор» , а затем просмотрите файл
.apk
вашего приложения. Примечание. На этом этапе вы можете запустить подмножество петель вместо одного цикла. Для получения дополнительной информации о запуске нескольких петель одновременно см. Дополнительные функции . - Нажмите «Продолжить» .
- Выберите физические устройства для использования для тестирования вашего приложения.
- Нажмите начальные тесты .
Для получения дополнительной информации о начале работы с консоли Firebase см. В начале тестирования с консоли Firebase .
Используйте командную линию GCLOUD (CLI)
Если вы еще этого не сделали, загрузите и установите Google Cloud SDK
Войдите в CLI GCLOUD, используя свою учетную запись Google:
gcloud auth login
Установите свой проект Firebase в GCLOUD, где
PROJECT_ID
является идентификатором вашего проекта Firebase:gcloud config set project PROJECT_ID
Запустите свой первый тест:
gcloud firebase test android run \ --type=game-loop --app=<var>path-to-apk</var> \ --device model=herolte,version=23
Для получения дополнительной информации о начале работы с GCLOUD CLI см. Start Testing из командной строки GCLOUD.
Дополнительные функции
Test Lab предлагает несколько дополнительных функций, которые позволяют дополнительно настраивать ваши тесты, включая возможность записать выходные данные, поддержку нескольких игровых петлей и этикетки для связанных петлей.
Напишите выходные данные
Ваш тест на игровой цикл может записать вывод в файл, указанный в методе launchIntent.getData()
. После запуска тестирования вы можете получить доступ к этим выходным данным в разделе Test Lab консоли Firebase (см. Пример вывода Test File Ploy Lop ).
Test Lab следует передовым методам обмена файлом между приложениями, описанными при обмене файлом . В методе вашей деятельности onCreate()
, где находится ваше намерение, вы можете проверить свой файл вывода данных, выполнив следующий код:
val launchIntent = intent val logFile = launchIntent.data logFile?.let { Log.i(TAG, "Log file ${it.encodedPath}") // ... }
Intent launchIntent = getIntent(); Uri logFile = launchIntent.getData(); if (logFile != null) { Log.i(TAG, "Log file " + logFile.getEncodedPath()); // ... }
Если вы хотите записать в файл со стороны C ++ приложения вашего игрового приложения, вы можете передать дескриптор файла вместо пути файла:
val launchIntent = intent val logFile = launchIntent.data var fd = -1 logFile?.let { Log.i(TAG, "Log file ${it.encodedPath}") fd = try { contentResolver .openAssetFileDescriptor(logFile, "w")!! .parcelFileDescriptor .fd } catch (e: FileNotFoundException) { e.printStackTrace() -1 } catch (e: NullPointerException) { e.printStackTrace() -1 } } // C++ code invoked here. // native_function(fd);
Intent launchIntent = getIntent(); Uri logFile = launchIntent.getData(); int fd = -1; if (logFile != null) { Log.i(TAG, "Log file " + logFile.getEncodedPath()); try { fd = getContentResolver() .openAssetFileDescriptor(logFile, "w") .getParcelFileDescriptor() .getFd(); } catch (FileNotFoundException e) { e.printStackTrace(); fd = -1; } catch (NullPointerException e) { e.printStackTrace(); fd = -1; } } // C++ code invoked here. // native_function(fd);
#include <unistd.h> JNIEXPORT void JNICALL Java_my_package_name_MyActivity_native_function(JNIEnv *env, jclass type, jint log_file_descriptor) { // The file descriptor needs to be duplicated. int my_file_descriptor = dup(log_file_descriptor); }
Пример выходного файла
Вы можете использовать файлы выходных данных (отформатированные как пример ниже) для отображения результатов теста петли игры в разделе Test Lab консоли Firebase . Области, показанные как /.../
могут содержать любые пользовательские поля, которые вам нужны, если они не конфликтуют с именами других полей, используемых в этом файле:
{ "name": "test name", "start_timestamp": 0, // Timestamp of the test start (in us). Can be absolute or relative "driver_info": "...", "frame_stats": [ { "timestamp": 1200000, // Timestamp at which this section was written It contains value regarding the period start_timestamp(0) -> this timestamp (1200000 us) "avg_frame_time": 15320, // Average time to render a frame in ns "nb_swap": 52, // Number of frame rendered "threads": [ { "name": "physics", "Avg_time": 8030 // Average time spent in this thread per frame in us }, { "name": "AI", "Avg_time": 2030 // Average time spent in this thread per frame in us } ], /.../ // Any custom field you want (vertices display on the screen, nb units …) }, { // Next frame data here, same format as above } ], "loading_stats": [ { "name": "assets_level_1", "total_time": 7850, // in us /.../ }, { "name": "victory_screen", "total_time": 554, // in us /.../ } ], /.../, // You can add custom fields here }
Многочисленные игровые петли
Вы можете найти полезным для запуска нескольких игровых петлей в вашем приложении. Цикл-это полная пробега вашего игрового приложения от начала до конца. Например, если у вас есть несколько уровней в вашей игре, вы, возможно, захотите получить один игровую петлю, чтобы запустить каждый уровень вместо того, чтобы иметь один цикл, который итерация проходит через все из них. Таким образом, если ваше приложение вылетает на уровне 32, вы можете напрямую запустить этот игровой цикл, чтобы воспроизвести исправления сбоя и тестирования ошибок.
Чтобы ваше приложение запустило несколько петель одновременно:
Если вы проводите тест с менеджером Test Loop:
Добавьте следующую строку в Manifest вашего приложения, внутри элемента
<application>
:<meta-data android:name="com.google.test.loops" android:value="5" />
Это намерение запуска содержит целевой цикл в качестве целочисленного параметра. В поле
android:value
вы можете указать целое число от 1 до 1024 (максимальное количество циклов разрешено на один тест). Обратите внимание, что петли индексируются, начиная с 1, а не 0.В приложении Manager Test Loop появляется экран выбора, который позволяет выбрать, какой цикл (ы) вы хотите запустить. Если вы выберете несколько циклов, каждый цикл запускается последовательно после завершения предыдущего цикла.
Если вы проводите тест с консоли Firebase , введите список или диапазон цифр в поле сценария .
Если вы выполняете тест с GCLOUD CLI, укажите список цифр цикла, используя флаг
--scenario-numbers
. Например,--scenario-numbers=1,3,5
пробегают петли 1, 3 и 5.Если вы пишете C ++ и хотите изменить поведение своего цикла, передайте следующее дополнительное код C ++:
val launchIntent = intent val scenario = launchIntent.getIntExtra("scenario", 0)
Intent launchIntent = getIntent(); int scenario = launchIntent.getIntExtra("scenario", 0);
Теперь вы можете изменить поведение вашего цикла на основе полученного значения
int
.
Лейбл игры петли
Когда вы маркируете свои игровые петли одним или несколькими мечениями сценариев, вы и ваша команда QA можете легко запустить набор связанных игровых петлей (например, «Все петли игры совместимости») и проверить их в одной матрице. Вы можете создавать свои собственные этикетки или использовать предопределенные этикетки, предлагаемые Test Lab :
-
com.google.test.loops.player_experience
: для петли, используемых для воспроизведения реального опыта пользователя при игре. Цель тестирования с этими циклами состоит в том, чтобы найти проблемы, с которыми сталкивается настоящий пользователь во время игры. -
com.google.test.loops.gpu_compatibility
: для петли, используемых для тестирования вопросов, связанных с графическим процессором. Цель тестирования с этими циклами состоит в том, чтобы выполнить код графического процессора, который может не работать должным образом в производстве, чтобы разоблачить проблемы с оборудованием и драйверами. -
com.google.test.loops.compatibility
. -
com.google.test.loops.performance
: для петли, используемых для проверки производительности устройства. Например, игра может работать в самых сложных настройках графики, чтобы увидеть, как ведет себя новое устройство.
Чтобы ваше приложение запустило петли с той же меткой:
Если вы проводите тест с менеджером Test Loop:
В манифесте вашего приложения добавьте следующую метада-линию и замените LABEL_NAME на метку по вашему выбору:
<meta-data android:name="com.google.test.loops.LABEL_NAME" android:value="1,3-5" />
В поле
android:value
вы можете указать диапазон или набор целых чисел от 1 до 1024 (максимальное количество петель, разрешенных для одного теста), которые представляют петли, которые вы хотите пометить. Обратите внимание LABEL_NAME что петли индексируютсяandroid:value="1,3-5"
начиная с 1, а не 0.В приложении Test Loop Manager введите одну или несколько ярлыков в поле Labels .
Если вы проводите тест на консоли Firebase , введите одну или несколько метков, в поле метки .
Если вы проводите тест с GCLOUD CLI, укажите одну или несколько меток сценариев, используя флаг-
--scenario-labels
(например,--scenario-labels=performance,gpu
).
Поддержка лицензирования приложений
Test Lab поддерживает приложения, которые используют сервис лицензирования приложений , предлагаемый Google Play. Чтобы успешно проверить лицензирование при тестировании вашего приложения с помощью Test Lab , вы должны опубликовать свое приложение в производственный канал в Play Store. Чтобы проверить ваше приложение в альфа -или бета -канале, используя Test Lab , удалите проверку лицензирования перед загрузкой вашего приложения в Test Lab .
Известные проблемы
Игровые тесты в Test Lab имеют следующие известные проблемы:
- Некоторые сбои не поддерживают Backtraces. Например, некоторые сборки выпуска могут подавить выходной сигнал процесса
debuggerd
с использованиемprctl(PR_SET_DUMPABLE, 0)
. Чтобы узнать больше, см.debuggerd
. - Уровень API 19 в настоящее время не поддерживается из -за ошибок разрешения на файл.