Testowanie gry (PHPUnit)
Gra JumPHP może mieć testy PHPUnit: liczenie wyniku, kolizje, SI, wczytywanie poziomu… a przede wszystkim testy, które grają w grę („paletka przesuwa się z góry na dół”), na których grę można obejrzeć. Playground uruchamia je na opublikowanej wersji, w piaskownicy, i pokazuje wynik w Studiu, test po teście, razem z nagraniem każdego testu gry.
Gdy Claude tworzy twoją grę, pisze te testy na bieżąco: każda mechanika (ruch, skok, strzał, bonus, wróg, koniec poziomu) ma swój test, który ją odgrywa i jest uruchamiany po każdej zmianie. Oglądasz je na żywo w panelu JumPHP, a po każdej publikacji oglądasz je ponownie, nagrane, w Studiu.
Pisanie testu
W folderze gry folder tests/ z klasami …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());
}
}
Kod gry jest wczytywany tak jak w grze (przestrzenie nazw z jej composer.json, App\ → src/), z silnikiem JumPHP w jej wersji. Tests\ → tests/. Na twoim komputerze bin/jumphp test <gra> też je uruchamia (razem z resztą sprawdzeń).
Testy, które grają w grę
Test gry odgrywa grę klatka po klatce, a potem sprawdza, co się stało: „paletka przesuwa się z góry na dół”, „piłka się odbija”, „skok ląduje na platformie”. Dziedziczy po 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']); // scena, od razu
$paddle = $this->game->peek('left'); // pole sceny, nawet prywatne
$this->game->hold('p1_up', 60); // klawisz przytrzymany 60 klatek (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);
}
}
Dostępne są także: press($action), run($images), wait($secondes), scene(), shot($nom) (zrzut ekranu). Nazywaj testy jak zdania (testTheBallBouncesOnThePaddle): tak właśnie się wyświetlają („The ball bounces on the paddle”).
Można je oglądać wszędzie:
- na twoim komputerze:
bin/jumphp test <gra>je uruchamia, a panel JumPHP w Claude Code pokazuje każdy test na żywo (w tempie gry), a potem jego ostatnią klatkę; - na stronie: piaskownica playgroundu odgrywa je bez okna i nagrywa każdy test (jedna klatka co 4 klatki gry). Strona testów w Studiu pokazuje je w trakcie działania, a potem odtwarza w pętli: ▶ / ⏸, suwak do przechodzenia klatka po klatce, kliknięcie otwiera klatkę w powiększeniu.
Te testy wymagają JumPHP\Testing (JumPHP 0.2.1 lub nowszy): gra w wersji 0.2.0 jest testowana na stronie najnowszym silnikiem, a wynik o tym informuje. Na twoim komputerze bin/jumphp update aktualizuje JumPHP.
Uruchamianie
- Studio → twój projekt → Testy (PHPUnit) → „▶ Uruchom testy”: strona aktualizuje się sama (nagrania testów gry pojawiają się w trakcie ich działania), a potem pokazuje każdy test (✔ / ✘ i komunikat o niepowodzeniu), nagranie każdego testu gry i pełny wynik PHPUnit.
- Twój Claude:
run_tests, a potemget_test_run(serwer MCP), na przykład po każdymsync_project.
Piaskownica
Testy działają na serwerze playgroundu, w izolacji: PHP 8.5 (jak silnik w przeglądarce), PHPUnit 11, bez sieci, jako użytkownik bez uprawnień, maks. 120 sekund i 256 MB, bez okna i dźwięku (SDL działa „na sucho”: testy gry i tak rysują każdą klatkę, na potrzeby nagrania). Prywatnych plików gry tam nie ma. Wyniki i nagrania widzi tylko właściciel gry (przechowywane są nagrania z 5 ostatnich uruchomień).