Uruchom test pętli gry

Zautomatyzowanie testowania gier może być trudne, gdy aplikacje do gier są zbudowane na różnych platformach interfejsu użytkownika. Testy Game Loop umożliwiają integrację testów natywnych z Test Lab i łatwe uruchamianie ich na wybranych urządzeniach. W tym przewodniku opisano, jak przygotować test Game Loop do uruchomienia za pomocą Firebase Test Lab.

O testach Game Loop

Co to jest test Game Loop?

Test Game Loop symuluje działania prawdziwego gracza, aby sprawdzić, czy gra dobrze działa dla użytkowników w szybki i skalowalny sposób. Pętla to pełne lub częściowe przejście testu w aplikacji do gier. Możesz uruchomić test Game Loop lokalnie na symulatorze lub na zestawie urządzeń w Test Lab. Testy Game Loop można wykorzystać do:

  • Przejrzyj swoją grę tak, jak grałby w nią użytkownik końcowy. Możesz albo skryptować dane wejściowe użytkownika, pozwolić użytkownikowi być bezczynnym, albo zastąpić użytkownika sztuczną inteligencją (na przykład, jeśli zaimplementowałeś sztuczną inteligencję w grze wyścigowej, możesz powierzyć kierowcy AI kontrolę nad danymi wejściowymi użytkownika) .
  • Uruchom grę z najwyższą jakością, aby dowiedzieć się, które urządzenia ją obsługują.
  • Uruchom test techniczny, na przykład skompiluj wiele shaderów, wykonaj je i sprawdź, czy dane wyjściowe są zgodne z oczekiwaniami.

Krok 1 : Zarejestruj niestandardowy schemat adresu URL firmy Test Lab

  1. W Xcode wybierz cel projektu.

  2. Kliknij kartę Informacje , a następnie dodaj nowy typ adresu URL .

  3. W polu Schematy adresów URL wpisz firebase-game-loop . Możesz również zarejestrować niestandardowy schemat adresu URL, dodając go do pliku konfiguracyjnego Info.plist swojego projektu w dowolnym miejscu w obrębie tagu <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>
    

Twoja aplikacja jest teraz skonfigurowana do uruchamiania testu za pomocą Test Lab.

Krok 2 : Opcjonalnie skonfiguruj swoją aplikację

Uruchom wiele pętli

Jeśli planujesz uruchomić wiele pętli (inaczej scenariuszy) w swoim teście, musisz określić, które pętle chcesz uruchomić w swojej aplikacji w czasie uruchamiania.

W swoim delegacie aplikacji zastąp metodę application(_:open:options:) :

Szybki

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
}

Cel 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:).
  }
}

Gdy w teście uruchamiasz wiele pętli, bieżąca pętla jest przekazywana jako parametr do adresu URL używanego do uruchamiania aplikacji. Bieżący numer pętli można również uzyskać, analizując obiekt URLComponents używany do pobierania niestandardowego schematu adresu URL:

Szybki

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

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

Zakończ test wcześniej

Domyślnie test Game Loop jest kontynuowany do momentu przekroczenia limitu czasu wynoszącego pięć minut, nawet jeśli wszystkie pętle zostały wykonane. Po osiągnięciu limitu czasu test kończy się i anuluje wszystkie oczekujące pętle. Możesz przyspieszyć test lub zakończyć go wcześniej, wywołując niestandardowy schemat adresów URL firmy Test Lab pod nazwą firebase-game-loop-complete w AppDelegate aplikacji. Na przykład:

Szybki

/// End the loop by calling our custom url scheme.
func finishLoop() {
    let url = URL(string: "firebase-game-loop-complete://")!
    UIApplication.shared.open(url)
}

Cel C

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

Twój test Game Loop kończy bieżącą pętlę i wykonuje następną pętlę. Gdy nie ma więcej pętli do wykonania, test kończy się.

Napisz niestandardowe wyniki testów

Możesz skonfigurować test Game Loop, aby zapisywać niestandardowe wyniki testu w systemie plików urządzenia. W ten sposób, gdy test się rozpocznie, Test Lab zapisuje pliki wyników w katalogu GameLoopsResults na twoim urządzeniu testowym (który musisz sam utworzyć). Po zakończeniu testu Test Lab przenosi wszystkie pliki z katalogu GameLoopResults do zasobnika twojego projektu. Podczas konfigurowania testu pamiętaj o następujących kwestiach:

  • Wszystkie pliki wyników są przesyłane niezależnie od typu pliku, rozmiaru lub ilości.

  • Test Lab nie przetwarza wyników testu, dopóki wszystkie pętle w teście nie zakończą działania, więc jeśli test zawiera wiele pętli zapisujących dane wyjściowe, pamiętaj o dołączeniu ich do unikalnego pliku wynikowego lub o utworzeniu pliku wynikowego dla każdej pętli. W ten sposób można uniknąć nadpisywania wyników z poprzedniej pętli.

Aby skonfigurować test do zapisywania niestandardowych wyników testu:

  1. W katalogu Documents aplikacji utwórz katalog o nazwie GameLoopResults .

  2. Z dowolnego miejsca w kodzie aplikacji (np. pełnomocnika aplikacji) dodaj:

    Szybki

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

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

Krok 3 : Podpisz swoją aplikację

  1. Upewnij się, że wszystkie artefakty w aplikacji są podpisane. Na przykład możesz to zrobić za pomocą Xcode, określając ustawienia podpisywania, takie jak profil aprowizacji i tożsamość. Aby uzyskać więcej informacji, zobacz: Apple Codesigning

Krok 4 : spakuj aplikację do przesłania

Wygeneruj plik IPA dla swojej aplikacji (musisz go znaleźć później).

  1. W wyświetlonym menu rozwijanym kliknij Produkt > Archiwizuj . Wybierz najnowsze archiwum, a następnie kliknij opcję Dystrybuuj aplikację .

  2. W wyświetlonym oknie kliknij Rozwój > Dalej .

  3. Opcjonalnie: Aby uzyskać szybszą kompilację, usuń zaznaczenie opcji Odbuduj z kodu bitowego , a następnie kliknij przycisk Dalej . Test Lab nie wymaga przerzedzania ani przebudowywania aplikacji w celu przeprowadzenia testu, więc możesz bezpiecznie wyłączyć tę opcję.

  4. Kliknij Eksportuj , a następnie wprowadź katalog, do którego chcesz pobrać plik IPA swojej aplikacji.

Krok 5 : Zweryfikuj podpis aplikacji

  1. Sprawdź podpis aplikacji, rozpakowując plik .ipa, a następnie uruchamiając polecenie codesign --verify --deep --verbose /path/to/MyApp.app gdzie „MojaAplikacja” to nazwa aplikacji w rozpakowanym folderze (różna dla każdego projektu ). Oczekiwane dane wyjściowe to MyApp.app: valid on disk .

Krok 6 : Uruchom test lokalnie

Możesz uruchomić test lokalnie, aby sprawdzić jego zachowanie przed uruchomieniem go w Test Lab. Aby przetestować lokalnie, załaduj aplikację do gier w symulatorze i uruchom:

xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://
  • Identyfikator UDID symulatora można znaleźć, uruchamiając polecenie instruments -s devices .

  • Jeśli uruchomiony jest tylko jeden symulator, wprowadź specjalny ciąg "booted" w miejsce SIMULATOR_UDID .

Jeśli twój test zawiera wiele pętli, możesz określić, którą pętlę chcesz uruchomić, przekazując numer pętli do flagi scenario . Pamiętaj, że podczas uruchamiania testu lokalnie możesz uruchomić tylko jedną pętlę naraz. Na przykład, jeśli chcesz uruchomić pętle 1, 2 i 5, musisz uruchomić osobne polecenie dla każdej pętli:

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

Następne kroki

Uruchom test, używając konsoli Firebase lub interfejsu wiersza polecenia gcloud .