Probar tu juego (PHPUnit)
Un juego JumPHP puede tener pruebas PHPUnit: el cálculo de la puntuación, las colisiones, la IA, la carga de un nivel… y sobre todo pruebas que juegan el juego («la pala va de arriba abajo») y que puedes ver jugar. El playground las ejecuta sobre la versión publicada, en un sandbox, y te muestra el resultado en el Studio, prueba por prueba, con la grabación de cada prueba de juego.
Cuando Claude desarrolla tu juego, escribe estas pruebas sobre la marcha: cada mecánica (un movimiento, un salto, un disparo, un bonus, un enemigo, el final de un nivel) tiene su prueba que la juega, ejecutada después de cada cambio. Las ves jugar en directo en el panel JumPHP y después las vuelves a ver grabadas en el Studio tras cada publicación.
Escribir una prueba
En la carpeta del juego, una carpeta tests/ con clases …Test.php (PHPUnit 11):
<?php
// tests/ScoreTest.php
namespace Tests;
use App\Entity\Score;
use PHPUnit\Framework\TestCase;
final class ScoreTest extends TestCase
{
public function testABrickIsWorthTenPoints(): void
{
$score = new Score();
$score->brick();
self::assertSame(10, $score->points());
}
}
El código del juego se carga como en el juego (los espacios de nombres de su composer.json, App\ → src/), con
el motor JumPHP de su versión. Tests\ → tests/. En tu ordenador, bin/jumphp test <juego> también las ejecuta
(junto con el resto de comprobaciones).
Pruebas que juegan el juego
Una prueba de juego hace jugar al juego, fotograma a fotograma, y luego comprueba lo que ha pasado: «la pala va de arriba
abajo», «la pelota rebota», «el salto vuelve a caer sobre la plataforma». Extiende JumPHP\Testing\GameTestCase:
<?php
namespace Tests;
use App\Entity\Paddle;
use App\Scene\PlayScene;
use JumPHP\Testing\GameTestCase;
final class PaddleTest extends GameTestCase
{
public function testThePaddleGoesFromTheTopToTheBottom(): void
{
$this->game->start(PlayScene::class, ['mode' => 'local']); // la escena, al instante
$paddle = $this->game->peek('left'); // un campo de la escena, aunque sea privado
$this->game->hold('p1_up', 60); // la tecla mantenida 60 fotogramas (1 s)
self::assertEqualsWithDelta(PlayScene::TOP, $paddle->getBoundingBox()['y'], 1);
$this->game->hold('p1_down', 90);
self::assertEqualsWithDelta(PlayScene::BOTTOM - Paddle::HEIGHT, $paddle->getBoundingBox()['y'], 1);
}
}
También: press($action), run($frames), wait($seconds), scene(), shot($name) (una captura). Nombra las
pruebas como frases (testTheBallBouncesOnThePaddle): se muestran así («The ball bounces on the
paddle»).
Se pueden ver jugar, en todas partes:
- en tu ordenador:
bin/jumphp test <juego>las ejecuta, y el panel JumPHP de Claude Code muestra cada prueba en directo (a la velocidad del juego) y después su último fotograma; - en el sitio: el sandbox del playground las juega sin ventana y graba cada prueba (un fotograma de cada 4 del juego). La página de pruebas del Studio las muestra mientras se ejecutan y luego las reproduce en bucle: ▶ / ⏸, un control deslizante para ir fotograma a fotograma, un clic para abrir la imagen en grande.
Estas pruebas necesitan JumPHP\Testing (JumPHP 0.2.1 o posterior): un juego en 0.2.0 se prueba en el sitio con el
motor más reciente, y la salida lo indica. En tu ordenador, bin/jumphp update actualiza JumPHP.
Ejecutarlas
- Studio → tu proyecto → Pruebas (PHPUnit) → «▶ Ejecutar las pruebas»: la página se actualiza sola (las grabaciones de las pruebas de juego aparecen mientras se ejecutan) y después muestra cada prueba (✔ / ✘ y el mensaje de fallo), la grabación de cada prueba de juego y la salida completa de PHPUnit.
- Tu Claude:
run_testsy despuésget_test_run(servidor MCP), por ejemplo tras cadasync_project.
El sandbox
Las pruebas se ejecutan en el servidor del playground, aisladas: PHP 8.5 (como el motor en el navegador), PHPUnit 11, sin red, con un usuario sin privilegios, 120 segundos y 256 MB como máximo, sin ventana ni sonido (SDL funciona «en vacío»: las pruebas de juego dibujan igualmente cada fotograma, para la grabación). Los archivos privados del juego no están allí. Solo el propietario del juego ve los resultados y las grabaciones (se conservan los de las 5 últimas ejecuciones).