게임 테스트하기(PHPUnit)
JumPHP 게임에는 PHPUnit 테스트를 둘 수 있어요. 점수 계산, 충돌, AI, 레벨 불러오기… 그리고 무엇보다 게임을 직접 플레이하는 테스트("패들이 위에서 아래로 움직인다")를 지켜볼 수 있어요. 플레이그라운드는 게시된 버전을 샌드박스에서 실행하고, 스튜디오에서 테스트별 결과와 각 게임 테스트의 영상을 보여 줘요.
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'); // 장면의 필드, 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($frames), wait($seconds), scene(), shot($name)(스크린샷)이 있어요. 테스트 이름은 문장처럼 지어 주세요(testTheBallBouncesOnThePaddle). 그러면 그렇게 표시돼요("The ball bounces on the paddle").
어디서든 플레이되는 모습을 볼 수 있어요.
- 내 컴퓨터에서:
bin/jumphp test <게임>이 테스트를 실행하고, Claude Code의 JumPHP 패널이 각 테스트를 실시간으로(게임 속도로) 보여 준 뒤 마지막 프레임을 보여 줘요. - 사이트에서: 플레이그라운드의 샌드박스가 창 없이 테스트를 플레이하고 각 테스트를 촬영해요(게임 프레임 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뒤마다 실행해요.
샌드박스
테스트는 플레이그라운드 서버에서 격리되어 실행돼요. PHP 8.5(브라우저의 엔진과 같아요), PHPUnit 11, 네트워크 없음, 권한 없는 사용자 계정, 최대 120초와 256 MB, 창과 소리 없음(SDL은 "빈 화면"으로 동작해요. 그래도 게임 테스트는 영상을 위해 매 프레임을 그려요). 게임의 비공개 파일은 없어요. 게임 소유자만 결과와 영상을 볼 수 있고(최근 5번의 실행 결과를 보관해요).