Skip to main content

시작하기

Laravel은 HTTP 요청을 시뮬레이트해 응답을 검증하기 위한 풍부한 API를 제공하고 있습니다. 실제 HTTP 서버를 세우지 않고 애플리케이션에의 요청을 테스트 내에서 재현할 수 있습니다.
get() 메서드는 애플리케이션에 GET 요청을 보내고, assertStatus()는 반환된 응답의 HTTP 스테이터스 코드를 검증합니다.
테스트 실행 중에는 CSRF 미들웨어가 자동으로 무효화됩니다. 테스트에서 명시적으로 무효화할 필요는 없습니다.

요청의 작성

테스트 내에서는 get, post, put, patch, delete 메서드를 사용해 요청을 보낼 수 있습니다. 이 메서드들은 네트워크 요청을 실제로는 발행하지 않고, 애플리케이션 내부에서 시뮬레이트합니다. 반환값은 Illuminate\Testing\TestResponse의 인스턴스이며, 다양한 어서션 메서드를 제공합니다.
하나의 테스트 메서드 내에서는 기본적으로 하나의 요청만 보내는 것을 권장합니다. 여러 요청을 동일 테스트 내에서 실행하면 예기치 못한 동작이 발생할 수 있습니다.

요청 헤더의 커스터마이즈

withHeaders() 메서드를 사용해 요청의 헤더를 커스터마이즈할 수 있습니다.

쿠키

withCookie() 또는 withCookies() 메서드로 요청 전에 쿠키 값을 설정할 수 있습니다.

세션과 인증

withSession() 메서드를 사용해 요청 전에 세션 데이터를 설정할 수 있습니다.
actingAs() 메서드로 인증 사용자로서 요청을 보낼 수 있습니다. 모델 팩토리와 조합해서 사용합니다.
actingAs()의 두 번째 인수에 가드 이름을 전달하면 그 가드로 인증됩니다. 테스트 중에는 그 가드가 기본이 됩니다.
미인증 상태로 요청하고 싶은 경우 actingAsGuest()를 사용합니다.

응답의 디버그

테스트 중에 응답의 내용을 확인하고 싶은 경우 dump, dumpHeaders, dumpSession 메서드를 사용합니다.
실행을 정지하고 싶은 경우 dd, ddHeaders, ddBody, ddJson, ddSession 메서드를 사용합니다.

예외의 테스트

특정 예외가 스로우됨을 테스트하려면 Exceptions 파사드를 사용합니다.
예외가 스로우되지 않았음을 확인하려면 assertNotReportedassertNothingReported를 사용합니다.
예외 핸들링을 무효화해 요청을 보내려면 withoutExceptionHandling()을 사용합니다.
클로저 내의 코드가 예외를 스로우하는지 테스트하려면 assertThrows()를 사용합니다.
예외가 스로우되지 않음을 확인하려면 assertDoesntThrow()를 사용합니다.

JSON API 의 테스트

Laravel은 JSON API의 테스트를 위한 헬퍼를 다수 제공하고 있습니다. json, getJson, postJson, putJson, patchJson, deleteJson, optionsJson 메서드를 사용해 JSON 요청을 보낼 수 있습니다.
JSON 응답의 데이터에는 배열 변수로 접근할 수 있습니다.
assertJson()은 응답을 배열로 변환해, 지정한 배열이 JSON 응답 안에 포함되어 있는지를 검증합니다. JSON에 다른 프로퍼티가 존재해도, 지정한 프래그먼트가 포함되어 있으면 테스트는 통과합니다.

완전 일치의 어서션

assertExactJson()을 사용하면 반환된 JSON과 지정한 배열이 완전히 일치함을 검증할 수 있습니다.

JSON 경로의 어서션

assertJsonPath()를 사용해 지정한 경로에 있는 데이터를 검증할 수 있습니다.
클로저를 전달해 더 유연하게 검증할 수도 있습니다.

플루언트한 JSON 테스트

assertJson()에 클로저를 전달하면 AssertableJson 인스턴스를 사용해 플루언트하게 어서션을 기술할 수 있습니다.
etc() 메서드는 어서션 대상 이외의 프로퍼티가 존재함을 허가합니다. etc()를 사용하지 않는 경우, 어서션하지 않은 프로퍼티가 존재하면 테스트가 실패합니다. 이에 따라 의도치 않게 기밀 정보를 응답에 포함시켜 버리는 것을 방지합니다.
속성의 존재·부재를 확인하려면 has()missing()을 사용합니다.
여러 속성을 함께 확인하려면 hasAll()이나 missingAll()을 사용합니다.

JSON 컬렉션의 어서션

라우트가 여러 아이템을 포함한 JSON 응답을 반환하는 경우, has() 메서드로 아이템 수나 컬렉션의 내용을 검증할 수 있습니다.
모든 아이템에 같은 어서션을 적용하려면 each()를 사용합니다.

JSON 의 타입 어서션

whereType()이나 whereAllType()을 사용해 프로퍼티의 타입을 검증할 수 있습니다.
| 문자로 여러 타입을 지정할 수도 있습니다. 어느 타입에라도 일치하면 어서션은 통과합니다.
이용 가능한 타입은 string, integer, double, boolean, array, null입니다.

인증 테스트

actingAs()를 사용해 인증된 사용자로서 요청을 보낼 수 있습니다.
특정 가드로 인증하려면 두 번째 인수에 가드 이름을 지정합니다.

사용자 등록 플로우의 테스트 예시

실제 사용자 등록 엔드포인트를 테스트하는 예시입니다.

세션의 테스트

withSession()으로 세션 데이터를 사전에 세팅해 요청을 보낼 수 있습니다. assertSessionHas()로 세션에 값이 존재하는지를 검증할 수 있습니다.

세션 어서션 목록

파일 업로드의 테스트

Illuminate\Http\UploadedFile 클래스의 fake() 메서드를 사용해 더미 파일이나 이미지를 생성할 수 있습니다. Storage 파사드의 fake() 메서드와 조합함으로써 파일 업로드를 간단히 테스트할 수 있습니다.
파일이 존재하지 않음을 확인하려면 assertMissing()을 사용합니다.

더미 파일의 커스터마이즈

이미지의 크기나 파일 크기를 지정할 수 있습니다. 밸리데이션 룰의 테스트에 편리합니다.

뷰의 테스트

HTTP 요청을 시뮬레이트하지 않고 뷰를 직접 렌더링해 테스트할 수 있습니다. view() 메서드는 뷰 이름과 옵션으로 데이터의 배열을 받아 Illuminate\Testing\TestView의 인스턴스를 반환합니다.
TestView 클래스에서는 다음의 어서션 메서드를 사용할 수 있습니다. 렌더링된 뷰의 내용을 문자열로 취득하려면 TestView 인스턴스를 문자열로 캐스트합니다.
밸리데이션 에러를 뷰에 전달하려면 withViewErrors()를 사용합니다.

컴포넌트의 테스트

blade() 메서드를 사용해 원시 Blade 템플릿 문자열을 렌더링할 수 있습니다.
component() 메서드를 사용해 Blade 컴포넌트를 렌더링할 수 있습니다. Illuminate\Testing\TestComponent의 인스턴스를 반환합니다.

응답 어서션 목록

Illuminate\Testing\TestResponse 클래스가 제공하는 주요 어서션 메서드입니다.

HTTP 스테이터스

리다이렉트

콘텐츠

JSON

헤더와 쿠키

밸리데이션

TDD 를 실천하기 위한 포인트

HTTP 테스트는 TDD(테스트 주도 개발)와 궁합이 발군입니다. 다음의 포인트를 의식하면 더 효과적입니다.
HTTP 테스트는 tests/Feature/ 디렉터리에 작성합니다. 애플리케이션 밖에서 본 동작(요청→응답)을 최초에 정의함으로써 구현해야 할 기능이 명확해집니다.
데이터베이스를 사용하는 테스트에서는 RefreshDatabase 트레이트를 사용합시다. 각 테스트 후에 데이터베이스가 리셋되어, 테스트 간의 데이터 간섭을 방지할 수 있습니다. 테스트의 독립성을 유지함으로써 실행 순서에 의존하지 않는 안정된 테스트 스위트를 구축할 수 있습니다.
User::factory()->create()와 같은 모델 팩토리를 사용하면 테스트 데이터의 작성이 간단해집니다. 특정 상태를 가진 모델을 작성하기 위해 팩토리의 상태(state)를 정의해 두면 테스트의 가독성이 향상됩니다.
하나의 테스트 메서드에서는 가급적 하나의 것을 검증합시다. 테스트가 실패했을 때 원인을 특정하기 쉬워집니다. “Arrange(준비) → Act(실행) → Assert(검증)“의 AAA 패턴을 의식하면 테스트가 읽기 쉬워집니다.
인증이 필요한 라우트에는 반드시 “인증 완료의 경우”와 “미인증의 경우” 양쪽의 테스트를 작성합시다. 보안 상의 문제를 조기에 발견할 수 있습니다.

관련 페이지

테스트 입문

Laravel에서의 테스트의 기본적인 작성법과 php artisan test의 사용법을 확인합니다.
마지막 수정일 2026년 7월 13일