Тестування вашої гри (PHPUnit)
Гра JumPHP може мати тести PHPUnit: підрахунок рахунку, зіткнення, ШІ, завантаження рівня… і насамперед тести, що грають у гру («ракетка рухається згори донизу»), за якими можна спостерігати. Playground запускає їх на опублікованій версії, у пісочниці, і показує вам результат у Studio, тест за тестом, з відео кожного ігрового тесту.
Коли Claude розробляє вашу гру, він пише ці тести поступово: у кожної механіки (рух, стрибок, постріл, бонус, ворог, завершення рівня) є свій тест, що її відтворює, і він запускається після кожної зміни. Ви бачите, як вони грають наживо, у панелі JumPHP, а потім переглядаєте їх на відео в Studio після кожної публікації.
Написати тест
У теці гри — тека tests/ із класами …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());
}
}
Код гри завантажується так само, як у грі (простори імен з її composer.json, App\ → src/), з
рушієм JumPHP її версії. Tests\ → tests/. На вашому комп'ютері bin/jumphp test <гра> також їх запускає
(разом з рештою перевірок).
Тести, що грають у гру
Ігровий тест запускає гру кадр за кадром, а потім перевіряє, що сталося: «ракетка рухається згори
донизу», «м'яч відскакує», «стрибок приземляється на платформу». Він розширює 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']); // сцена, одразу
$paddle = $this->game->peek('left'); // поле сцени, навіть приватне
$this->game->hold('p1_up', 60); // клавіша утримується 60 кадрів (1 с)
self::assertEqualsWithDelta(PlayScene::TOP, $paddle->getBoundingBox()['y'], 1);
$this->game->hold('p1_down', 90);
self::assertEqualsWithDelta(PlayScene::BOTTOM - Paddle::HEIGHT, $paddle->getBoundingBox()['y'], 1);
}
}
Також: press($action), run($images), wait($secondes), scene(), shot($nom) (скриншот). Називайте
тести як речення (testTheBallBouncesOnThePaddle): вони відображаються саме так («The ball bounces on the
paddle»).
За ними можна спостерігати скрізь:
- на вашому комп'ютері:
bin/jumphp test <гра>їх запускає, а панель JumPHP для Claude Code показує кожен тест наживо (зі швидкістю гри), а потім його останній кадр; - на сайті: пісочниця playground програє їх без вікна та знімає кожен тест на відео (один кадр із кожних 4 кадрів гри). Сторінка тестів у Studio показує їх, поки вони виконуються, а потім відтворює їх по колу: ▶ / ⏸, повзунок, щоб іти кадр за кадром, клацання, щоб відкрити кадр у великому розмірі.
Ці тести потребують JumPHP\Testing (JumPHP 0.2.1 або новіший): гра на 0.2.0 тестується на сайті з
найновішим рушієм, і вивід про це повідомляє. На вашому комп'ютері bin/jumphp update оновлює JumPHP.
Запуск
- Studio → ваш проєкт → Тести (PHPUnit) → «▶ Запустити тести»: сторінка оновлюється сама (відео ігрових тестів з'являються, поки вони виконуються), потім показує кожен тест (✔ / ✘ і повідомлення про збій), відео кожного ігрового тесту та повний вивід PHPUnit.
- Ваш Claude:
run_tests, потімget_test_run(MCP-сервер), наприклад після кожногоsync_project.
Пісочниця
Тести виконуються на сервері playground, ізольовано: PHP 8.5 (як рушій у браузері), PHPUnit 11, без мережі, від імені користувача без прав, не більше 120 секунд і 256 МБ, без вікна і звуку (SDL працює «наосліп»: ігрові тести все одно малюють кожен кадр для відео). Приватних файлів гри там немає. Результати та відео бачить лише власник гри (зберігаються результати 5 останніх запусків).