Laravel 11부터 laravel new로 프로젝트를 만들 때 Pest가 기본 테스트 프레임워크로 선택되게 되었습니다. PHPUnit은 오랜 세월 PHP의 표준 테스트 도구로서 사용되어 왔지만, Pest는 그 PHPUnit을 베이스로 하면서, 보다 간결하고 읽기 쉬운 테스트 표기법을 제공합니다.
Pest는 PHPUnit 상에서 동작하므로, 기존의 PHPUnit 테스트는 그대로 실행할 수 있습니다. 이관은 단계적으로 진행할 수 있습니다.
공식이 Pest를 채용한 배경에는 테스트를 작성할 때의 마찰을 줄인다는 목표가 있습니다. 클래스를 정의하고 메서드를 쓰는 의식적인 절차를 없애고, “테스트하고 싶은 것” 그 자체에 집중할 수 있는 표기법을 제공함으로써, 테스트를 쓰는 습관이 자연스럽게 몸에 배게 됩니다.
class AuthTest extends TestCase{ public function test_user_can_login(): void { $user = User::factory()->create(); $response = $this->post('/login', [ 'email' => $user->email, 'password' => 'password', ]); $response->assertRedirect('/dashboard'); }}
Pest의 test() 함수는 클로저를 받습니다. 클래스나 메서드의 정의가 불필요하므로, 테스트의 의도가 첫 줄부터 명확합니다. it()도 마찬가지로 사용할 수 있습니다. 영어로 쓰는 경우는 it('can login', ...)이라는 자연스러운 문장으로 읽을 수 있습니다.
PHPUnit의 setUp()에 해당하는 것이 beforeEach(), tearDown()에 해당하는 것이 afterEach()입니다.
beforeEach(function () { $this->user = User::factory()->create(); $this->actingAs($this->user);});test('인증된 사용자는 프로필에 접근할 수 있다', function () { $response = $this->get('/profile'); $response->assertOk();});test('인증된 사용자는 프로필을 갱신할 수 있다', function () { $response = $this->patch('/profile', ['name' => '새로운 이름']); $response->assertRedirect('/profile');});
Pest는 PHPUnit의 치환이 아니라, PHPUnit을 랩한 상위 레이어입니다. Laravel과의 통합도 깊고, 스타터 킷 생성 시부터 기본으로 선택되는 정도가 되어 있습니다. 기존 프로젝트로의 도입 비용은 낮고, 새 테스트부터 시험 삼아 시작하는 것만으로 혜택을 받을 수 있습니다.테스트를 쓰는 양이 늘면 버그의 발견이 빨라지고, 리팩토링에 대한 심리적 허들도 낮아집니다. Pest는 그 “테스트를 쓰는 것 자체의 마찰”을 줄이기 위한 도구입니다.
Pest 공식 문서
데이터셋, 커버리지, 병렬 실행 등 Pest의 모든 기능에 대해서는 공식 문서를 참고하세요.