IT

Testare il proprio gioco (PHPUnit)

Un gioco JumPHP può avere dei test PHPUnit: il calcolo del punteggio, le collisioni, l'IA, il caricamento di un livello… e soprattutto dei test che giocano il gioco («la racchetta va dall'alto in basso») che si guardano giocare. Il playground li fa girare sulla versione pubblicata, in una sandbox, e ti mostra il risultato nello Studio, test per test, con il film di ogni test di gioco.

Quando Claude sviluppa il tuo gioco, scrive questi test man mano: ogni meccanica (uno spostamento, un salto, uno sparo, un bonus, un nemico, la fine di un livello) ha il suo test che la gioca, avviato dopo ogni modifica. Li vedi giocare in diretta nel pannello JumPHP, poi li rivedi filmati nello Studio dopo ogni pubblicazione.

Scrivere un test

Nella cartella del gioco, una cartella tests/ con classi …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());
    }
}

Il codice del gioco viene caricato come nel gioco (i namespace del suo composer.json, App\ → src/), con il motore JumPHP della sua versione. Tests\ → tests/. Sul tuo computer, bin/jumphp test <gioco> li avvia anch'esso (insieme al resto dei controlli).

Test che giocano il gioco

Un test di gioco fa giocare il gioco, fotogramma per fotogramma, poi verifica cosa è successo: «la racchetta va dall'alto in basso», «la palla rimbalza», «il salto ricade sulla piattaforma». Estende 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 scena, subito
        $paddle = $this->game->peek('left');                       // un campo della scena, anche privato
        $this->game->hold('p1_up', 60);                            // il tasto tenuto premuto per 60 fotogrammi (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);
    }
}

Inoltre: press($action), run($frames), wait($seconds), scene(), shot($name) (uno screenshot). Dai ai test nomi da frase (testTheBallBouncesOnThePaddle): vengono mostrati così («The ball bounces on the paddle»).

Li si guarda giocare, ovunque:

  • sul tuo computer: bin/jumphp test <gioco> li avvia, e il pannello JumPHP di Claude Code mostra ogni test in diretta (alla velocità del gioco), poi il suo ultimo fotogramma;
  • sul sito: la sandbox del playground li gioca senza finestra e filma ogni test (un fotogramma ogni 4 del gioco). La pagina dei test dello Studio li mostra mentre girano, poi li riproduce in loop: ▶ / ⏸, un cursore per andare fotogramma per fotogramma, un clic per aprire l'immagine in grande.

Questi test hanno bisogno di JumPHP\Testing (JumPHP 0.2.1 o successivo): un gioco in 0.2.0 viene testato sul sito con il motore più recente, e l'output lo dice. Sul tuo computer, bin/jumphp update aggiorna JumPHP.

Avviarli

  • Studio → il tuo progetto → Test (PHPUnit) → «Avvia i test»: la pagina si aggiorna da sola (i film dei test di gioco compaiono mentre girano), poi mostra ogni test (✔ / ✘ e il messaggio di fallimento), il film di ogni test di gioco e l'output completo di PHPUnit.
  • Il tuo Claude: run_tests poi get_test_run (server MCP), per esempio dopo ogni sync_project.

La sandbox

I test girano sul server del playground, isolati: PHP 8.5 (come il motore nel browser), PHPUnit 11, senza rete, con un utente senza privilegi, al massimo 120 secondi e 256 MB, senza finestra né suono (SDL gira «a vuoto»: i test di gioco disegnano comunque ogni fotogramma, per il film). I file privati del gioco non ci sono. Solo il proprietario del gioco vede i risultati e i film (quelli delle ultime 5 esecuzioni vengono conservati).