Je game testen (PHPUnit)
Een JumPHP-game kan PHPUnit-tests hebben: de scoreberekening, de botsingen, de AI, het laden van een level… en vooral tests die de game spelen (“het batje gaat van boven naar beneden”) en die je kunt zien spelen. De playground laat ze draaien op de gepubliceerde versie, in een sandbox, en toont je het resultaat in de Studio, test voor test, met de film van elke gametest.
Wanneer Claude je game ontwikkelt, schrijft hij deze tests gaandeweg: elke mechaniek (een beweging, een sprong, een schot, een bonus, een vijand, het einde van een level) heeft zijn test die haar speelt, na elke wijziging uitgevoerd. Je ziet ze live spelen in het JumPHP-paneel en bekijkt ze daarna gefilmd terug in de Studio na elke publicatie.
Een test schrijven
In de map van de game een map tests/ met klassen …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());
}
}
De code van de game wordt geladen zoals in de game (de namespaces van zijn composer.json, App\ → src/), met
de JumPHP-engine van zijn versie. Tests\ → tests/. Op je computer start bin/jumphp test <game> ze
ook (samen met de rest van de controles).
Tests die de game spelen
Een gametest laat de game spelen, beeld voor beeld, en controleert daarna wat er is gebeurd: “het batje gaat van boven
naar beneden”, “de bal kaatst terug”, “de sprong landt weer op het platform”. Hij breidt JumPHP\Testing\GameTestCase uit:
<?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']); // de scène, meteen
$paddle = $this->game->peek('left'); // een veld van de scène, ook als het privé is
$this->game->hold('p1_up', 60); // de toets 60 beelden ingedrukt (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);
}
}
Ook: press($action), run($beelden), wait($seconden), scene(), shot($naam) (een screenshot). Geef
tests de naam van een zin (testTheBallBouncesOnThePaddle): zo worden ze getoond (“The ball bounces on the
paddle”).
Je ziet ze overal spelen:
- op je computer:
bin/jumphp test <game>start ze en het JumPHP-paneel van Claude Code toont elke test live (op de snelheid van de game), en daarna zijn laatste beeld; - op de site: de sandbox van de playground speelt ze zonder venster en filmt elke test (elk 4e beeld van de game). De testpagina van de Studio toont ze terwijl ze draaien en speelt ze daarna in een lus af: ▶ / ⏸, een schuifbalk om beeld voor beeld te gaan, een klik om het beeld groot te openen.
Deze tests hebben JumPHP\Testing nodig (JumPHP 0.2.1 of nieuwer): een game op 0.2.0 wordt op de site getest met de
nieuwste engine en de uitvoer zegt dat. Op je computer werkt bin/jumphp update JumPHP bij.
Ze starten
- Studio → je project → Tests (PHPUnit) → “▶ Tests uitvoeren”: de pagina wordt vanzelf bijgewerkt (de films van de gametests verschijnen terwijl ze draaien) en toont daarna elke test (✔ / ✘ en de foutmelding), de film van elke gametest en de volledige uitvoer van PHPUnit.
- Je Claude:
run_testsen daarnaget_test_run(MCP-server), bijvoorbeeld na elkesync_project.
De sandbox
De tests draaien op de server van de playground, geïsoleerd: PHP 8.5 (zoals de engine in de browser), PHPUnit 11, zonder netwerk, onder een gebruiker zonder rechten, maximaal 120 seconden en 256 MB, zonder venster en geluid (SDL draait “blind”: de gametests tekenen toch elk beeld, voor de film). De privébestanden van de game zijn er niet. Alleen de eigenaar van de game ziet de resultaten en de films (die van de laatste 5 runs worden bewaard).