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

게임 루프 테스트 실행

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

게임 루프 테스트 정보

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

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

  • 최종 사용자가 게임을 플레이 할 때 게임을 실행하십시오. 사용자의 입력을 스크립팅하거나, 사용자를 유휴 상태로 두거나, 사용자를 AI로 대체 할 수 있습니다 (예를 들어, 자동차 경주 게임에서 AI를 구현 한 경우 AI 드라이버가 사용자 입력을 담당하도록 할 수 있음). .
  • 최고 품질 설정에서 게임을 실행하여 지원할 수있는 장치를 찾으십시오.
  • 여러 셰이더 컴파일, 실행, 출력이 예상 한대로인지 확인하는 등의 기술 테스트를 실행합니다.

1 단계 : Test Lab의 사용자 지정 URL 체계 등록

  1. Xcode에서 프로젝트 대상을 선택하십시오.

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

  3. URL Schemes 입력란에 firebase-game-loop 입력 firebase-game-loop . <dict> 태그 내에서 프로젝트의 Info.plist 구성 파일에 추가하여 사용자 지정 URL 체계를 등록 할 수도 있습니다.

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

여러 루프 실행

테스트에서 여러 루프 (일명 시나리오)를 실행하려는 경우 시작시 앱에서 실행할 루프를 지정해야합니다.

앱 대리자에서 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에 매개 변수로 전달됩니다. 사용자 정의 URL 스키마를 가져 오는 데 사용되는 URLComponents 객체를 구문 분석하여 현재 루프 번호를 얻을 수도 있습니다.

빠른

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 분의 제한 시간에 도달 할 때까지 계속 실행됩니다. 시간 초과에 도달하면 테스트가 종료되고 보류중인 모든 루프가 취소됩니다. 앱의 AppDelegate에서 Test Lab의 맞춤 URL 스키마 firebase-game-loop-complete 를 호출하여 테스트 속도를 높이거나 조기에 종료 할 수 있습니다. 예를 들면 :

빠른

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

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

맞춤 테스트 결과 작성

장치의 파일 시스템에 사용자 지정 테스트 결과를 작성하도록 게임 루프 테스트를 구성 할 수 있습니다. 이렇게하면 테스트가 실행되기 시작하면 Test Lab은 테스트 장치의 GameLoopsResults 디렉터리에 결과 파일을 저장합니다 (사용자가 직접 만들어야 함). 테스트가 끝나면 Test Lab은 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://
  • instruments -s devices 명령을 실행하여 시뮬레이터의 UDID를 찾을 수 있습니다.

  • 실행중인 시뮬레이터가 하나만있는 경우 SIMULATOR_UDID 대신 특수 문자열 "booted" 를 입력합니다.

테스트에 여러 루프가 포함 된 경우 루프 번호를 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

다음 단계

Firebase 콘솔 또는 gcloud CLI를 사용하여 테스트를 실행합니다.