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
Las pruebas automatizadas verifican el código y el contenido de Defold mediante evidencias explícitas y legibles por máquinas. Utiliza este manual para diseñar pruebas que funcionen por igual con scripts locales, ejecutores de CI (integración continua) y agentes de programación. Abarca pruebas de módulos, colecciones en ejecución, pruebas de navegador, automatización de runtime, comprobaciones visuales y builds headless, además de proporcionar buenas prácticas útiles.
Los niveles adecuados de pruebas automatizadas siguen el modelo de la pirámide de pruebas, que divide las pruebas en tres capas principales: pruebas unitarias, pruebas de integración y pruebas de extremo a extremo (E2E). En Defold puedes separar las pruebas en colecciones específicas que se pueden cargar en el bootstrap. Por lo general, conviene comenzar con la comprobación más específica y rápida que pueda detectar el problema y, después, añadir pruebas de runtime o de plataforma cuando sea necesario.
| Nivel | Evidencia adecuada |
|---|---|
| Validación estática | Parser, formateador, validador de recursos o comparación de archivos generados |
| Prueba de módulo | Resultados de aserciones para lógica Lua reutilizable con dependencias mínimas del motor |
| Colección en ejecución | Mensajes, componentes, input, físicas, ciclo de vida y comportamiento del motor |
| Automatización de runtime | Estado activo de la escena, input inyectado, estado de la aplicación y capturas de pantalla del runtime |
| Prueba de navegador HTML5 | Input del canvas, integración con el navegador, comportamiento del viewport y salida web |
| Prueba de plataforma | Comportamiento y renderizado de la plataforma objetivo real |
| Build y bundle | Estado de salida de Bob, informe de build, archivo y artefactos del bundle |
Una compilación correcta demuestra que el proyecto compila, pero no que el comportamiento del juego sea correcto. Una captura de pantalla no demuestra transiciones, animaciones, interacciones o flujos de juego complejos, pero las soluciones multimodales modernas pueden utilizarla para inspeccionar el aspecto de un fotograma y comprobar si los shaders y el layout visual son correctos. No obstante, para las pruebas automatizadas debes preferir aserciones deterministas siempre que la condición pueda expresarse directamente.
Mantén la lógica reutilizable en módulos Lua con dependencias mínimas del motor. De este modo, las transformaciones de datos puras, reglas, máquinas de estados y cálculos se pueden probar sin construir un mundo de juego completo.
Separa el código que interactúa con el motor de la lógica que invoca. Un script puede convertir mensajes y el estado de componentes en llamadas a un módulo, mientras que las pruebas llaman al módulo directamente con entradas controladas.
Consulta el manual sobre cómo escribir código para obtener más detalles.
Utiliza una colección de pruebas específica cuando el comportamiento dependa de objetos de juego, componentes, mensajes, input, físicas u otros sistemas del motor.
Cada prueba debe:
Prefiere colecciones de pruebas aisladas. Un proyecto puede seleccionar una colección bootstrap de pruebas mediante una configuración temporal del proyecto en game.project:
[bootstrap]
main_collection = /test/test.collectionc
No dejes un bootstrap temporal de pruebas en la configuración normal del proyecto. En CI, es preferible pasar a Bob un archivo de configuración específico. CI no puede cambiar el estado del repositorio; solo debe realizar cambios temporales cuando sea necesario.
Para juegos complejos, puedes crear pequeñas colecciones de “salas de desarrollo” con escenarios predefinidos y blockouts sencillos. Estas colecciones hacen que las mecánicas sean reproducibles y facilitan las pruebas durante el desarrollo sin tener que recorrer estados y secciones del juego que no estén relacionados.
Los proyectos pueden implementar un pequeño ejecutor o utilizar una biblioteca de pruebas de la comunidad.
Por ejemplo, DefTest es una biblioteca de pruebas unitarias basada en Telescope. Permite utilizar suites, funciones de configuración y limpieza, aserciones, filtros por nombre, mocks de determinadas API de Defold y cobertura opcional mediante LuaCov. Las pruebas pueden ejecutarse desde una colección bootstrap específica, incluso en un bundle headless creado con Bob.
El resumen de la consola o del log de un framework puede resultar útil a los desarrolladores, pero un controlador automático desatendido necesita además un resultado de finalización explícito. Si es necesario, añade un pequeño adaptador alrededor del callback o resumen del framework para que el controlador procese con facilidad los resultados de las pruebas.
Una descripción sencilla de los resultados puede utilizar un prefijo único seguido de un objeto JSON en cada línea física de la consola:
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 recopilador debe procesar cada línea de manera independiente, encontrar el prefijo TEST, analizar el JSON que lo sigue e ignorar la salida del motor que no esté relacionada.
Incluye un identificador de ejecución único para que la salida de un proceso antiguo o simultáneo no pueda completar la ejecución actual. Cada suite debe emitir un único evento final inequívoco (como Pass, Failure, Crash, Timeout, etc.).
Cuando un juego se ejecuta desde el editor, este proporciona tanto el historial actual de la consola como un stream continuo. Cierra el stream después de recibir el evento de finalización de la suite correspondiente, la terminación del proceso o un error, o cuando se alcance un tiempo de espera o límite de líneas configurado.
Consulta más información en el manual de la API HTTP del editor.
Defold también puede guardar el log del juego si se activa Write Log File en game.project. Consulta Logs del juego y del sistema. Escribir el log en un archivo resulta útil para aplicaciones empaquetadas y para probar dispositivos objetivo en los que la consola del editor no está disponible.
El proyecto puede utilizar las funciones integradas print() y pprint(), o, por ejemplo, cualquier otra biblioteca de logging de nuestro Asset Portal.
Una API de automatización de runtime puede inspeccionar y controlar un motor de depuración activo. Se puede utilizar cuando las pruebas deben encontrar objetos de runtime, inyectar input, esperar a un estado visible o capturar el resultado renderizado.
Consulta el manual del servicio del motor para obtener más detalles.
El siguiente ejemplo utiliza la estructura del helper de Python de Automation Bridge. El proyecto debe incluir una versión compatible de la extensión de depuración, exponer un elemento con el id de automatización indicado y publicar el estado de aplicación 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()
Los estados definidos por la aplicación y los ids de automatización utilizan la API Lua opcional y exclusiva para depuración de Automation Bridge, que el proyecto debe activar y publicar. Una espera de duración fija es vulnerable a la velocidad de la máquina y a los tiempos de los fotogramas; realizar consultas limitadas hasta alcanzar un estado definido es más fiable.
Automation Bridge es una extensión, no forma parte del núcleo del motor. Consulta su referencia de la API de Python para conocer los selectores, esperas, estados, eventos, capturas de pantalla y diagnósticos de la versión instalada.
El editor puede crear y servir una build HTML5 mediante su comando build-html5 actual, como se describe en el manual de la API HTTP del editor. Bob también puede crear un bundle HTML5 sin el editor.
Las herramientas externas de automatización de navegadores como Playwright, Puppeteer, Selenium, WebdriverIO o Cypress pueden:
El input dirigido al canvas se procesa mediante los bindings de input y callbacks on_input() habituales del proyecto. Prueba tanto la respuesta del juego como los puntos de integración específicos del navegador.
El método más fiable consiste en exponer un bridge de pruebas de JavaScript explícito en el archivo index.html personalizado. En Defold, las builds HTML5 pueden ejecutar JavaScript mediante html5.run(), lo que permite comunicarse con dicho bridge del lado del navegador. Para los comandos que viajan desde JavaScript de vuelta a Defold, utiliza un bridge específico entre JavaScript y el motor.
Mantén las pruebas de navegador limitadas. Distingue en el informe final entre un error al cargar la página, la ausencia del canvas, un error de JavaScript, un tiempo de espera de la prueba y una aserción fallida del juego.
Es posible crear una captura de pantalla de los archivos de recursos en la vista de escena predeterminada del editor abierto o de un juego en runtime.
| Método | Propósito |
|---|---|
| Vista previa del editor | Layout de un recurso cargado, por ejemplo, un nivel o una GUI; composición de un atlas, inspección de un tilemap, composición estática de una escena, corrección del renderizado y los shaders del editor o creación de miniaturas para la documentación |
| Captura de pantalla del runtime | Estado renderizado de una build en ejecución en un escenario controlado |
Puedes utilizar la comparación de imágenes, por ejemplo, para pruebas de regresión. Cuando una comprobación falle, guarda la imagen de diferencias y las métricas de comparación.
Un modelo multimodal puede evaluar durante la inspección visual condiciones semánticas difíciles de expresar de otra forma, como texto recortado, controles superpuestos, estados de selección poco claros o contenido fuera de un área segura. Se recomienda tratar esa evaluación como una señal adicional con criterios explícitos, pero no como sustituto de comprobaciones lógicas deterministas ni de la comparación de imágenes.
Utiliza Bob, la herramienta de build mediante CLI, para procesos de CI independientes del editor.
Puedes utilizarla para resolver dependencias, crear una build del juego, un archivo o un bundle independiente y generar un informe JSON:
mkdir -p build/reports
java -jar bob.jar \
--root . \
--archive \
--build-report-json build/reports/build-report.json \
resolve build
Crea un bundle de pruebas headless con una configuración específica:
java -jar bob.jar \
--root . \
--settings test/test.settings \
--platform x86_64-linux \
--variant headless \
--archive \
--bundle-output build/test-bundle \
resolve build bundle
Ejecuta el archivo resultante con un controlador de procesos adecuado para la plataforma. Captura su estado de salida y sus logs, establece un tiempo de espera y exige el evento estructurado de finalización de la suite.
El manual de Bob describe las plataformas, los archivos de configuración, los bundles, las cachés, las extensiones nativas y los informes de build.
Los resultados adecuados de las pruebas deben conservar evidencias suficientes para reproducir y diagnosticar un fallo:
El mismo formato debe poder utilizarlo un desarrollador, un script local, un servicio de CI o un agente de programación con IA. Esto mantiene determinista la verificación incluso cuando se delega el diagnóstico o la reparación.