Automatyzacja testowania gier może być trudna, 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 pętli gry do uruchomienia w Firebase Test Lab.
O testach pętli gry
Co to jest test pętli gry?
Test pętli gry symuluje działania prawdziwego gracza, aby w szybki i skalowalny sposób sprawdzić, czy gra działa dobrze dla użytkowników. Pętla to pełne lub częściowe wykonanie testu w aplikacji do gier. Test pętli gry można uruchomić lokalnie na symulatorze lub na zestawie urządzeń w laboratorium testowym. Testy pętli gry mogą służyć do:
- Uruchom grę tak, jak grałby w nią użytkownik końcowy. Możesz albo oskryptować dane wejściowe użytkownika, pozwolić mu być bezczynnym, albo zastąpić użytkownika sztuczną inteligencją (na przykład, jeśli zaimplementowałeś sztuczną inteligencję w grze wyścigowej, możesz wyznaczyć kierowcę AI do wprowadzania danych przez użytkownika) .
- Uruchom swoją grę w ustawieniach najwyższej jakości, aby dowiedzieć się, które urządzenia mogą ją obsługiwać.
- Uruchom test techniczny, taki jak kompilowanie wielu programów cieniujących, wykonywanie ich i sprawdzanie, czy dane wyjściowe są zgodne z oczekiwaniami.
Krok 1 : Zarejestruj niestandardowy schemat URL laboratorium Test Lab
W Xcode wybierz cel projektu.
Kliknij kartę Informacje , a następnie dodaj nowy typ adresu URL .
W polu Schematy adresów URL wpisz
firebase-game-loop
. Możesz również zarejestrować niestandardowy schemat adresu URL, dodając go do pliku konfiguracyjnegoInfo.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 przeprowadzania testu przy użyciu laboratorium testowego.
Krok 2 : Opcjonalnie skonfiguruj swoją aplikację
Uruchom wiele pętli
Jeśli planujesz uruchomić wiele pętli (czyli scenariuszy) w teście, musisz określić, które pętle chcesz uruchomić w swojej aplikacji w czasie uruchamiania.
W delegatze 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 <UIApplicationOpenURLOptionsKey, id> *)options {
if ([url.scheme isEqualToString:(@"firebase-game-loop")]) {
// ...Enter Game Loop Test logic to override application(_:open:options:).
}
}
Po uruchomieniu wielu pętli w teście bieżąca pętla jest przekazywana jako parametr do adresu URL używanego do uruchamiania aplikacji. Aktualny numer pętli można również uzyskać, analizując obiekt URLComponents
używany do pobrania 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 pętli gry jest kontynuowany, dopóki nie przekroczy limitu czasu pięciu 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 adresu URL firebase-game-loop-complete
w usłudze AppDelegate aplikacji Test Lab. 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) {}];
}
Test pętli gry kończy bieżącą pętlę i wykonuje następną pętlę. Gdy nie ma więcej pętli do uruchomienia, test się kończy.
Napisz niestandardowe wyniki testów
Możesz skonfigurować test pętli gry, aby zapisywać niestandardowe wyniki testu w systemie plików urządzenia. W ten sposób po uruchomieniu testu Test Lab przechowuje 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 następujących kwestiach:
Wszystkie pliki wyników są przesyłane bez względu na ich typ, rozmiar czy ilość.
Test Lab nie przetwarza wyników testu, dopóki wszystkie pętle w teście nie zostaną uruchomione, więc jeśli test zawiera wiele pętli, które zapisują dane wyjściowe, upewnij się, że dołączasz je do unikalnego pliku wynikowego lub tworzysz plik wynikowy dla każdej pętli. W ten sposób możesz uniknąć nadpisywania wyników z poprzedniej pętli.
Aby skonfigurować test do zapisywania niestandardowych wyników testu:
W katalogu
Documents
aplikacji utwórz katalog o nazwieGameLoopResults
.Z dowolnego miejsca w kodzie aplikacji (np. delegata aplikacji) dodaj następujące elementy:
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 : Spakuj aplikację do przesłania
Na koniec wygeneruj plik IPA dla swojej aplikacji (musisz go później zlokalizować).
W Xcode wybierz profil aprowizacji dla aplikacji docelowej.
W wyświetlonym menu rozwijanym kliknij Produkt > Archiwum . Wybierz najnowsze archiwum, a następnie kliknij Rozpowszechnij aplikację .
W wyświetlonym oknie kliknij Rozwój > Dalej .
Opcjonalnie: aby uzyskać szybszą kompilację, usuń zaznaczenie opcji Odbuduj z kodu bitowego , a następnie kliknij przycisk Dalej . Test Lab nie wymaga odchudzania ani przebudowywania aplikacji w celu przeprowadzenia testu, więc możesz bezpiecznie wyłączyć tę opcję.
Kliknij Eksportuj , a następnie wpisz katalog, z którego chcesz pobrać plik IPA swojej aplikacji.
Krok 4 : Uruchom test lokalnie
Możesz uruchomić test lokalnie, aby sprawdzić jego zachowanie przed uruchomieniem go za pomocą Test Lab. Aby przetestować lokalnie, załaduj aplikację do gier w symulatorze i uruchom:
xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://
Możesz znaleźć UDID swojego symulatora, uruchamiając polecenie
instruments -s devices
.Jeśli działa tylko jeden symulator, wprowadź specjalny ciąg
"booted"
zamiast 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
. Zwróć uwagę, że podczas uruchamiania testu lokalnie możesz uruchomić tylko jedną pętlę na raz. 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ępny krok
Uruchom test, używając konsoli Firebase lub interfejsu wiersza polecenia gcloud .