测试你的游戏(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 <游戏> 也会运行它们(连同其他检查)。
会玩游戏的测试
游戏测试会让游戏一帧一帧地运行,然后检查发生了什么:“球拍从顶端移动到底端”、“球会反弹”、“跳起后落回平台上”。它继承 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 <游戏>会运行它们,Claude Code 的 JumPHP 面板会实时显示每个测试(按游戏的速度),并显示它的最后一帧; - 在网站上:playground 的沙盒会在没有窗口的情况下运行它们,并为每个测试录像(游戏每 4 帧取一帧)。工作室的测试页面会在测试运行时展示它们,之后循环回放:▶ / ⏸,用滑块逐帧查看,点击一下可放大图像。
这些测试需要 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 次运行的结果)。