JA

ゲームをテストする(PHPUnit)

JumPHPのゲームには、PHPUnitのテストを付けられます:スコアの計算、衝突判定、AI、レベルの読み込みなど。そして何より、ゲームをプレイするテスト(「パドルが上から下まで動く」)を作れば、それをプレイする様子を見られます。playgroundは、公開されているバージョンに対して、サンドボックスの中でテストを実行し、スタジオに結果をテストごとに、ゲームテストの録画つきで表示します。

Claudeがゲームを開発するときは、これらのテストを書きながら作ります。メカニクス(移動、ジャンプ、射撃、ボーナス、敵、レベルの終わり)ごとに、それをプレイするテストがあり、変更のたびに実行されます。テストがプレイされる様子はJumPHPパネルでリアルタイムに見られ、公開のたびに、スタジオで録画を見直せます。

テストを書く

ゲームのフォルダに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 <ゲーム>で実行できます(ほかの検査と一緒に実行されます)。

ゲームをプレイするテスト

ゲームテストは、ゲームを1フレームずつプレイさせ、何が起きたかを検証します:「パドルが上から下まで動く」「ボールが跳ね返る」「ジャンプしてプラットフォームに着地する」。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');                       // シーンのフィールド(privateでも可)
        $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 <ゲーム>で実行でき、Claude CodeのJumPHPパネルが各テストをリアルタイムで(ゲームの速度で)表示し、最後のフレームも見せてくれます。
  • サイト上で:playgroundのサンドボックスは、ウィンドウなしでテストをプレイし、各テストを録画します(ゲームの4フレームごとに1枚)。スタジオのテストページは、実行中のテストを表示し、そのあとループ再生します:▶ / ⏸、フレーム単位で進められるスライダー、クリックで画像を拡大。

これらのテストにはJumPHP\Testing(JumPHP 0.2.1以降)が必要です。0.2.0のゲームは、サイト上では最新のエンジンでテストされ、出力にもその旨が表示されます。お使いのコンピューターでは、bin/jumphp updateでJumPHPを更新できます。

実行する

  • スタジオ → あなたのプロジェクト → テスト(PHPUnit) → 「▶ テストを実行」:ページは自動的に更新されます(ゲームテストの録画は、実行中に表示されます)。実行後は、各テスト(✔ / ✘と失敗メッセージ)、各ゲームテストの録画、PHPUnitの完全な出力が表示されます。
  • あなたのClaude:run_testsのあとget_test_run(MCPサーバー)。たとえばsync_projectのたびに実行します。

サンドボックス

テストは、playgroundのサーバー上の隔離された環境で動きます:PHP 8.5(ブラウザ内のエンジンと同じ)、PHPUnit 11、ネットワークなし、権限のないユーザー、最大120秒と256 MB、ウィンドウもサウンドもなし(SDLは「空回し」で動きます。それでもゲームテストは、録画のために各フレームを描画します)。ゲームの非公開ファイルは含まれません。結果と録画を見られるのはゲームの持ち主だけです(直近5回分の実行が保存されます)。