Pierwsze kroki z testami pętli gry na iOS

Dzięki testom pętli gry możesz pisać testy natywne dla silnika gry, a następnie uruchamiać je je w aplikacji Test Lab na wybranych przez Ciebie urządzeniach. Dzięki temu nie musisz się martwić. na temat pisania rozwiązań do interfejsu użytkownika lub platform testowania. Test Game Loop symuluje działania prawdziwego gracza, a jego uruchomienie na urządzeniu Test Lab zapewnia szybki i elastyczny sposób na sprawdzenie, czy gra działa prawidłowo dla użytkowników.

Na tej stronie dowiesz się, jak uruchomić test pętli gry, a potem wyświetlić go i nim zarządzać spowoduje wyświetlenie strony Test Lab w konsoli Firebase. Możesz też dodatkowo dostosować testy za pomocą opcjonalnych funkcji, takich jak zapisywanie niestandardowych wyników testu lub przedwczesne zakończenie testu.

Co to jest test pętli gry?

Pętla to pełne lub częściowe przetestowanie aplikacji do gier. Możesz przeprowadzić test pętli gry lokalnie na symulatorze lub na zestawie urządzeń w Test Lab. Testy pętli gry umożliwiają:

  • Rozegraj grę tak, jak grałby w nią użytkownik. Możesz albo stworzyć skrypt z danymi wejściowymi użytkownika, albo pozwolić, aby użytkownik był nieaktywny, albo zastąpić go sztuczną inteligencją (na przykład jeśli wdrożyłeś sztuczną inteligencję w grze wyścigowej, możesz ustawić sterowanie pojazdem na rzecz sterownika AI).

  • Uruchom grę w najwyższej jakości, aby dowiedzieć się, na jakich urządzeniach może je obsłużyć.

  • Przeprowadza testy techniczne, np. skompilowanie i uruchomienie wielu cieniowania, i sprawdzić, czy wynik jest zgodny z oczekiwaniami.

Krok 1. Zarejestruj schemat niestandardowego adresu URL użytkownika Test Lab

Najpierw musisz zarejestrować domeny Firebase Test Lab schemat niestandardowego adresu URL w Twojej aplikacji:

  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ć niestandardowy schemat adresu URL, dodając go do pliku konfiguracyjnego 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>
    

Aplikacja jest teraz skonfigurowana do uruchamiania testów przy użyciu narzędzia Test Lab.

Krok 2 (opcjonalny). Skonfiguruj aplikację tak, aby uruchamiała wiele pętli

Jeśli Twoja aplikacja ma zarejestrowanych wiele schematów niestandardowych adresów URL i chcesz ją uruchomić wielu pętli (tzw. scenariusze), musisz określić, która z nich które chcesz uruchomić w aplikacji w chwili wprowadzenia na rynek.

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

Jeśli w teście uruchomisz kilka pętli, bieżąca pętla jest przekazywana jako do adresu URL używanego do uruchamiania aplikacji. Możesz też uzyskać aktualne przez analizowanie URLComponents obiekt 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).
        }
    }
}

Krok 3. Utwórz i uruchom test

Gdy zarejestrujesz schemat niestandardowego adresu URL Test Lab, możesz uruchomić test w konsoli Firebase lub za pomocą gcloud beta CLI. Wygeneruj plik IPA dla swojej aplikacji (będziesz go później potrzebować).

.

Uruchamianie testu w konsoli Firebase

  1. Otwórz konsolę Firebase, chyba że masz to już za sobą i utwórz projekt.

  2. Na stronie Test Lab w konsoli Firebase kliknij Uruchom pierwsze Testowanie > Uruchom pętlę gry na iOS.

  3. W sekcji Przesyłanie aplikacji kliknij Przeglądaj, a następnie wybierz plik IPA (jeśli jeszcze nie został wygenerowany, wygeneruj plik IPA); dla Twojej aplikacji).

  4. Opcjonalnie: jeśli chcesz uruchomić wiele pętli (scenariuszy) jednocześnie lub wybierz konkretne pętle do uruchomienia, wpisz ich numery w Scenariuszach. .

    Jeśli na przykład wpiszesz „1–3, 5”, Test Lab uruchomi pętle 1, 2, 3 i 5. Domyślnie (jeśli nie wprowadzisz niczego w polu Scenariusze): Test Lab uruchamia tylko pierwszą pętlę.

  5. W sekcji Urządzenia wybierz co najmniej 1 urządzenie fizyczne, które chcesz przetestuj aplikację i kliknij Rozpocznij testy.

Przeprowadzanie testu za pomocą gcloud beta CLI

  1. Skonfiguruj lokalne środowisko gcloud SDK (jeśli jeszcze tego nie zrobiono), a potem zainstaluj komponent gcloud w wersji beta.

  2. Uruchom polecenie gcloud beta firebase test ios run i użyj tego flagi w celu skonfigurowania uruchomienia:

Flagi testów pętli gry
--type

Wymagany: określa typ testu na iOS, który chcesz przeprowadzić. Możesz wpisać typy testów xctest (domyślnie) lub game-loop.

--app

Wymagana: ścieżka bezwzględna (Google Cloud Storage lub systemu plików) do pliku IPA aplikacji. Ten parametr jest prawidłowy tylko podczas uruchamiania testów pętli gry.

--scenario-numbers

pętle (czyli scenariusze), które chcesz uruchomić w aplikacji. Możesz podać jedną pętlę, listę pętli lub zakres pętli. Domyślna pętla to 1.

Na przykład --scenario-numbers=1-3,5 wykonuje pętle 1, 2, 3 i 5.

--device-model

Fizyczne urządzenie, na którym chcesz przeprowadzić test (dowiedz się, których dostępnych urządzeń możesz użyć).

--timeout

Maksymalny czas trwania testu. Możesz wpisać liczbę całkowitą, aby przedstawiają czas trwania w sekundach lub liczbę całkowitą i wyliczenie reprezentujące jako dłuższej jednostki czasu.

Przykład:

  • --timeout=200 wymusza zakończenie testu, gdy osiągnie wartość 200 sek.
  • --timeout=1h wymusza zakończenie testu po upływie maksymalnie godziny.

Na przykład to polecenie uruchamia test pętli gry, który wykonuje pętle 1, 4, 6, 7 i 8 na iPhonie 8 Plus:

gcloud beta firebase test ios run
 --type game-loop --app path/to/my/App.ipa --scenario-numbers 1,4,6-8
 --device-model=iphone8plus

Więcej informacji o gcloud CLI znajdziesz w dokumentacji referencyjnej.

Uruchamianie testu lokalnie

Aby przeprowadzić test lokalnie, wczytaj aplikację do gier w symulatorze i uruchom:

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

  • Jeżeli działa tylko jeden symulator, wprowadź specjalny ciąg znaków. "booted" w miejsce SIMULATOR_UDID.

Jeśli 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 możesz uruchamiając test lokalnie tylko w 1 pętli. Jeśli na przykład chcesz uruchomić pętle 1, 2 i 5, musisz uruchomić osobne polecenie dla każdej z nich:

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

Wcześniejsze kończenie testu

Domyślnie test pętli gry trwa do momentu osiągnięcia limitu czasu. po pięciu minutach, nawet po wykonaniu wszystkich pętli. Gdy po upływie limitu czasu test kończy się i anuluje wszystkie oczekujące pętle. Możesz przyspieszyć rozpocznij test lub zakończ go wcześniej, wywołując schemat niestandardowego adresu URL Test Lab firebase-game-loop-complete w 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.

Pisanie niestandardowych wyników testów

Możesz skonfigurować test pętli gry tak, aby zapisywał niestandardowe wyniki testu w systemu plików urządzenia. Dzięki temu po uruchomieniu testu Test Lab przechowuje pliki wyników w katalogu GameLoopsResults na potrzeby testów urządzenia (które musisz utworzyć samodzielnie). Po zakończeniu testu Test Lab przenosi wszystkie pliki z katalogu GameLoopResults do zasobnika projektu. Google Keep pamiętaj o następujących kwestiach:

  • Przesyłane są wszystkie pliki wyników wyszukiwania 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, więc jeśli test zawiera wiele pętli, które zapisują dane wyjściowe, dołącz je do osobnego pliku wyników lub utwórz plik wyników dla każdej pętli. Dzięki temu unikniesz zastępowania 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 przypadku przedstawiciela aplikacji) dodaj parametr :

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