С помощью тестов Game Loop вы можете писать тесты, нативные для вашего игрового движка, а затем запускать их в Test Lab на выбранных вами устройствах. Таким образом, вам не нужно беспокоиться о написании тестов для разных пользовательских интерфейсов или тестовых фреймворков. Тест Game Loop имитирует действия реального игрока, и при запуске в Test Lab он предоставляет быстрый и масштабируемый способ проверить, насколько хорошо ваша игра работает для ваших пользователей.
На этой странице показано, как запустить тест игрового цикла, а затем просмотреть и управлять результатами теста на странице Test Lab в консоли Firebase . Вы также можете дополнительно настроить свои тесты с помощью дополнительных функций, таких как написание пользовательских результатов теста или досрочное завершение теста .
Что такое тест игрового цикла?
Цикл — это полное или частичное выполнение теста в вашем игровом приложении. Вы можете запустить тест игрового цикла локально на симуляторе или на наборе устройств в Test Lab . Тесты игрового цикла можно использовать для:
Проведите игру так, как в неё играл бы конечный пользователь. Вы можете либо запрограммировать ввод данных пользователем, либо оставить пользователя в режиме ожидания, либо заменить пользователя искусственным интеллектом (например, если вы внедрили ИИ в гоночную игру, вы можете назначить водителя с ИИ для управления вводом данных пользователем).
Запустите игру с максимальными настройками качества, чтобы узнать, какие устройства её поддерживают.
Проведите техническое тестирование, например, скомпилируйте несколько шейдеров, выполните их и убедитесь, что результат соответствует ожиданиям.
Шаг 1: Зарегистрируйте пользовательскую схему URL-адресов Test Lab .
Во-первых, необходимо зарегистрировать пользовательскую схему URL-адресов Firebase Test Lab в вашем приложении:
В Xcode выберите целевой объект проекта.
Перейдите на вкладку «Информация» , затем добавьте новый тип URL-адреса .
В поле «Схемы URL» введите
firebase-game-loop. Вы также можете зарегистрировать пользовательскую схему URL, добавив её в файл конфигурацииInfo.plistвашего проекта в любом месте внутри тега<dict>:<key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLName</key> <string></string> <key>CFBundleTypeRole</key> <string>Editor</string> <key>CFBundleURLSchemes</key> <array> <string>firebase-game-loop</string> </array> </dict> </array>
Теперь ваше приложение настроено для запуска тестов с помощью Test Lab .
Шаг 2 (необязательно): Настройте приложение для запуска нескольких циклов.
Если в вашем приложении зарегистрировано несколько пользовательских схем URL-адресов, и вы планируете запускать несколько циклов (или сценариев) в тесте, вам необходимо указать, какие циклы вы хотите запустить в приложении при запуске.
В делегате вашего приложения переопределите метод application(_:open:options:) :
Быстрый
func application(_app: UIApplication,
open url: URL
options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
let components = URLComponents(url: url, resolvingAgainstBaseURL: true)!
if components.scheme == "firebase-game-loop" {
// ...Enter Game Loop Test logic to override application(_:open:options:).
}
return true
}
Objective-C
- (BOOL)application:(UIApplication *)app
openURL:(NSURL *)url
options:(NSDictionary <UIApplicationOpenURLOptionsKey, id> *)options {
if ([url.scheme isEqualToString:(@"firebase-game-loop")]) {
// ...Enter Game Loop Test logic to override application(_:open:options:).
}
}
При выполнении нескольких циклов в тесте текущий цикл передается в качестве параметра URL-адресу, используемому для запуска приложения. Номер текущего цикла также можно получить, проанализировав объект URLComponents используемый для получения пользовательской схемы URL:
Быстрый
if components.scheme == "firebase-game-loop" {
// Iterate over all parameters and find the one with the key "scenario".
let scenarioNum = Int(components.queryItems!.first(where: { $0.name == "scenario" })!.value!)!
// ...Write logic specific to the current loop (scenarioNum).
}
Objective-C
if ([url.scheme isEqualToString:(@"firebase-game-loop")]) {
// Launch the app as part of a game loop.
NSURLComponents *components = [NSURLComponents componentsWithURL:url
resolvingAgainstBaseURL:YES];
for (NSURLQueryItem *item in [components queryItems]) {
if ([item.name isEqualToString:@"scenario"]) {
NSInteger scenarioNum = [item.value integerValue];
// ...Write logic specific to the current loop (scenarioNum).
}
}
}
Шаг 3: Создайте и запустите тест.
После регистрации пользовательской схемы URL-адресов Test Lab вы можете запустить тест в консоли Firebase или с помощью CLI бета-версии gcloud . Если вы еще этого не сделали, сгенерируйте IPA-файл для своего приложения (он понадобится вам позже).
Запустите тест в консоли Firebase
Если вы еще этого не сделали, откройте консоль Firebase и создайте проект.
На странице Test Lab в консоли Firebase нажмите «Запустить первый тест» > «Запустить игровой цикл iOS» .
В разделе «Загрузка приложения» нажмите «Обзор» , затем выберите IPA-файл вашего приложения (если вы еще этого не сделали, сгенерируйте IPA-файл для своего приложения).
Необязательно : если вы хотите запустить несколько циклов (или сценариев) одновременно или выбрать определенные циклы для запуска, введите номера циклов в поле «Сценарии» .
Например, если вы введете "1-3, 5", Test Lab запустит циклы 1, 2, 3 и 5. По умолчанию (если вы ничего не введете в поле "Сценарии ") Test Lab запустит только цикл 1.
В разделе «Устройства» выберите одно или несколько физических устройств, на которых вы хотите протестировать свое приложение, а затем нажмите «Начать тестирование» .
Проведите тестирование с помощью CLI бета-версии gcloud.
Если вы еще этого не сделали, настройте локальную среду gcloud SDK, а затем обязательно установите бета-компонент gcloud .
Выполните команду `
gcloud beta firebase test ios runи используйте следующие флаги для настройки запуска:
| Флаги для тестов игрового цикла | |
|---|---|
--type | Обязательный параметр : указывает тип теста iOS, который вы хотите запустить. Вы можете ввести типы тестов |
--app | Обязательно : Абсолютный путь ( Google Cloud Storage или файловой системе) к IPA-файлу вашего приложения. Этот флаг действителен только при запуске тестов игрового цикла. |
--scenario-numbers | Циклы (или сценарии), которые вы хотите запустить в своем приложении. Вы можете ввести один цикл, список циклов или диапазон циклов. Цикл по умолчанию — 1. Например, |
--device-model | Физическое устройство, на котором вы хотите запустить тест (узнайте, какие доступные устройства можно использовать). |
--timeout | Максимальная продолжительность выполнения теста. Вы можете ввести целое число, чтобы указать продолжительность в секундах, или целое число и нумерацию, чтобы указать продолжительность в более длительной единице времени. Например:
|
Например, следующая команда запускает тест игрового цикла, который выполняет циклы 1, 4, 6, 7 и 8 на iPhone 8 Plus:
gcloud beta firebase test ios run --type game-loop --app path/to/my/App.ipa --scenario-numbers 1,4,6-8 --device-model=iphone8plus
Для получения дополнительной информации о CLI gcloud см. справочную документацию .
Запустите тест локально.
Чтобы запустить тест локально, загрузите ваше игровое приложение в симулятор и выполните следующую команду:
xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://
UDID вашего симулятора можно найти, выполнив команду
instruments -s devices.Если запущен только один симулятор, замените SIMULATOR_UDID на специальную строку
"booted".
Если ваш тест содержит несколько циклов, вы можете указать, какой цикл вы хотите запустить, передав номер цикла в флаг scenario . Обратите внимание, что при локальном запуске теста вы можете запустить только один цикл за раз. Например, если вы хотите запустить циклы 1, 2 и 5, вам необходимо выполнить отдельную команду для каждого цикла:
xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://?scenario=1xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://?scenario=2xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://?scenario=5
Завершите тест раньше времени.
По умолчанию тест игрового цикла продолжает выполнение до истечения пятиминутного таймаута, даже если все циклы выполнены. По истечении таймаута тест завершается и отменяет все ожидающие циклы. Вы можете ускорить выполнение теста или завершить его раньше, вызвав пользовательскую схему URL-адресов Test Lab firebase-game-loop-complete в AppDelegate вашего приложения. Например:
Быстрый
/// End the loop by calling our custom url scheme.
func finishLoop() {
let url = URL(string: "firebase-game-loop-complete://")!
UIApplication.shared.open(url)
}
Objective-C
- (void)finishLoop {
UIApplication *app = [UIApplication sharedApplication];
[app openURL:[NSURL URLWithString:@"firebase-game-loop-complete://"]
options:@{}
completionHandler:^(BOOL success) {}];
}
Тест игрового цикла завершает текущий цикл и переходит к следующему. Когда циклы для выполнения заканчиваются, тест завершается.
Напишите пользовательские результаты тестирования
Вы можете настроить тест Game Loop таким образом, чтобы результаты теста записывались в файловую систему вашего устройства. В этом случае, когда тест запускается, Test Lab сохраняет файлы результатов в каталоге GameLoopsResults на вашем тестовом устройстве (который вы должны создать самостоятельно). После завершения теста Test Lab перемещает все файлы из каталога GameLoopResults в хранилище вашего проекта. При настройке теста учитывайте следующее:
Все файлы с результатами загружаются независимо от типа, размера или количества файлов.
Test Lab не обрабатывает результаты ваших тестов до тех пор, пока не завершатся все циклы в вашем тесте. Поэтому, если ваш тест включает несколько циклов, записывающих результаты, убедитесь, что вы добавляете их в отдельный файл результатов или создаете отдельный файл результатов для каждого цикла. Таким образом, вы сможете избежать перезаписи результатов предыдущего цикла.
Чтобы настроить тест для записи пользовательских результатов:
В папке
Documentsвашего приложения создайте папку с именемGameLoopResults.В любом месте кода вашего приложения (например, в делегате приложения) добавьте следующее:
Быстрый
/// Write to a results file. func writeResults() { let text = "Greetings from game loops!" let fileName = "results.txt" let fileManager = FileManager.default do { let docs = try fileManager.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true) let resultsDir = docs.appendingPathComponent("GameLoopResults") try fileManager.createDirectory( at: resultsDir, withIntermediateDirectories: true, attributes: nil) let fileURL = resultsDir.appendingPathComponent(fileName) try text.write(to: fileURL, atomically: false, encoding: .utf8) } catch { // ...Handle error writing to file. } }Objective-C
/// Write to a results file. - (void)writeResults:(NSString *)message { // Locate and create the results directory (if it doesn't exist already). NSFileManager *manager = [NSFileManager defaultManager]; NSURL* url = [[manager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; NSURL* resultsDir = [url URLByAppendingPathComponent:@"GameLoopResults" isDirectory:YES]; [manager createDirectoryAtURL:resultsDir withIntermediateDirectories:NO attributes:nil error:nil]; // Write the result message to a text file. NSURL* resultFile = [resultsDir URLByAppendingPathComponent:@"result.txt"]; if ([manager fileExistsAtPath:[resultFile path]]) { // Append to the existing file NSFileHandle *handle = [NSFileHandle fileHandleForWritingToURL:resultFile error:nil]; [handle seekToEndOfFile]; [handle writeData:[message dataUsingEncoding:NSUTF8StringEncoding]]; [handle closeFile]; } else { // Create and write to the file. [message writeToURL:resultFile atomically:NO encoding:NSUTF8StringEncoding error:nil]; } }