Con i test Game Loop, puoi scrivere test nativi per il tuo motore di gioco e quindi eseguirli in Test Lab sui dispositivi che scegli. In questo modo, non devi preoccuparti di scrivere per diverse interfacce utente o framework di test. Un test Game Loop simula le azioni di un giocatore reale e, quando lo esegui su Test Lab, fornisce un modo veloce e scalabile per verificare che il tuo gioco funzioni bene per i tuoi utenti.
Questa pagina mostra come eseguire un test Game Loop, quindi visualizzare e gestire i risultati del test nella pagina Test Lab della console Firebase. Puoi anche personalizzare ulteriormente i tuoi test con funzionalità opzionali, come scrivere risultati di test personalizzati o terminare il test in anticipo .
Che cos'è un test del ciclo di gioco?
Un ciclo è un'esecuzione completa o parziale del test sulla tua app di gioco. Puoi eseguire un test Game Loop in locale su un simulatore o su un set di dispositivi in Test Lab. I test di Game Loop possono essere utilizzati per:
Esegui il tuo gioco come lo farebbe un utente finale. Puoi scrivere l'input dell'utente, lasciare che l'utente sia inattivo o sostituire l'utente con un'IA (ad esempio, se hai implementato l'IA in un gioco di corse automobilistiche, puoi affidare a un pilota AI l'input dell'utente) .
Esegui il tuo gioco con l'impostazione di massima qualità per scoprire quali dispositivi possono supportarlo.
Esegui un test tecnico, come compilare più shader, eseguirli e verificare che l'output sia quello 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 una destinazione 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 ovunque 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.
Passaggio 2 (facoltativo): configura la tua app per eseguire più loop
Se la tua app ha più schemi URL personalizzati registrati e prevedi di eseguire più loop (ovvero scenari) nel tuo test, devi specificare quali loop desideri eseguire nella tua app al momento dell'avvio.
Nel delegato dell'app, eseguire l'override del metodo application(_:open:options:)
:
Rapido
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
}
Obiettivo-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ù cicli nel test, il ciclo corrente viene passato come parametro all'URL utilizzato per avviare l'app. Puoi anche ottenere il numero di loop corrente analizzando l'oggetto URLComponents
utilizzato per recuperare lo schema URL personalizzato:
Rapido
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).
}
Obiettivo-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: creare ed eseguire un test
Dopo aver registrato lo schema URL personalizzato di Test Lab, puoi eseguire il test nella console Firebase o con l' interfaccia a riga di comando gcloud beta . Se non l'hai già fatto, genera un file IPA per la tua app (dovrai individuarlo in seguito).
Esegui 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 Run Your First Test > Run an iOS Game Loop .
Nella sezione Carica app , fai clic su Sfoglia , quindi seleziona il file IPA della tua app (se non l'hai già fatto, genera un file IPA per la tua app).
Facoltativo : se desideri eseguire più loop (ovvero scenari) alla volta o selezionare loop specifici da eseguire, inserisci i numeri dei loop 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 la tua app, quindi fai clic su Avvia test .
Esegui un test con l'interfaccia a riga di comando gcloud beta
Se non l'hai già fatto, configura il tuo ambiente gcloud SDK locale, quindi assicurati di installare il componente gcloud beta .
Esegui il comando
gcloud beta firebase test ios run
e utilizza i seguenti flag per configurare l'esecuzione:
Flag per i test di Game Loop | |
---|---|
--type | Obbligatorio : specifica il tipo di test iOS che desideri eseguire. Puoi inserire i tipi di test |
--app | Obbligatorio : percorso assoluto (Google Cloud Storage o filesystem) al file IPA della tua app. Questo flag è valido solo durante l'esecuzione dei test Game Loop. |
--scenario-numbers | I cicli (ovvero gli scenari) che vuoi eseguire nella tua app. È possibile inserire un loop, un elenco di loop o un intervallo di loop. 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 dell'esecuzione del test. È possibile immettere un numero intero per rappresentare la durata in secondi oppure un numero intero e un'enumerazione per rappresentare la durata come unità di tempo più lunga. Per esempio:
|
Ad esempio, il seguente comando esegue un test Game Loop 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 ulteriori informazioni sulla CLI gcloud, consulta la documentazione di riferimento .
Esegui un test in locale
Per eseguire il test in locale, carica la tua app di gioco in un simulatore ed esegui:
xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://
Puoi trovare l'UDID del tuo 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 quale ciclo desideri eseguire passando il numero del ciclo al flag scenario
. Tieni presente che puoi eseguire un solo ciclo alla volta quando esegui il test in locale. Ad esempio, se si desidera eseguire i cicli 1, 2 e 5, è necessario eseguire un comando separato per ciascun ciclo:
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
Termina un test in anticipo
Per impostazione predefinita, un test di Game Loop continua a essere eseguito fino a quando non raggiunge un timeout di cinque minuti, anche quando tutti i loop sono stati eseguiti. Quando viene raggiunto il timeout, il test termina e annulla eventuali loop in sospeso. Puoi velocizzare il test o terminarlo in anticipo chiamando lo schema URL personalizzato di Test Lab firebase-game-loop-complete
nell'AppDelegate della tua app. Per esempio:
Rapido
/// End the loop by calling our custom url scheme.
func finishLoop() {
let url = URL(string: "firebase-game-loop-complete://")!
UIApplication.shared.open(url)
}
Obiettivo-C
- (void)finishLoop {
UIApplication *app = [UIApplication sharedApplication];
[app openURL:[NSURL URLWithString:@"firebase-game-loop-complete://"]
options:@{}
completionHandler:^(BOOL success) {}];
}
Il tuo test Game Loop termina il loop corrente ed esegue il loop successivo. Quando non ci sono più loop da eseguire, il test termina.
Scrivi i risultati dei test personalizzati
Puoi configurare il tuo test Game Loop per scrivere i 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 tuo dispositivo di test (che devi creare tu stesso). Al termine del test, Test Lab sposta tutti i file dalla directory GameLoopResults
al bucket del progetto. Tieni presente quanto segue quando imposti il test:
Tutti i file dei risultati vengono caricati indipendentemente dal tipo di file, dalle dimensioni o dalla quantità.
Test Lab non elabora i risultati del test fino al termine dell'esecuzione di tutti i cicli del test, quindi se il test include più cicli che scrivono l'output, assicurati di aggiungerli a un file dei risultati univoco o di creare un file dei risultati per ogni ciclo. In questo modo, puoi evitare di sovrascrivere i risultati di un ciclo precedente.
Per impostare il test per scrivere risultati di test personalizzati:
Nella directory
Documents
della tua app, crea una directory denominataGameLoopResults
.Da qualsiasi punto del codice dell'app (ad esempio, il delegato dell'app), aggiungi quanto segue:
Rapido
/// 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. } }
Obiettivo-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]; } }