Può essere difficile automatizzare i test di gioco se le app di gioco sono basate su e i framework di interfaccia utente. I test di Game Loop ti consentono di integrare i tuoi test nativi con Test Lab ed eseguirli facilmente sui dispositivi selezionati. Un test Ciclo di gioco esegue il test tramite la tua app di gioco simulando le azioni di un giocatore reale. Questo la guida mostra come eseguire un test Ciclo di gioco, quindi visualizzare e gestire il test vengono visualizzati nella console Firebase.
A seconda del motore grafico, puoi implementare test con una o più app ciclico. Un ciclo è un'esecuzione completa o parziale del test sulla tua app di gioco. I cicli di gioco possono essere utilizzati per:
- Esegui un livello del gioco nello stesso modo in cui lo userebbe un utente finale. Puoi script l'input dell'utente, lascialo inattivo oppure sostituisci utente con un'IA, se ha senso nel tuo gioco (ad esempio, supponiamo che tu abbia un'auto da corsa) di giochi e hanno già implementato un'IA. Puoi inserire facilmente un'IA conducente responsabile dell'input dell'utente).
- Esegui il gioco con l'impostazione di qualità più alta per verificare se i dispositivi la supportano.
- Esegui un test tecnico (compila più Shar, eseguili, controlla che è come previsto e così via).
Puoi eseguire un test Ciclo di gioco su un singolo dispositivo di test, un insieme di dispositivi di test o su Test Lab. Tuttavia, sconsigliamo di eseguire test del ciclo di gioco su virtuali perché hanno frequenze fotogrammi grafiche inferiori rispetto ai dispositivi fisici.
Prima di iniziare
Per implementare un test, devi prima configurare la tua app per i test del ciclo di gioco.
Nel file manifest dell'app, aggiungi un nuovo filtro per intent alla tua attività:
<activity android:name=".MyActivity"> <intent-filter> <action android:name="com.google.intent.action.TEST_LOOP"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="application/javascript"/> </intent-filter> <intent-filter> ... (other intent filters here) </intent-filter> </activity>
In questo modo Test Lab può avviare il tuo gioco attivandolo con uno specifico l'intento.
Nel codice (consigliato all'interno della dichiarazione del metodo
onCreate
), aggiungi il valore seguenti:Kotlin+KTX
val launchIntent = intent if (launchIntent.action == "com.google.intent.action.TEST_LOOP") { val scenario = launchIntent.getIntExtra("scenario", 0) // Code to handle your game loop here }
Java
Intent launchIntent = getIntent(); if(launchIntent.getAction().equals("com.google.intent.action.TEST_LOOP")) { int scenario = launchIntent.getIntExtra("scenario", 0); // Code to handle your game loop here }
In questo modo la tua attività può verificare l'intento che la avvia. Puoi anche aggiungi questo codice in un secondo momento, se preferisci (ad es. dopo aver caricato inizialmente il gioco di ricerca).
Consigliato: al termine del test, aggiungi:
Kotlin+KTX
yourActivity.finish()
Java
yourActivity.finish();
L'app viene chiusa al termine del test del ciclo di gioco. Il test si basa sul framework UI dell'app per avviare il ciclo successivo e la chiusura dell'app indica che il test è terminato.
Crea ed esegui un test Ciclo di gioco
Dopo aver configurato l'app per i test del ciclo di gioco, puoi creare immediatamente una testarlo ed eseguirlo nella tua app di gioco. Puoi scegliere di eseguire un test in Test Lab utilizzando la console Firebase o gcloud a riga di comando (CLI) o su un dispositivo locale utilizzando Test Loop Gestore.
Esegui su un dispositivo locale
Test Loop Manager di Test Lab è un'app open source che ti aiuta integrare i test Ciclo di gioco ed eseguirli sui dispositivi locali. Inoltre, ti consente il team responsabile del controllo qualità affinché esegua gli stessi cicli di gioco sui propri dispositivi.
Per eseguire un test su un dispositivo locale utilizzando Gestione Test Loop:
- Scarica Test Loop Manager
su uno smartphone o tablet e installalo eseguendo:
adb install testloopmanager.apk
- Sul tuo dispositivo, apri l'app App Test Loop sullo smartphone oppure tablet. L'app mostra un elenco di app sul tuo dispositivo che possono essere eseguiti con cicli di gioco. Se non trovi la tua app di gioco qui, assicurati il filtro per intent corrisponde a quello descritto nel primo passaggio della Prima di iniziare la sezione.
- Seleziona la tua app di gioco, quindi seleziona il numero di loop che vuoi eseguire. Nota: in questo passaggio, puoi scegliere di eseguire un sottoinsieme di loop anziché solo un loop. Per ulteriori informazioni sull'esecuzione di più loop contemporaneamente, consulta la sezione Funzionalità facoltative.
- Fai clic su Esegui test. L'esecuzione del test inizia immediatamente.
Eseguire in Test Lab
Puoi eseguire un test Ciclo di gioco in Test Lab utilizzando Console Firebase o gcloud CLI. Prima di Se non l'hai già fatto, apri Console Firebase e creare un progetto.
Utilizza la console Firebase
- Nella console Firebase, fai clic su Test Lab nel riquadro a sinistra.
- Fai clic su Esegui il primo test (o Esegui un test se il progetto è stato hai già eseguito un test).
- Seleziona Ciclo di gioco come tipo di test, quindi fai clic su Continua.
- Fai clic su Sfoglia, quindi vai al file
.apk
dell'app. Nota: in questo passaggio, puoi scegliere di eseguire un sottoinsieme di loop anziché solo un loop. Per ulteriori informazioni eseguire più loop contemporaneamente, vedi Funzionalità facoltative. - Fai clic su Continua.
- Seleziona i dispositivi fisici da utilizzare per testare l'app.
- Fai clic su Avvia test.
Per scoprire di più su come iniziare a utilizzare la console Firebase, consulta Iniziare a eseguire test con la console Firebase.
Utilizza la riga di comando gcloud (CLI)
Se non l'hai ancora fatto, scarica e installa Google Cloud SDK.
Accedi a gcloud CLI utilizzando il tuo Account Google:
gcloud auth login
Imposta il tuo progetto Firebase in gcloud, dove
PROJECT_ID
è l'ID del tuo progetto Firebase:gcloud config set project PROJECT_ID
Esegui il tuo primo test:
gcloud firebase test android run \ --type=game-loop --app=<var>path-to-apk</var> \ --device model=herolte,version=23
Per ulteriori informazioni su come iniziare a utilizzare gcloud CLI, consulta Avvia il test dalla riga di comando gcloud.
Funzionalità facoltative
Test Lab offre diverse funzionalità facoltative che ti consentono di personalizzare ulteriormente test, tra cui la possibilità di scrivere dati di output, il supporto per ed etichette per i loop correlati.
Scrivi dati di output
Il test Ciclo di gioco può scrivere l'output in un file specificato nel
launchIntent.getData()
. Dopo aver eseguito un test, puoi accedere a questo
i dati di output nella sezione Test Lab della console Firebase (vedi
Esempio di file di output del test del ciclo di gioco).
Test Lab segue le best practice per la condivisione di un file tra le app descritte in
Condivisione di un file.
Nel metodo onCreate()
dell'attività, dove si trova l'intent,
puoi controllare il file di output dei dati eseguendo questo codice:
Kotlin+KTX
val launchIntent = intent val logFile = launchIntent.data logFile?.let { Log.i(TAG, "Log file ${it.encodedPath}") // ... }
Java
Intent launchIntent = getIntent(); Uri logFile = launchIntent.getData(); if (logFile != null) { Log.i(TAG, "Log file " + logFile.getEncodedPath()); // ... }
Se vuoi scrivere nel file dal lato C++ della tua app di gioco, puoi passare il descrittore del file anziché il percorso del file:
Kotlin+KTX
val launchIntent = intent val logFile = launchIntent.data var fd = -1 logFile?.let { Log.i(TAG, "Log file ${it.encodedPath}") fd = try { contentResolver .openAssetFileDescriptor(logFile, "w")!! .parcelFileDescriptor .fd } catch (e: FileNotFoundException) { e.printStackTrace() -1 } catch (e: NullPointerException) { e.printStackTrace() -1 } } // C++ code invoked here. // native_function(fd);
Java
Intent launchIntent = getIntent(); Uri logFile = launchIntent.getData(); int fd = -1; if (logFile != null) { Log.i(TAG, "Log file " + logFile.getEncodedPath()); try { fd = getContentResolver() .openAssetFileDescriptor(logFile, "w") .getParcelFileDescriptor() .getFd(); } catch (FileNotFoundException e) { e.printStackTrace(); fd = -1; } catch (NullPointerException e) { e.printStackTrace(); fd = -1; } } // C++ code invoked here. // native_function(fd);
C++
#include <unistd.h> JNIEXPORT void JNICALL Java_my_package_name_MyActivity_native_function(JNIEnv *env, jclass type, jint log_file_descriptor) { // The file descriptor needs to be duplicated. int my_file_descriptor = dup(log_file_descriptor); }
Esempio di file di output
Puoi utilizzare file di dati di output (formattati come nell'esempio seguente) per visualizzare il gioco
risultati del test di loop nella sezione Test Lab della console Firebase.
Le aree mostrate come /.../
possono contenere qualsiasi campo personalizzato di cui hai bisogno, purché
non sono in conflitto con i nomi degli altri campi utilizzati in questo file:
{ "name": "test name", "start_timestamp": 0, // Timestamp of the test start (in us). Can be absolute or relative "driver_info": "...", "frame_stats": [ { "timestamp": 1200000, // Timestamp at which this section was written It contains value regarding the period start_timestamp(0) -> this timestamp (1200000 us) "avg_frame_time": 15320, // Average time to render a frame in ns "nb_swap": 52, // Number of frame rendered "threads": [ { "name": "physics", "Avg_time": 8030 // Average time spent in this thread per frame in us }, { "name": "AI", "Avg_time": 2030 // Average time spent in this thread per frame in us } ], /.../ // Any custom field you want (vertices display on the screen, nb units …) }, { // Next frame data here, same format as above } ], "loading_stats": [ { "name": "assets_level_1", "total_time": 7850, // in us /.../ }, { "name": "victory_screen", "total_time": 554, // in us /.../ } ], /.../, // You can add custom fields here }
Diversi cicli di gioco
Potrebbe essere utile eseguire più cicli di gioco nella tua app. Un loop è un eseguire il run-through completo della tua app di gioco dall'inizio alla fine. Ad esempio, se il tuo gioco ha più livelli, ti consigliamo di avere un loop di gioco per avviare ogni livello anziché un loop che li esamini tutti. In questo modo, se la tua app ha un arresto anomalo al livello 32, puoi lanciare direttamente il gioco per riprodurre l'arresto anomalo e le correzioni di bug di test.
Per consentire all'app di eseguire più cicli contemporaneamente:
Se stai eseguendo un test con il Gestore di test Loop:
Aggiungi la seguente riga al file manifest dell'app, all'interno della sezione
<application>
elemento:<meta-data android:name="com.google.test.loops" android:value="5" />
Questo intent di lancio contiene il loop di destinazione come parametro intero. Nel il campo
android:value
, puoi specificare un numero intero compreso tra 1 e 1024 (il numero massimo di loop consentiti per un singolo test). Nota che i loop vengono indicizzati a partire da 1, non da 0.Nell'app Gestione ciclo di test, viene visualizzata una schermata di selezione che ti consente di selezionare i loop da eseguire. Se selezioni più di una loop, ogni loop viene avviato in sequenza dopo il ciclo precedente vengono completate.
Se stai eseguendo un test con la console Firebase, inserisci un elenco o un intervallo di numeri di loop nel campo Scenari.
Se esegui un test con gcloud CLI, specifica un elenco di numeri di loop mediante il flag
--scenario-numbers
. Ad esempio:--scenario-numbers=1,3,5
esegue i loop 1, 3 e 5.Se stai scrivendo in C++ e vuoi modificare il comportamento del tuo loop, passa il parametro seguenti extra rispetto al codice C++ nativo:
Kotlin+KTX
val launchIntent = intent val scenario = launchIntent.getIntExtra("scenario", 0)
Java
Intent launchIntent = getIntent(); int scenario = launchIntent.getIntExtra("scenario", 0);
Ora puoi modificare il comportamento del loop in base all'oggetto
int
risultante valore.
Loop di gioco delle etichette
Quando etichetti i cicli di gioco con una o più etichette di scenari, tu e il QA team può avviare facilmente una serie di cicli di gioco correlati (ad es. "tutti i tipi di compatibilità cicli di gioco") e testarli in un'unica matrice. Puoi creare etichette personalizzate utilizza le etichette predefinite offerte da Test Lab:
com.google.test.loops.player_experience
: per i loop utilizzati per riprodurre l'esperienza di un utente reale durante il gioco. L'obiettivo i test con questi loop consiste nell'individuare i problemi che un utente reale deve affrontare giocano.com.google.test.loops.gpu_compatibility
: i loop For utilizzati per verificare Problemi relativi alla GPU. L'obiettivo del test con questi loop è eseguire GPU che potrebbe non essere eseguito correttamente in produzione, per esporre i problemi hardware e driver.com.google.test.loops.compatibility
: i loop For utilizzati per testare un un'ampia gamma di problemi di compatibilità, inclusi problemi di I/O e OpenSSL che le applicazioni presentino problemi di prestazioni.com.google.test.loops.performance
: loop For utilizzati per testare le prestazioni del dispositivo. Ad esempio, un gioco potrebbe essere eseguito al massimo impostazioni grafiche per vedere il comportamento di un nuovo dispositivo.
Per consentire alla tua app di eseguire loop con la stessa etichetta:
Se stai eseguendo un test con Test Loop Manager:
Nel file manifest dell'app, aggiungi la seguente riga di metadati e sostituisci LABEL_NAME con un'etichetta a tua scelta:
<meta-data android:name="com.google.test.loops.LABEL_NAME" android:value="1,3-5" />
Nel campo
android:value
puoi specificare un intervallo o un insieme di numeri interi compreso tra 1 e 1024 (numero massimo di loop consentiti per un singolo test) rappresenta i loop che vuoi etichettare. Tieni presente che i loop vengono indicizzati a partire da da 1, non da 0. Ad esempio,android:value="1,3-5"
applica LABEL_NAME ai loop 1, 3, 4 e 5.Nell'app Gestore ciclo di test, inserisci una o più etichette nel campo Etichette.
Se stai eseguendo un test con la console Firebase, inserisci uno o più nel campo Etichette.
Se stai eseguendo un test con gcloud CLI, specifica una o più etichette di scenario utilizzando il flag
--scenario-labels
(ad es.--scenario-labels=performance,gpu
).
Assistenza per le licenze delle app
Test Lab supporta le app che utilizzano Licenze delle app servizio offerto da Google Play. Per controllare correttamente le licenze durante i test la tua app con Test Lab, devi pubblicarla nel canale di produzione nel Play Store. Per testare la tua app nel canale alpha o beta utilizzando Test Lab, rimuovi il controllo della licenza prima di caricarla su Test Lab.
Problemi noti
I test del ciclo di gioco in Test Lab presentano i seguenti problemi noti:
- Alcuni arresti anomali non supportano backtraces. Ad esempio, alcune build di release possono
sopprime l'output del processo
debuggerd
utilizzandoprctl(PR_SET_DUMPABLE, 0)
. Per saperne di più, vedidebuggerd
- Il livello API 19 non è attualmente supportato a causa di errori di autorizzazione dei file.