Эта страница была переведа с помощью Cloud Translation API.
Switch to English

Начните с тестов Game Loop для iOS

С помощью тестов Game Loop вы можете написать тесты, встроенные в ваш игровой движок, а затем запустить их в Test Lab на выбранных вами устройствах. Таким образом, вам не нужно беспокоиться о написании для различных UI или сред тестирования. Тест Game Loop имитирует действия реального игрока, и когда вы запускаете его в Test Lab, он обеспечивает быстрый и масштабируемый способ проверки того, что ваша игра хорошо работает для ваших пользователей.

На этой странице показано, как запустить тест Game Loop, а затем просмотреть результаты теста и управлять ими на странице Test Lab консоли Firebase. Вы также можете дополнительно настраивать свои тесты с помощью дополнительных функций, таких как написание пользовательских результатов теста или досрочное завершение теста .

Что такое тест игрового цикла?

Цикл - это полное или частичное прохождение теста в игровом приложении. Вы можете запустить тест Game Loop локально на симуляторе или на множестве устройств в Test Lab. Тесты Game Loop можно использовать для:

  • Запустите вашу игру, как конечный пользователь будет играть в нее. Вы можете либо написать сценарий ввода пользователя, позволить пользователю бездействовать, либо заменить пользователя на ИИ (например, если вы внедрили ИИ в автомобильные гонки, вы можете назначить водителя ИИ ответственным за ввод данных пользователем). ,

  • Запустите вашу игру с настройкой высочайшего качества, чтобы узнать, какие устройства могут ее поддерживать

  • Запустите технический тест, такой как компиляция нескольких шейдеров, их выполнение и проверка того, что выходные данные соответствуют ожидаемым.

Шаг 1: Зарегистрируйте пользовательскую схему URL Test Lab

Во-первых, вы должны зарегистрировать пользовательскую схему URL Firebase Test Lab в своем приложении:

  1. В Xcode выберите цель проекта.

  2. Перейдите на вкладку « Информация » и добавьте новый тип URL .

  3. В поле « Схемы URL» введите firebase-game-loop . Вы также можете зарегистрировать пользовательскую схему URL, добавив ее в Info.plist конфигурации 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:) метод 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 объект 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 или с помощью бета-интерфейса командной строки gcloud . Если вы этого еще не сделали, создайте файл IPA для своего приложения (вам нужно будет найти его позже).

Запустите тест в консоли Firebase

  1. Если вы этого еще не сделали, откройте консоль Firebase и создайте проект.

  2. На странице «Лаборатория тестирования» консоли Firebase выберите « Выполнить первый тест»> «Запустить игровой цикл iOS» .

  3. В разделе « Загрузить приложение » нажмите « Обзор» , затем выберите файл IPA вашего приложения (если вы еще этого не сделали, создайте файл IPA для своего приложения).

  4. Необязательно : Если вы хотите запускать несколько циклов (также называемых сценариями) одновременно или выбрать конкретные циклы для запуска, введите номера циклов в поле Сценарии .

    Например, когда вы вводите «1-3, 5», Test Lab запускает циклы 1, 2, 3 и 5. По умолчанию (если вы ничего не вводите в поле « Сценарии» ), Test Lab запускает только цикл 1.

  5. В разделе « Устройства » выберите одно или несколько физических устройств, на которых вы хотите протестировать свое приложение, затем нажмите « Начать тесты» .

Запустите тест с помощью бета-версии gcloud

  1. Если вы этого еще не сделали, настройте локальную среду gcloud SDK, а затем обязательно установите бета-компонент gcloud .

  2. Запустите команду gcloud beta firebase test ios run и используйте следующие флаги для настройки запуска:

Флаги для тестов Game Loop
--type

Обязательно : указывает тип теста iOS, который вы хотите запустить. Вы можете ввести типы тестов xctest (по умолчанию) или game-loop .

--app

Обязательно : Абсолютный путь (GCS или файловая система) к файлу IPA вашего приложения. Этот флаг действителен только при выполнении тестов Game Loop.

--scenario-numbers

Циклы (или сценарии), которые вы хотите запустить в своем приложении. Вы можете ввести один цикл, список или циклы, или диапазон циклов. Цикл по умолчанию равен 1.

Например, --scenario-numbers=1-3,5 запускает циклы 1, 2, 3 и 5.

--device-model

Физическое устройство, на котором вы хотите запустить тест (выясните, какие доступные устройства вы можете использовать).

--timeout

Максимальная продолжительность, на которую вы хотите запустить тест. Вы можете ввести целое число для представления длительности в секундах или целое число и перечисление для представления длительности в виде более длительной единицы времени.

Например:

  • --timeout=200 заставляет ваш тест завершиться, если он длится до 200 секунд.
  • --timeout=1h завершает ваш тест, если он длится до часа.

Например, следующая команда запускает тест Game Loop, который выполняет циклы 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 .

  • Если запущен только один симулятор, введите специальную строку "booted" вместо SIMULATOR_UDID .

Если ваш тест содержит несколько циклов, вы можете указать, какой цикл вы хотите запустить, передав номер цикла в флаг scenario . Обратите внимание, что вы можете запускать только один цикл за раз, когда тест выполняется локально. Например, если вы хотите запустить циклы 1, 2 и 5, вы должны запустить отдельную команду для каждого цикла:

xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://?scenario=1
xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://?scenario=2
xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://?scenario=5

Завершить тест рано

По умолчанию тест Game Loop продолжается до тех пор, пока не истечет время ожидания в пять минут, даже если все циклы были выполнены. По истечении времени ожидания тест завершается и отменяет все ожидающие циклы. Вы можете ускорить свой тест или завершить его раньше, вызвав пользовательскую схему 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: //"] параметры: @ {} завершениеHandler: ^ (BOOL success) {}]; }

Ваш тест Game Loop завершает текущий цикл и выполняет следующий цикл. Когда больше нет циклов для запуска, тест заканчивается.

Написать пользовательские результаты теста

Вы можете настроить свой тест Game Loop для записи пользовательских результатов теста в файловую систему вашего устройства. Таким образом, когда тест запускается, Test Lab сохраняет файлы результатов в каталоге GameLoopsResults на вашем тестовом устройстве (которое вы должны создать самостоятельно). Когда тест завершается, Test Lab перемещает все файлы из каталога GameLoopResults в GameLoopResults вашего проекта. При настройке теста учитывайте следующее:

  • Все файлы результатов загружаются независимо от типа, размера или количества файлов.

  • Лаборатория тестирования не обрабатывает результаты теста до тех пор, пока все циклы в вашем тесте не будут завершены, поэтому, если ваш тест включает несколько циклов, которые записывают выходные данные, обязательно добавьте их в файл результатов или создайте файл результатов для каждого цикла. Таким образом, вы можете избежать перезаписи результатов предыдущего цикла.

Чтобы настроить тест для записи пользовательских результатов теста:

  1. В каталоге Documents вашего приложения создайте каталог с именем GameLoopResults .

  2. В любом месте кода вашего приложения (например, делегата приложения) добавьте следующее:

    стриж

    /// 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]; } }