Può essere difficile automatizzare i test di gioco se le app di gioco sono basate su e i framework di interfaccia utente. I test Ciclo di gioco consentono di integrare i test nativi con Test Lab ed eseguirle facilmente sui dispositivi selezionati. Questo guida descrive come preparare un test Ciclo di gioco da eseguire utilizzando Firebase Test Lab.
Informazioni sui test del ciclo di gioco
Che cos'è un test Ciclo di gioco?
Un test del ciclo di gioco simula le azioni di un giocatore reale per verificare che il tuo gioco funzioni bene per i tuoi utenti in modo rapido e scalabile. Un loop è un run-through completo o parziale del test sul tuo di gaming. Puoi eseguire un test Ciclo di gioco localmente su un simulatore o su un gruppo di dispositivi in Test Lab. I test Ciclo di gioco possono essere utilizzati per:
- Rivedi il gioco come farebbe l'utente finale. Puoi scrivere l'input del metodo l'utente, lasciarlo inattivo o sostituirlo con un'IA (ad esempio, se hai implementato l'IA in un gioco di corse automobilistiche, è possibile affidare a un conducente IA l'input dell'utente).
- Esegui il gioco con l'impostazione di qualità massima per scoprire quali dispositivi possono supportarla.
- Esegui un test tecnico, ad esempio compila più shader, eseguili e controlla che l'output sia come previsto.
Passaggio 1: registra lo schema URL personalizzato di Test Lab
In Xcode, seleziona una destinazione del progetto.
Fai clic sulla scheda Informazioni, poi aggiungi un nuovo tipo di URL.
Nel campo Schemi URL, inserisci
firebase-game-loop
. Puoi anche registrare lo schema URL personalizzato aggiungendolo allaInfo.plist
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.
Passaggio 2: configura la tua app (facoltativo)
Eseguire più loop
Se prevedi di eseguire più loop (scenari) nel test, devi specificare i loop che vuoi eseguire nella tua app al momento del lancio.
Nel delegato della tua app, esegui l'override del 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 corrente viene passato come
all'URL utilizzato per avviare l'app. Puoi anche ottenere lo stato attuale
di loop usando l'analisi del numero
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).
}
}
}
Terminare un test in anticipo
Per impostazione predefinita, un test Ciclo di gioco continua l'esecuzione fino a raggiungere un timeout
di cinque minuti, anche quando sono stati eseguiti tutti i loop. Quando
raggiunto il timeout, il test termina e annulla gli eventuali loop in sospeso. Puoi velocizzare
termina il test o termina in anticipo chiamando lo schema URL personalizzato di Test Lab
firebase-game-loop-complete
nel delegato 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 loop corrente ed esegue il ciclo successivo. Quando non ci sono più cicli da eseguire, il test termina.
Scrivere risultati di test personalizzati
Puoi configurare il test Ciclo di gioco per scrivere risultati personalizzati sul tuo
al file system del dispositivo. In questo modo, quando inizia il test, Test Lab
archivia i file dei risultati in una directory GameLoopsResults
sul tuo sito
dispositivo (che devi creare personalmente). Al termine del test, Test Lab si sposta
tutti i file dalla directory GameLoopResults
al bucket del progetto. Conserva
tieni presente quanto segue durante la configurazione del test:
Tutti i file dei risultati vengono caricati indipendentemente dal tipo, dalle dimensioni o dalla quantità di file.
Test Lab non elabora i risultati del test finché non vengono eseguiti tutti i loop nella test hanno terminato l'esecuzione, quindi se il test include più loop che scrivono un output, assicurati di aggiungerlo a un file di risultati univoco o di crearne uno per ogni loop. In questo modo, puoi evitare di sovrascrivere i risultati di un ciclo precedente.
Per configurare il test in modo da scrivere risultati di test personalizzati:
Nella directory
Documents
dell'app, crea una directory denominataGameLoopResults
.Da qualsiasi punto del codice dell'app (ad es. il tuo app delegate), 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]; } }
Passaggio 3: firma l'app
Assicurati che tutti gli elementi nell'app siano firmati. Ad esempio, puoi eseguire questa operazione attraverso Xcode specificando le impostazioni di firma, come il profilo di provisioning e l'identità. Per ulteriori informazioni, consulta la pagina relativa alla firma Apple
Passaggio 4: prepara la tua app per il caricamento
Genera un file IPA per la tua app (dovrai individuarlo in seguito).
Nel menu a discesa visualizzato, fai clic su Prodotto > Archivio. Seleziona l'archivio più recente, quindi fai clic su Distribuisci app.
Nella finestra visualizzata, fai clic su Sviluppo > Avanti.
(Facoltativo) Per velocizzare la creazione, deseleziona l'opzione Ricrea da Bitcode, quindi fai clic su Avanti. Test Lab non richiede di assottigliare o ricreare l'app per eseguire un test, in modo da disattivare in modo sicuro questa opzione.
Fai clic su Esporta, quindi inserisci una directory da scaricare. il file IPA dell'app.
Passaggio 5: verifica la firma dell'app
- Verifica la firma dell'app decomprimendo il file .ipa ed eseguendo
codesign --verify --deep --verbose /path/to/MyApp.app
, dove "MiaApp" è il nome dell'app all'interno della cartella decompresa (varia in base a ogni progetto). L'output previsto èMyApp.app: valid on disk
.
Passaggio 6: esegui il test in locale
Puoi eseguire il test in locale per verificarne il comportamento prima di eseguirlo con Test Lab. 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://
Per trovare l'UDID del simulatore, esegui il comando 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ù loop, puoi specificare quale loop vuoi eseguire
passando il numero di loop al flag scenario
. Tieni presente che puoi
eseguire un solo loop alla volta quando si esegue il test in locale. Ad esempio, se
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
Passaggi successivi
Eseguire il test utilizzando la console Firebase o gcloud CLI.