Con i test Game Loop, puoi scrivere test nativi per il tuo motore di gioco e poi eseguirli in Test Lab sui dispositivi che scegli. In questo modo, non dovrai preoccuparti di scrivere per UI o framework di test diversi. Un test Ciclo di gioco simula le azioni di un giocatore reale e, quando lo esegui su Test Lab, offre un modo rapido e scalabile per verificare che il gioco funzioni bene per gli utenti.
Questa pagina mostra come eseguire un test di Game Loop, quindi visualizzare e gestire i risultati del test nella pagina Test Lab della console Firebase. Puoi anche personalizzare ulteriormente i test con funzionalità facoltative, ad esempio scrivere risultati di test personalizzati o terminare il test in anticipo.
Che cos'è un test Ciclo di gioco?
Un ciclo è un'esecuzione completa o parziale del test nell'app di gioco. Puoi eseguire un test di ciclo di gioco localmente su un simulatore o su un insieme di dispositivi in Test Lab. I test Ciclo di gioco possono essere utilizzati per:
Gioca al tuo gioco come farebbe un utente finale. Puoi scrivere script per l'input dell'utente, lasciare che l'utente sia inattivo o sostituirlo con un'IA (ad esempio, se hai implementato l'IA in un gioco di corse automobilistiche, puoi mettere un pilota IA responsabile dell'input dell'utente).
Esegui il gioco con l'impostazione di qualità massima per scoprire quali dispositivi possono supportarlo.
Esegui un test tecnico, ad esempio compilando più shader, eseguili e controlla che l'output sia come previsto.
Passaggio 1: registra lo schema URL personalizzato di Test Lab
Innanzitutto, devi registrare lo schema URL personalizzato di Firebase Test Lab nella tua app:
In Xcode, seleziona un target del progetto.
Fai clic sulla scheda Informazioni, quindi aggiungi un nuovo tipo di URL.
Nel campo Schemi URL, inserisci
firebase-game-loop
. Puoi anche registrare lo schema URL personalizzato aggiungendolo al file di configurazioneInfo.plist
del tuo progetto in qualsiasi punto all'interno del tag<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>
La tua app è ora configurata per eseguire un test utilizzando Test Lab.
(Facoltativo) Passaggio 2: configura l'app in modo che esegua più cicli
Se la tua app ha più schemi URL personalizzati registrati e prevedi di eseguire più cicli (ovvero scenari) nel test, devi specificare quali vuoi eseguire nell'app al momento del lancio.
Nel tuo app delegate, sostituisci il metodo 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 <UIApplicationOpenURLOptionsKey, id> *)options {
if ([url.scheme isEqualToString:(@"firebase-game-loop")]) {
// ...Enter Game Loop Test logic to override application(_:open:options:).
}
}
Quando esegui più loop nel test, il loop attuale viene passato come
parametro all'URL utilizzato per avviare l'app. Puoi anche ottenere il numero di loop
attuale analizzando l'oggetto
URLComponents
utilizzato per recuperare lo schema URL personalizzato:
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).
}
}
}
Passaggio 3: crea ed esegui un test
Dopo aver registrato lo schema URL personalizzato di Test Lab, puoi eseguire il test nella console Firebase o con gcloud beta CLI. Se non lo hai già fatto, genera un file IPA per la tua app (dovrai individuarlo in un secondo momento).
Eseguire un test nella console Firebase
Se non l'hai già fatto, apri la console Firebase e crea un progetto.
Nella pagina Test Lab della console Firebase, fai clic su Esegui il tuo primo test > Esegui un ciclo di gioco iOS.
Nella sezione Carica app, fai clic su Sfoglia, poi seleziona il file IPA della tua app (se non l'hai ancora fatto, genera un file IPA per la tua app).
Facoltativo: se vuoi eseguire più loop (scenari) contemporaneamente o selezionare loop specifici da eseguire, inserisci i relativi numeri nel campo Scenari.
Ad esempio, quando inserisci "1-3, 5", Test Lab esegue i loop 1, 2, 3 e 5. Per impostazione predefinita (se non inserisci nulla nel campo Scenari), Test Lab esegue solo il loop 1.
Nella sezione Dispositivi, seleziona uno o più dispositivi fisici su cui vuoi testare l'app, quindi fai clic su Avvia test.
Eseguire un test con l'interfaccia a riga di comando gcloud beta
Se non lo hai già fatto, configura l'ambiente locale dell'SDK gcloud e assicurati di installare il componente beta di gcloud.
Esegui il comando
gcloud beta firebase test ios run
e utilizza i seguenti parametri per configurare l'esecuzione:
Flag per i test del ciclo di gioco | |
---|---|
--type
|
Obbligatorio: specifica il tipo di test iOS che vuoi eseguire. Puoi inserire i tipi di test |
--app
|
Obbligatorio: percorso assoluto (Google Cloud Storage o file system) al file IPA dell'app. Questo flag è valido solo quando si eseguono i test Ciclo di gioco. |
--scenario-numbers
|
I cicli (ovvero gli scenari) che vuoi eseguire nella tua app. Puoi inserire un ciclo, un elenco di cicli o un intervallo di cicli. Il ciclo predefinito è 1.
Ad esempio, |
--device-model
|
Il dispositivo fisico su cui vuoi eseguire il test (scopri quali dispositivi disponibili puoi utilizzare). |
--timeout
|
La durata massima del test. Puoi inserire un numero intero per rappresentare la durata in secondi oppure un numero intero e un'enumerazione per rappresentare la durata come un'unità di tempo più lunga. Ad esempio:
|
Ad esempio, il seguente comando esegue un test Ciclo di gioco che esegue i loop 1, 4, 6, 7 e 8 su un iPhone 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
Per saperne di più sulla CLI gcloud, consulta la documentazione di riferimento.
Eseguire un test localmente
Per eseguire il test localmente, carica la tua app di gioco in un simulatore ed esegui:
xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://
Puoi trovare l'UDID del simulatore eseguendo il comando
instruments -s devices
.Se è in esecuzione un solo simulatore, inserisci la stringa speciale
"booted"
al posto di SIMULATOR_UDID.
Se il test contiene più cicli, puoi specificare quello da eseguire passando il numero del ciclo al flag scenario
. Tieni presente che puoi eseguire
un solo loop alla volta quando esegui il test in locale. Ad esempio, se vuoi eseguire i loop 1, 2 e 5, devi eseguire un comando separato per ogni loop:
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
Terminare un test in anticipo
Per impostazione predefinita, un test Ciclo di gioco continua a funzionare fino a quando non raggiunge un timeout di cinque minuti, anche quando tutti i cicli sono stati eseguiti. Quando viene raggiunto il tempo di attesa, il test termina e annulla eventuali cicli in attesa. Puoi accelerare il test o terminarlo in anticipo chiamando lo schema URL personalizzato di Test Labfirebase-game-loop-complete
in AppDelegate della tua app. Ad esempio:
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) {}];
}
Il test Ciclo di gioco termina il ciclo corrente ed esegue quello successivo. Quando non ci sono altri loop da eseguire, il test termina.
Scrivi risultati di test personalizzati
Puoi configurare il test Ciclo di gioco per scrivere risultati del test personalizzati nel file system del tuo dispositivo. In questo modo, quando il test inizia a essere eseguito, Test Lab
memorizza i file dei risultati in una directory GameLoopsResults
sul dispositivo di test (che devi creare autonomamente). Al termine del test, Test Lab sposta tutti i file dalla directory GameLoopResults
al bucket del progetto. Tieni presente quanto segue durante la configurazione del test:
Tutti i file dei risultati vengono caricati indipendentemente dal tipo, dalle dimensioni o dalla quantità.
Test Lab non elabora i risultati del test finché non è terminata l'esecuzione di tutti i loop del test, quindi se il test include più loop che scrivono output, assicurati di aggiungerli a un file di risultati univoco o di creare un file di risultati per ogni loop. In questo modo, puoi evitare di sovrascrivere i risultati di un loop precedente.
Per configurare il test in modo da scrivere risultati di test personalizzati:
Nella directory
Documents
della tua app, crea una directory denominataGameLoopResults
.In qualsiasi punto del codice dell'app (ad es. dal delegato dell'app), aggiungi quanto segue:
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]; } }