Google은 흑인 공동체를 위한 인종적 평등을 추구하기 위해 노력하고 있습니다. 자세히 알아보기

게임 루프 테스트 실행

게임 앱이 다른 UI 프레임워크에 구축된 경우 게임 테스트를 자동화하기 어려울 수 있습니다. 게임 루프 테스트를 사용하면 기본 테스트를 Test Lab과 통합하고 선택한 장치에서 쉽게 실행할 수 있습니다. 이 가이드에서는 Firebase Test Lab을 사용하여 실행할 게임 루프 테스트를 준비하는 방법을 설명합니다.

게임 루프 테스트 정보

게임 루프 테스트란 무엇입니까?

게임 루프 테스트는 실제 플레이어의 동작을 시뮬레이션하여 게임이 빠르고 확장 가능한 방식으로 사용자에게 잘 수행되는지 확인합니다. 루프는 게임 앱에서 테스트의 전체 또는 부분 실행입니다. 시뮬레이터 또는 Test Lab의 장치 세트에서 로컬로 게임 루프 테스트를 실행할 수 있습니다. 게임 루프 테스트는 다음과 같은 용도로 사용할 수 있습니다.

  • 최종 사용자가 플레이하는 것처럼 게임을 실행합니다. 사용자의 입력을 스크립팅하거나, 사용자를 유휴 상태로 두거나, 사용자를 AI로 교체할 수 있습니다(예: 자동차 경주 게임에서 AI를 구현한 경우 AI 드라이버를 사용자 입력을 담당할 수 있음). .
  • 최고 품질 설정에서 게임을 실행하여 어떤 장치가 게임을 지원할 수 있는지 알아보세요.
  • 여러 셰이더를 컴파일하고 실행하고 출력이 예상대로인지 확인하는 것과 같은 기술 테스트를 실행합니다.

1 단계 : 레지스터 테스트 랩의 사용자 정의 URL 체계

  1. Xcode에서 프로젝트 대상을 선택합니다.

  2. 다음 새로운 URL 유형을 추가, 정보 탭을 클릭합니다.

  3. 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 단계 : 선택적으로 앱을 구성

여러 루프 실행

테스트에서 여러 루프(시나리오라고도 함)를 실행할 계획이라면 시작 시 앱에서 실행할 루프를 지정해야 합니다.

앱 위임에서 오버라이드 (override) 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
}

오브젝티브-C

- (BOOL)application:(UIApplication *)app
            openURL:(NSURL *)url
            options:(NSDictionary &lt;UIApplicationOpenURLOptionsKey, id&gt; *)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).
}

오브젝티브-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).
        }
    }
}

시험을 일찍 끝내라

기본적으로 게임 루프 테스트는 모든 루프가 실행된 경우에도 5분의 제한 시간에 도달할 때까지 계속 실행됩니다. 시간 초과에 도달하면 테스트가 종료되고 보류 중인 루프가 취소됩니다. 당신은 당신의 테스트 속도를 높이거나 테스트 랩의 사용자 정의 URL 체계를 호출하여 일찍을 종료 할 수 있습니다 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)
}

오브젝티브-C

- (void)finishLoop {
  UIApplication *app = [UIApplication sharedApplication];
  [app openURL:[NSURL URLWithString:@"firebase-game-loop-complete://"]
      options:@{}
completionHandler:^(BOOL success) {}];
}

게임 루프 테스트는 현재 루프를 종료하고 다음 루프를 실행합니다. 더 이상 실행할 루프가 없으면 테스트가 종료됩니다.

사용자 지정 테스트 결과 작성

사용자 지정 테스트 결과를 장치의 파일 시스템에 쓰도록 게임 루프 테스트를 구성할 수 있습니다. 테스트 실행을 시작하면이 방법은, 테스트 랩은에 결과 파일을 저장 GameLoopsResults 테스팅 장치의 디렉토리 (사용자가 직접 작성해야합니다). 시험 끝, 테스트 랩은 모든 파일을 이동하면 GameLoopResults 프로젝트의 버킷 디렉토리. 테스트를 설정할 때 다음 사항에 유의하십시오.

  • 모든 결과 파일은 파일 형식, 크기 또는 수량에 관계없이 업로드됩니다.

  • Test Lab은 테스트의 모든 루프 실행이 완료될 때까지 테스트 결과를 처리하지 않습니다. 따라서 테스트에 출력을 작성하는 여러 루프가 포함된 경우 고유한 결과 파일에 루프를 추가하거나 각 루프에 대한 결과 파일을 생성해야 합니다. 이렇게 하면 이전 루프의 결과를 덮어쓰는 것을 방지할 수 있습니다.

사용자 지정 테스트 결과를 작성하도록 테스트를 설정하려면:

  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.
      }
    }
    

    오브젝티브-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];
        }
    }
    

3 단계 : 업로드에 대한 응용 프로그램을 패키지화

마지막으로 앱에 대한 IPA 파일을 생성합니다(나중에 찾아야 함).

  1. Xcode에서 대상 앱에 대한 프로비저닝 프로필을 선택합니다.

  2. 드롭 다운 메뉴에서 나타난다는 제품> 보관을 클릭 것이다. 가장 최근의 아카이브를 선택한 다음 응용 프로그램 배포를 클릭합니다.

  3. 나타나는 창에서 개발> 다음을 클릭합니다.

  4. 옵션 : 빠른 빌드를 얻으려면,이 비트 코드 옵션에서 다시 선택을 해제하고 다음을 클릭합니다. Test Lab은 테스트를 실행하기 위해 앱을 축소하거나 다시 빌드할 필요가 없으므로 이 옵션을 안전하게 비활성화할 수 있습니다.

  5. 내보내기를 클릭 한 다음 앱의 IPA 파일을 다운로드하려는 디렉토리를 입력합니다.

4 단계 : 로컬 테스트를 실행

Test Lab에서 테스트를 실행하기 전에 테스트를 로컬에서 실행하여 동작을 확인할 수 있습니다. 로컬에서 테스트하려면 시뮬레이터에서 게임 앱을 로드하고 다음을 실행합니다.

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

다음 단계

사용하여 테스트를 실행 중포 기지 콘솔 또는 gcloud의 CLI를 .