This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this manual in English
I test automatici verificano il codice e i contenuti Defold tramite prove esplicite e leggibili dalle macchine. Usa questo manuale per progettare test che funzionino allo stesso modo con script locali, runner CI (Continuous Integration) e agenti di programmazione. Il manuale tratta test dei moduli, collection in esecuzione, test nel browser, automazione a runtime, controlli visivi e build headless, oltre a fornire buone pratiche utili.
I buoni livelli di test automatico seguono il modello della piramide dei test, che suddivide i test in tre livelli principali: test unitari, test di integrazione e test end-to-end (E2E). In Defold puoi separare i test in collection specifiche caricabili al bootstrap. In genere è opportuno iniziare dal controllo più circoscritto e veloce in grado di rilevare il problema, aggiungendo poi test a runtime o specifici della piattaforma quando necessario.
| Livello | Prove adatte |
|---|---|
| Convalida statica | Parser, formatter, validatore di risorse o confronto di file generati |
| Test di modulo | Risultati delle asserzioni per la logica Lua riutilizzabile con dipendenze minime dal motore |
| Collection in esecuzione | Messaggi, componenti, input, fisica, ciclo di vita e comportamento del motore |
| Automazione a runtime | Stato della scena in esecuzione, input iniettato, stato dell’applicazione e schermate a runtime |
| Test browser HTML5 | Input nel canvas, integrazione con il browser, comportamento della viewport e output web |
| Test di piattaforma | Comportamento e rendering dalla piattaforma di destinazione effettiva |
| Build e bundle | Stato di uscita di Bob, report di build, archivio e artefatti del bundle |
Una compilazione riuscita dimostra che il progetto viene compilato, ma non garantisce il corretto comportamento del gameplay. Una schermata non dimostra transizioni, animazioni, interazioni o flussi di gioco complessi, ma può essere utilizzata dalle moderne soluzioni multimodali per esaminare l’aspetto di un singolo fotogramma e verificare la correttezza degli shader e del layout visivo. Per i test automatici, tuttavia, prediligi asserzioni deterministiche ogni volta che la condizione può essere espressa direttamente.
Mantieni la logica riutilizzabile in moduli Lua con dipendenze minime dal motore. In questo modo, trasformazioni di dati pure, regole, macchine a stati e calcoli possono essere verificati senza creare un mondo di gioco completo.
Separa il codice che interagisce con il motore dalla logica che richiama. Uno script può tradurre messaggi e stato dei componenti in chiamate a un modulo, mentre i test richiamano direttamente il modulo con input controllati.
Per ulteriori dettagli, consulta il manuale Scrivere codice.
Utilizza una collection di test dedicata quando il comportamento dipende da game object, componenti, messaggi, input, fisica o altri sistemi del motore.
Ogni test dovrebbe:
Prediligi collection di test isolate. Un progetto può selezionare una collection di bootstrap per i test tramite un’impostazione temporanea del progetto in game.project:
[bootstrap]
main_collection = /test/test.collectionc
Non lasciare un bootstrap di test temporaneo nella configurazione normale del progetto. Nella CI, prediligi un file di impostazioni dedicato passato a Bob. La CI non può modificare lo stato del repository; dovrebbe apportare soltanto modifiche temporanee quando necessario.
Per i giochi complessi, puoi creare piccole collection “stanze di sviluppo” con scenari predefiniti e semplici volumi provvisori. Rendono le meccaniche riproducibili e agevolano lo sviluppo e i test senza dover attraversare sezioni e stati di gioco non pertinenti.
I progetti possono implementare un piccolo runner o utilizzare una libreria di test della comunità.
Ad esempio, DefTest è una libreria di test unitari basata su Telescope. Supporta suite, funzioni di setup e teardown, asserzioni, filtri per nome, mock per determinate API Defold e la copertura facoltativa LuaCov. I test possono essere eseguiti da una collection di bootstrap dedicata, anche in un bundle headless creato con Bob.
Il riepilogo della console o del log di un framework può essere utile agli sviluppatori, ma un controller automatico non presidiato necessita comunque di un risultato di completamento esplicito. Se necessario, aggiungi un piccolo adattatore intorno al callback o al riepilogo del framework, in modo che il controller possa elaborare facilmente i risultati dei test.
Una semplice descrizione dei risultati può utilizzare un prefisso univoco seguito da un oggetto JSON su ogni riga fisica della console:
TEST {"run":"8f13","event":"suite_start","tests":2}
TEST {"run":"8f13","event":"case","name":"player_moves","status":"pass","duration_ms":3}
TEST {"run":"8f13","event":"case","name":"player_stops","status":"pass","duration_ms":2}
TEST {"run":"8f13","event":"suite_end","status":"pass","passed":2,"failed":0}
Un raccoglitore dovrebbe elaborare ogni riga in modo indipendente, trovare il prefisso TEST, analizzare il JSON che segue e ignorare l’output del motore non pertinente.
Includi un identificatore di esecuzione univoco, affinché l’output di un processo precedente o simultaneo non possa completare l’esecuzione corrente. Ogni suite dovrebbe emettere un solo evento finale non ambiguo (come Pass, Failure, Crash, Timeout ecc.).
Quando un gioco viene eseguito dall’editor, sono disponibili sia la cronologia corrente della console sia un flusso continuo. Chiudi il flusso dopo un evento di completamento della suite corrispondente, la terminazione del processo, un errore o il raggiungimento del timeout o del limite di righe configurato.
Per ulteriori informazioni, consulta il manuale dell’API HTTP dell’editor.
Defold può anche salvare il log del gioco abilitando Write Log File in game.project. Consulta Log di gioco e di sistema. La registrazione su file è utile per le applicazioni distribuite in pacchetti e per testare dispositivi di destinazione sui quali la console dell’editor non è disponibile.
Il progetto può utilizzare le funzioni integrate print() e pprint() oppure, ad esempio, qualsiasi altra libreria di logging disponibile nel nostro Asset Portal.
Un’API di automazione a runtime può ispezionare e controllare un motore di debug in esecuzione. Può essere utilizzata quando i test devono trovare oggetti a runtime, iniettare input, attendere uno stato visibile o acquisire il risultato renderizzato.
Per ulteriori dettagli, consulta il manuale del servizio del motore.
L’esempio seguente utilizza la struttura dell’helper Python di Automation Bridge. Il progetto deve includere una versione compatibile dell’estensione di debug, esporre un elemento con l’id di automazione specificato e pubblicare lo stato dell’applicazione screen:
from automation_bridge import editor
project = editor.open_project(".")
game = project.build_and_run()
try:
play = game.element(automation_id="play_button")
game.click(play)
game.wait_for_state("screen", "gameplay", timeout=5.0)
screenshot = game.screenshot()
print(screenshot.path)
finally:
game.close_engine()
Gli stati definiti dall’applicazione e gli id di automazione utilizzano l’API Lua facoltativa e disponibile soltanto in modalità debug di Automation Bridge, che il progetto deve abilitare e pubblicare. Un’attesa fissa è sensibile alla velocità del computer e alla temporizzazione dei fotogrammi; un polling circoscritto di uno stato definito è più affidabile.
Automation Bridge è un’estensione, non fa parte del motore principale. Consulta il relativo riferimento API Python per selettori, attese, stato, eventi, schermate e diagnostica della versione installata.
L’editor può creare e servire una build HTML5 tramite il comando corrente build-html5, come descritto nel manuale dell’API HTTP dell’editor. Bob può inoltre creare un bundle HTML5 senza l’editor.
Strumenti esterni di automazione del browser come Playwright, Puppeteer, Selenium, WebdriverIO o Cypress possono:
L’input indirizzato al canvas viene elaborato tramite i normali binding di input del progetto e i callback on_input(). Verifica sia la risposta del gioco sia i punti di integrazione specifici del browser.
L’approccio più affidabile consiste nell’esporre un bridge di test JavaScript esplicito nell’index.html personalizzato. Sul lato Defold, le build HTML5 possono eseguire JavaScript tramite html5.run(), rendendo possibile la comunicazione con un simile bridge lato browser. Per i comandi che passano da JavaScript a Defold, utilizza un bridge dedicato tra JavaScript e il motore.
Mantieni circoscritti i test nel browser. Nel report finale, distingui tra errore di caricamento della pagina, canvas mancante, errore JavaScript, timeout del test e asserzione del gioco non riuscita.
È possibile creare una schermata dei file di risorse nella vista scena predefinita dell’editor aperto o di un gioco a runtime.
| Metodo | Scopo |
|---|---|
| Anteprima dell’editor | Layout delle risorse caricate, ad esempio un livello o una GUI, composizione dell’atlas, ispezione della tilemap, composizione statica della scena, correttezza del rendering e degli shader dell’editor oppure creazione di miniature per la documentazione |
| Schermata a runtime | Stato renderizzato di una build in esecuzione in uno scenario controllato |
Puoi utilizzare il confronto di immagini, ad esempio, per i test di regressione. Quando un controllo fallisce, conserva l’immagine delle differenze e le metriche di confronto.
Un modello multimodale può valutare durante l’ispezione visiva condizioni semantiche difficili da esprimere diversamente, come testo tagliato, controlli sovrapposti, stati di selezione poco chiari o contenuti al di fuori di un’area sicura. È consigliabile considerare tale valutazione come un segnale aggiuntivo con criteri espliciti, ma non come sostituto di controlli logici deterministici o del confronto di immagini.
Utilizza Bob, lo strumento di build a riga di comando, per una CI indipendente dall’editor.
Puoi utilizzarlo per risolvere le dipendenze, creare una build del gioco, un archivio o un bundle autonomo e generare un report JSON:
mkdir -p build/reports
java -jar bob.jar \
--root . \
--archive \
--build-report-json build/reports/build-report.json \
resolve build
Crea un bundle di test headless con impostazioni dedicate:
java -jar bob.jar \
--root . \
--settings test/test.settings \
--platform x86_64-linux \
--variant headless \
--archive \
--bundle-output build/test-bundle \
resolve build bundle
Esegui l’eseguibile risultante con un controller di processo adatto alla piattaforma. Acquisiscine lo stato di uscita e i log, imponi un timeout e richiedi l’evento strutturato di completamento della suite.
Il manuale di Bob descrive piattaforme, file di impostazioni, bundle, cache, estensioni native e report di build.
I buoni risultati dei test dovrebbero conservare prove sufficienti per riprodurre e diagnosticare un errore:
Lo stesso formato dovrebbe poter essere utilizzato da uno sviluppatore, uno script locale, un servizio CI o un agente di programmazione IA. In questo modo, la verifica resta deterministica anche quando la diagnosi o la correzione viene delegata.