UK

Тестування вашої гри (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 останніх запусків).