Przeprowadź test pętli gry

Automatyzacja testowania gier może być trudna, gdy gry mobilne są tworzone na różnych platformach interfejsu. Testy pętli gry umożliwiają integrację testów natywnych z Test Lab i łatwe uruchamianie ich na wybranych urządzeniach. Z tego przewodnika dowiesz się, jak przygotować test pętli gry do uruchomienia za pomocą Firebase Test Lab.

Informacje o testach pętli gry

Czym jest test pętli gry?

Test pętli gry symuluje działania prawdziwego gracza, aby szybko i skalowalnie sprawdzić, czy gra działa prawidłowo. Pętla to pełne lub częściowe uruchomienie testu w grze mobilnej. Test pętli gry możesz uruchomić lokalnie w symulatorze lub na zestawie urządzeń w usłudze Test Lab. Testy pętli gry można wykorzystać do:

  • Przejdź grę tak, jakby grał w nią użytkownik. Możesz zapisać dane wejściowe użytkownika, pozostawić użytkownika bezczynnego lub zastąpić go sztuczną inteligencją (np. jeśli wdrożysz AI w grze wyścigowej, możesz przekazać kierowcy AI kontrolę nad danymi wejściowymi użytkownika).
  • Uruchom grę z najwyższymi ustawieniami jakości, aby sprawdzić, które urządzenia ją obsługują.
  • Przeprowadź test techniczny, np. skompiluj kilka programów do cieniowania, uruchom je i sprawdź, czy dane wyjściowe są zgodne z oczekiwaniami.

Krok 1. Zarejestruj niestandardowy schemat URI adresu URL aplikacji 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 też zarejestrować niestandardowy schemat URI adresu URL, dodając go do pliku konfiguracji Info.plist projektu w dowolnym miejscu w 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 przeprowadzenia testu za pomocą Test Lab.

Krok 2. Opcjonalnie skonfiguruj aplikację

Uruchamianie wielu pętli

Jeśli planujesz uruchomić w teście kilka pętli (scenariuszy), musisz określić, które pętle chcesz uruchomić w aplikacji w momencie jej uruchomienia.

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

Swift

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 &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 kilka pętli, bieżąca pętla jest przekazywana jako parametr do adresu URL używanego do uruchamiania aplikacji. Możesz też uzyskać bieżący numer pętli, analizując obiekt URLComponents używany do pobierania niestandardowego schematu URI adresu URL:

Swift

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

Wcześniejsze zakończenie testu

Domyślnie test pętli gry jest uruchamiany, dopóki nie upłynie limit czasu wynoszący 5 minut, nawet jeśli wszystkie pętle zostały wykonane. Po upływie 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 URI adresu URL Test Lab firebase-game-loop-complete w AppDelegate aplikacji. Przykład:

Swift

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

Test pętli gry zakończy bieżącą pętlę i wykona następną. Gdy nie ma już pętli do uruchomienia, test się kończy.

Zapisywanie niestandardowych wyników testów

Możesz skonfigurować test pętli gry, aby zapisywać niestandardowe wyniki testów w systemie plików urządzenia. Dzięki temu po rozpoczęciu testu Test Lab zapisze pliki wyników w katalogu GameLoopsResults na urządzeniu testowym (który musisz utworzyć samodzielnie). Po zakończeniu testu Test Lab przenosi wszystkie pliki z katalogu GameLoopResults do zasobnika projektu. Podczas konfigurowania testu pamiętaj o tych kwestiach:

  • Przesyłane są wszystkie pliki wyników, niezależnie od ich typu, rozmiaru i liczby.

  • Test Lab nie przetwarza wyników testu, dopóki nie zakończą się wszystkie pętle w teście. Jeśli więc test zawiera wiele pętli, które zapisują dane wyjściowe, upewnij się, że dołączasz je do unikalnego pliku wyników lub tworzysz plik wyników dla każdej pętli. Dzięki temu unikniesz zastąpienia wyników z poprzedniej pętli.

Aby skonfigurować test pod kątem zapisywania niestandardowych wyników:

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

  2. W dowolnym miejscu w kodzie aplikacji (np. w delegacie aplikacji) dodaj:

    Swift

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

Krok 3. Podpisz aplikację

  1. Upewnij się, że wszystkie artefakty w aplikacji są podpisane. Możesz to zrobić na przykład w Xcode, określając ustawienia podpisywania, takie jak profil obsługi administracyjnej i tożsamość. Więcej informacji: Podpisywanie kodu Apple

Krok 4. Przygotuj pakiet aplikacji do przesłania

Wygeneruj plik IPA aplikacji (będzie Ci potrzebny później).

  1. W wyświetlonym menu kliknij Produkt > Archiwizuj. Wybierz najnowsze archiwum, a następnie kliknij Distribute App (Rozpowszechnij aplikację).

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

  3. Kliknij Export (Eksportuj), a następnie wpisz katalog, do którego chcesz pobrać plik IPA aplikacji.

Krok 5. Zweryfikuj podpis aplikacji

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

Krok 6. Przeprowadź test lokalnie

Możesz uruchomić test lokalnie, aby sprawdzić jego działanie przed uruchomieniem w Test Lab. Aby przetestować lokalnie, wczytaj grę mobilną w symulatorze i uruchom:

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

  • Jeśli działa tylko jeden symulator, zamiast SIMULATOR_UDID wpisz specjalny ciąg znaków "booted".

Jeśli test zawiera kilka pętli, możesz określić, którą z nich chcesz uruchomić, przekazując jej numer do flagi scenario. Pamiętaj, że podczas testowania lokalnego możesz uruchomić tylko jedną pętlę naraz. Jeśli na przykład 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

Dalsze kroki

Uruchom test za pomocą konsoli Firebase lub gcloud CLI.