Przeprowadź test pętli gry

Automatyzowanie testowania gier może być trudne, jeśli gry mobilne są oparte na różnych platformach interfejsu. Dzięki testom pętli gry możesz zintegrować testy natywne z Laboratorium i łatwo uruchamiać je na wybranych urządzeniach. Z tego przewodnika dowiesz się, jak przygotować test pętli gry do uruchomienia w Laboratorium Firebase.

Informacje o testach pętli gry

Co to jest test pętli gry?

Test pętli gry symuluje działania prawdziwego gracza, aby zweryfikować, czy Twoja gra działa szybko i w skalowalny sposób. pętla to całkowite lub częściowe omówienie testu w aplikacji dla graczy. Test Pętli gry możesz przeprowadzić lokalnie w symulatorze lub na grupie urządzeń w Laboratorium. Testy pętli gry mogą być wykorzystywane do:

  • Rozegraj grę tak, jak grałby w nią użytkownik. Możesz skryptować dane wejściowe użytkownika, pozwolić mu na bezczynność lub zastąpić go sztuczną inteligencją (jeśli na przykład masz zaimplementowaną AI w grze wyścigowej, możesz przekazać kierowcy AI kontrolę nad informacjami użytkownika).
  • Uruchom grę w najwyższej jakości, aby sprawdzić, które urządzenia ją obsługują.
  • Przeprowadź test techniczny, na przykład skompiluj wiele programów do cieniowania, wykonaj je i sprawdź, czy dane wyjściowe są zgodne z oczekiwaniami.

Krok 1. Rejestrowanie schematu niestandardowego adresu URL w Laboratorium

  1. W Xcode wybierz miejsce docelowe projektu.

  2. Kliknij kartę Informacje i dodaj nowy typ adresu URL.

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

Aplikacja jest teraz skonfigurowana do przeprowadzania testów w Laboratorium.

Krok 2. Opcjonalnie skonfiguruj aplikację

Uruchom wiele pętli

Jeśli zamierzasz uruchomić w teście wiele pętli (tzw. scenariusze), musisz określić, które pętle chcesz uruchomić w aplikacji w momencie uruchomienia.

W delegacji do 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 wykonujesz kilka pętli, bieżąca pętla jest przekazywana jako parametr do adresu URL używanego do uruchomienia aplikacji. Numer bieżącej pętli możesz też uzyskać, analizując obiekt URLComponents użyty do pobrania schematu niestandardowego 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).
        }
    }
}

Kończenie testu wcześniej

Domyślnie test pętli gry trwa do momentu upłynięcia 5-minutowego limitu czasu, 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 schemat niestandardowego adresu URL firebase-game-loop-complete w narzędziu AppDelegate Twojej 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 kończy bieżącą pętlę i uruchamia następną. Gdy nie ma więcej pętli do uruchomienia, test się kończy.

Zapisywanie wyników testów niestandardowych

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

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

  • Test Lab nie przetwarza wyników, dopóki wszystkie pętle w teście nie zostaną zakończone. Jeśli test obejmuje wiele pętli zapisujących dane wyjściowe, należy dołączyć je do unikalnego pliku wyników lub utworzyć plik wyników dla każdej pętli. W ten sposób unikniesz zastąpienia wyników z poprzedniej pętli.

Aby skonfigurować test i zapisać wyniki testu niestandardowego:

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

  2. W dowolnym miejscu w kodzie aplikacji (np. w imieniu jej przedstawiciela) 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 za pomocą Xcode, określając ustawienia podpisywania, takie jak profil obsługi administracyjnej i tożsamość. Więcej informacji znajdziesz na stronie Apple Codesigning

Krok 4. Spakuj aplikację do przesłania

Wygeneruj plik IPA dla aplikacji (będzie trzeba go później znaleźć).

  1. W menu kliknij Usługa > Archiwum. Wybierz najnowsze archiwum, a następnie kliknij Dystrybucja aplikacji.

  2. W wyświetlonym oknie kliknij Programowanie > Dalej.

  3. Opcjonalnie: aby przyspieszyć kompilację, odznacz opcję Odbuduj z kodu bitowego i kliknij Dalej. Laboratorium nie wymaga przecinania ani ponownego kompilowania aplikacji do przeprowadzenia testu, więc można bezpiecznie wyłączyć tę opcję.

  4. Kliknij Eksportuj, a potem wpisz katalog, z którego chcesz pobrać plik IPA aplikacji.

Krok 5. Sprawdź podpis aplikacji

  1. Sprawdź podpis aplikacji, rozpakowując plik .ipa, a następnie uruchamiając polecenie codesign --verify --deep --verbose /path/to/MyApp.app, w którym „MojaAplikacja” to nazwa aplikacji z rozpakowanego folderu (różna dla każdego 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, zanim wykonasz go w Laboratorium. Aby przetestować grę lokalnie, wczytaj ją 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 1 symulator, zamiast SIMULATOR_UDID wpisz specjalny ciąg znaków "booted".

Jeśli test zawiera wiele pętli, możesz określić, którą pętlę chcesz uruchomić, przekazując jej numer do flagi scenario. Pamiętaj, że podczas testowania lokalnego możesz uruchomić tylko 1 pętlę naraz. Jeśli na przykład chcesz uruchomić pętle 1, 2 i 5, musisz uruchomić dla każdej z nich osobne polecenie:

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 interfejsu wiersza poleceń gcloud.