HTTP 테스트
시작하기
라라벨은 애플리케이션에 HTTP request-요청을 하고, 결과를 검사하는데 사용할 수 있는, 유연한 API를 제공합니다. 다음에 정의된 피쳐 테스트 예제를 살펴보겠습니다.
<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Tests\TestCase;
class ExampleTest extends TestCase
{
/**
* A basic test example.
*
* @return void
*/
public function testBasicTest()
{
$response = $this->get('/');
$response->assertStatus(200);
}
}
get
메소드는 애플리케이션에 GET
request-요청을 만들고, assertStatus
메소드는 반환된 response-응답이 주어진 HTTP 상태 코드와 일치하는지 확인합니다. 간단한 테스트에 더해, 라라벨은 response의 헤더값, 컨텐츠, JSON 구조 및 기타 확인을 할 수 있는 기능을 제공합니다.
요청-Request 헤더 커스터마이징하기
withHeaders
메소드를 사용하여 요청-requestr가 애플리케이션에 전달되기 전에 헤더를 커스터마이징 할 수 있습니다. 이를 통해 요청-request에 커스텀 헤더를 추가 할 수 있습니다.
<?php
class ExampleTest extends TestCase
{
/**
* A basic functional test example.
*
* @return void
*/
public function testBasicExample()
{
$response = $this->withHeaders([
'X-Header' => 'Value',
])->json('POST', '/user', ['name' => 'Sally']);
$response
->assertStatus(201)
->assertJson([
'created' => true,
]);
}
}
{tip} 테스트가 실행되는 동안 CSRF 미들웨어는 자동으로 비활성화 됩니다.
쿠키
withCookie
또는 withCookies
메소드를 사용하여 요청하기 전에 쿠키 값을 설정할 수 있습니다. withCookie
메소드는 쿠키 이름과 값을 두 개의 인수로 받아들이고withCookies
메소드는 이름 / 값 쌍의 배열을받습니다.
<?php
class ExampleTest extends TestCase
{
public function testCookies()
{
$response = $this->withCookie('color', 'blue')->get('/');
$response = $this->withCookies([
'color' => 'blue',
'name' => 'Taylor',
])->get('/');
}
}
응답 디버깅
애플리케이션에 테스트 요청을 한 후에는 dump
, dumpHeaders
및 dumpSession
메소드를 사용하여 응답 내용을 검사하고 디버그 할 수 있습니다.
<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Tests\TestCase;
class ExampleTest extends TestCase
{
/**
* A basic test example.
*
* @return void
*/
public function testBasicTest()
{
$response = $this->get('/');
$response->dumpHeaders();
$response->dumpSession();
$response->dump();
}
}
세션 / 인증
라라벨은 HTTP 테스팅 중 세션 작업을 하는 데 필요한 여러 헬퍼 메소드를 제공합니다. 먼저, withSession
메소드를 이용하여 주어진 배열을 세션 데이터로 설정할 수 있습니다. 이것은 애플리케이션에 response-응답을 전달하기 전에 데이터를 세션에 로드하는 경우에 유용합니다.
<?php
class ExampleTest extends TestCase
{
public function testApplication()
{
$response = $this->withSession(['foo' => 'bar'])
->get('/');
}
}
일반적인 세션의 이용법 중 하나는 인증된 사용자를 위해서 상태를 유지하는 것입니다. actingAs
헬퍼 메소드는 특정 사용자를 현재 사용자로 인증하는 단순한 방법을 제공합니다. 예를 들어, 사용자를 생성하고 인증하기 위해 model factory를 사용할 수 있습니다.
<?php
use App\User;
class ExampleTest extends TestCase
{
public function testApplication()
{
$user = factory(User::class)->create();
$response = $this->actingAs($user)
->withSession(['foo' => 'bar'])
->get('/');
}
}
또한 actingAs
메소드의 두 번째 인자로 주어진 사용자에 대한 인증에 어떤 guard를 사용해야 하는지 지정하도록 guard 이름을 전달 할 수도 있습니다.
$this->actingAs($user, 'api')
JSON API 테스팅하기
라라벨은 또한 JSON API와 그 결과를 테스트하기 위해 여러 헬퍼들을 제공합니다. 예를 들어, json
, getJson
, postJson
, putJson
, patchJson
, deleteJson
, 그리고 optionsJson
메소드들을 이용하여 다양한 HTTP verb를 가진 request-요청을 할 수 있습니다. 이 메소드들에 손쉽게 데이터와 헤더를 전달할 수도 있습니다. 이를 위해 /user
에 POST
request-요청을 하고 원하는 데이터가 반환되는지 확인하는 테스트를 작성해보겠습니다.
<?php
class ExampleTest extends TestCase
{
/**
* A basic functional test example.
*
* @return void
*/
public function testBasicExample()
{
$response = $this->postJson('/user', ['name' => 'Sally']);
$response
->assertStatus(201)
->assertJson([
'created' => true,
]);
}
}
{tip}
assertJson
메소드는 response-응답을 배열로 변환하고PHPUnit::assertArraySubset
을 사용하여 애플리케이션에서 반환된 JSON 배열 안에 주어진 내용이 존재하는지 확인합니다. 따라서 JSON response-응답에 다른 속성이 있더라도, 주어진 내용이 존재하면 테스트는 통과합니다.
덧붙여 말하자면, JSON 응답 데이터는 응답(response)에서 배열의 변수들을 통해 접근이 가능합니다.
$this->assertTrue($response['created']);
JSON이 정확하게 일치하는지 확인하기
주어진 배열이 반환된 JSON과 정확히 일치하는지 확인하고자 한다면, assertExactJson
메소드를 사용하면 됩니다.
<?php
class ExampleTest extends TestCase
{
/**
* A basic functional test example.
*
* @return void
*/
public function testBasicExample()
{
$response = $this->json('POST', '/user', ['name' => 'Sally']);
$response
->assertStatus(201)
->assertExactJson([
'created' => true,
]);
}
}
JSON Path 검증하기
JSON 응답에 지정된 경로에 지정된 데이터가 포함되어 있는지 확인하려면 assertJsonPath
메소드를 사용해야합니다.
<?php
class ExampleTest extends TestCase
{
/**
* A basic functional test example.
*
* @return void
*/
public function testBasicExample()
{
$response = $this->json('POST', '/user', ['name' => 'Sally']);
$response
->assertStatus(201)
->assertJsonPath('team.owner.name', 'foo')
}
}
파일 업로드 테스트하기
Illuminate\Http\UploadedFile
클래스는 테스트를 위해서 더미 파일 또는 이미지를 생성하는 fake
메소드를 제공합니다. 이는 Storage
파사드의 fake
메소드와 함께 파일 업로드 테스팅을 간단하게 해줍니다. 예를 들어, 이 두기능을 통해서 프로필 이미지 업로드 폼을 손쉽게 테스트 할 수 있습니다.
<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Tests\TestCase;
class ExampleTest extends TestCase
{
public function testAvatarUpload()
{
Storage::fake('avatars');
$file = UploadedFile::fake()->image('avatar.jpg');
$response = $this->json('POST', '/avatar', [
'avatar' => $file,
]);
// Assert the file was stored...
Storage::disk('avatars')->assertExists($file->hashName());
// Assert a file does not exist...
Storage::disk('avatars')->assertMissing('missing.jpg');
}
}
Fake 파일 커스터마이징
fake
메소드를 사용하여 파일을 생성할 때, 유효성 검사 테스트를 위해서 파일의 가로, 세로 및 파일 사이즈를 지정할 수 있습니다.
UploadedFile::fake()->image('avatar.jpg', $width, $height)->size(100);
이미지 타입 뿐만 아니라 create
메소드를 사용하여 다른 타입들의 파일도 생성할 수 있습니다.
UploadedFile::fake()->create('document.pdf', $sizeInKilobytes);
필요한 경우, 파일에 의해 반환되어야하는 MIME 유형을 명시적으로 정의하기 위해 메소드에 $mimeType
인수를 전달할 수 있습니다.
UploadedFile::fake()->create('document.pdf', $sizeInKilobytes, 'application/pdf');
사용 가능한 Assertions
응답-response Assertions
라라벨은 PHPUnit 피쳐 테스트를 위해 다양한 커스텀 assertion 메소드를 제공합니다. 이러한 assertions 은 json
, get
, post
, put
, 그리고 delete
테스트 메소드에서 반환된 response-응답에 엑세스 할 수 있습니다.
- assertCookie
- assertCookieExpired
- assertCookieNotExpired
- assertCookieMissing
- assertCreated
- assertDontSee
- assertDontSeeText
- assertExactJson
- assertForbidden
- assertHeader
- assertHeaderMissing
- assertJson
- assertJsonCount
- assertJsonFragment
- assertJsonMissing
- assertJsonMissingExact
- assertJsonMissingValidationErrors
- assertJsonPath
- assertJsonStructure
- assertJsonValidationErrors
- assertLocation
- assertNotFound
- assertOk
- assertPlainCookie
- assertRedirect
- assertSee
- assertSeeInOrder
- assertSeeText
- assertSeeTextInOrder
- assertSessionHas
- assertSessionHasInput
- assertSessionHasAll
- assertSessionHasErrors
- assertSessionHasErrorsIn
- assertSessionHasNoErrors
- assertSessionDoesntHaveErrors
- assertSessionMissing
- assertStatus
- assertSuccessful
- assertUnauthorized
- assertViewHas
- assertViewHasAll
- assertViewIs
- assertViewMissing
assertCookie
response-응답에서 주어진 쿠키가 포함되어 있는지 확인:
$response->assertCookie($cookieName, $value = null);
assertCookieExpired
response-응답에서 주어진 쿠키가 기간이 만료되었는지 확인:
$response->assertCookieExpired($cookieName);
assertCookieNotExpired
response-응답에서 주어진 쿠키가 기간이 만료되지 않은 것을 확인:
$response->assertCookieNotExpired($cookieName);
assertCookieMissing
response-응답에서 주어진 쿠키를 포함하고 있지 않은 것을 확인:
$response->assertCookieMissing($cookieName);
assertCreated
response-응답에 201 상태 코드가 있는 지 확인:
$response->assertCreated();
assertDontSee
response-응답에 주어진 문자열이 포함되어 있지 않은 것을 확인. 이 테스트는 두번째 인자값으로 false
를 지정하지 않는 한, 자동으로 주어진 문자열을 노출시킵니다.
$response->assertDontSee($value, $escaped = true);
assertDontSeeText
response-응답 텍스트에 주어진 문자열이 포함되어 있지 않은 것을 확인. 이 테스트는 두번째 인자값으로 false
를 지정하지 않는 한, 자동으로 주어진 문자열을 노출시킵니다.
$response->assertDontSeeText($value, $escaped = true);
assertExactJson
response-응답에 주어진 JSON 데이터가 정확하게 일치하게 포함되어 있는지 확인:
$response->assertExactJson(array $data);
assertForbidden
response-응답이 forbidden(403) 상태코드를 가지고 있는지 확인:
$response->assertForbidden();
assertHeader
response-응답에서 주어진 헤더가 존재하는지 확인:
$response->assertHeader($headerName, $value = null);
assertHeaderMissing
response-응답에서 주어진 헤더가 존재하는 않는 것을 확인:
$response->assertHeaderMissing($headerName);
assertJson
response-응답에 주어진 JSON 데이터가 포함되어 있는지 확인:
$response->assertJson(array $data, $strict = false);
assertJsonCount
response-응답 JSON 에 주어진 키에 해당되는 아이템 숫자의 배열을 가지고 있는지 확인:
$response->assertJsonCount($count, $key = null);
assertJsonFragment
response-응답에 주어진 JSON 내용이 포함되어 있는지 확인:
$response->assertJsonFragment(array $data);
assertJsonMissing
response-응답에 주어진 JSON 내용이 포함되어 있지 않은 것을 확인:
$response->assertJsonMissing(array $data);
assertJsonMissingExact
response-응답에 주어진 JSON 내용이 정확하게 포함되어 있지 않은 것을 확인:
$response->assertJsonMissingExact(array $data);
assertJsonMissingValidationErrors
response-응답에 주어진키에 대한 JSON 유효성 검사 에러가 포함되어 있지 않은 것을 확인:
$response->assertJsonMissingValidationErrors($keys);
assertJsonStructure
response-응답이 주어진 JOSN 구조를 가지고 있는지 확인:
$response->assertJsonStructure(array $structure);
assertJsonPath
response-응답에 지정된 경로와 지정된 데이터가 포함되어 있는지 확인:
$response->assertJsonPath($path, array $data, $strict = false);
assertJsonStructure
response-응답에 지정된 JSON 구조가 있는지 확인:
$response->assertJsonStructure(array $structure);
assertJsonValidationErrors
response-응답이 JSON 유효성 에러를 가지고 있는지 확인:
$response->assertJsonValidationErrors(array $data);
assertLocation
response-응답의 Location
헤더에 주어진 URI를 가지고 있는지 확인:
$response->assertLocation($uri);
assertNoContent
response-응답에 주어진 상태 코드가 있고 내용이 없는지 확인:
$response->assertNoContent($status = 204);
assertNotFound
response-응답이 not found (404) 상태코드를 가지고 있는지 확인:
$response->assertNotFound();
assertOk
response-응답이 200 상태 코드를 가지고 있는지 확인:
$response->assertOk();
assertPlainCookie
response-응답에서 (암호화 되지 않은) 주어진 쿠키가 포함되어 있는지 확인:
$response->assertPlainCookie($cookieName, $value = null);
assertRedirect
response-응답이 주어진 URI로 리다이렉트되는지 여부를 확인:
$response->assertRedirect($uri);
assertSee
response-응답이 주어진 문자열을 포함하고 있는지 확인. 이 테스트는 두번째 인자값으로 false
를 지정하지 않는 한, 자동으로 주어진 문자열을 노출시킵니다.
$response->assertSee($value, $escaped = true);
assertSeeInOrder
response-응답이 주어진 문자열 배열을 순서대로 포함하고 있는지 확인. 이 테스트는 두번째 인자값으로 false
를 지정하지 않는 한, 자동으로 주어진 문자열들을 노출시킵니다.
$response->assertSeeInOrder(array $values, $escaped = true);
assertSeeText
response-응답 텍스트가 주어진 문자열을 포함하고 있는지 확인. 이 테스트는 두번째 인자값으로 false
를 지정하지 않는 한, 자동으로 주어진 문자열을 노출시킵니다.
$response->assertSeeText($value, $escaped = true);
assertSeeTextInOrder
response-응답 텍스트가 주어진 문자열 배열을 순서대로 포함하고 있는지 확인. 이 테스트는 두번째 인자값으로 false
를 지정하지 않는 한, 자동으로 주어진 문자열들을 노출시킵니다.
$response->assertSeeTextInOrder(array $values, $escaped = true);
assertSessionHas
세션에 주어진 데이터가 포함되어 있는지 확인:
$response->assertSessionHas($key, $value = null);
assertSessionHasInput
세션에 임시저장(flashed) 된 입력 배열에 주어진 값이 있는지 확인:
$response->assertSessionHasInput($key, $value = null);
assertSessionHasAll
세션에 주어진 목록의 값들이 포함되어 있는지 확인:
$response->assertSessionHasAll(array $data);
assertSessionHasErrors
세션에 주어진 $keys
에 대한 에러가 포함되어 있는지 확인. $keys
가 연관 배열 인 경우 세션에 각 필드 (키)에 대한 특정 오류 메시지 (값)가 포함되어 있는지 확인:
$response->assertSessionHasErrors(array $keys, $format = null, $errorBag = 'default');
assertSessionHasErrorsIn
세션에 특정 error bag 내에서 주어진 $keys
에 대한 오류가 포함되어 있는지 확인. $keys
가 연관 배열 인 경우, 세션에 error bag 내의 각 필드 (키)에 대한 특정 오류 메시지 (값)가 포함되어 있는지 확인:
$response->assertSessionHasErrorsIn($errorBag, $keys = [], $format = null);
assertSessionHasNoErrors
세션에 에러가 없는지 확인:
$response->assertSessionHasNoErrors();
assertSessionDoesntHaveErrors
세션에 주어진 키에 대해 오류가 없는 지 확인.
$response->assertSessionDoesntHaveErrors($keys = [], $format = null, $errorBag = 'default');
assertSessionMissing
세션에 주어진 키가 포함되어 있지 않은 것을 확인:
$response->assertSessionMissing($key);
assertStatus
response-응답이 주어진 코드를 가지고 있는지 확인:
$response->assertStatus($code);
assertSuccessful
response-응답이 성공적인 상태코드(>= 200 and < 300)를 가지고 있는지 확인:
$response->assertSuccessful();
assertUnauthorized
response-응답이 unauthorized 상태코드(401)를 가지고 있는지 확인:
$response->assertUnauthorized();
assertViewHas
response-응답 뷰가 주어진 데이터인지 확인:
$response->assertViewHas($key, $value = null);
덧붙여 말하자면, 뷰 데이터는 응답(response)에서 배열의 변수들을 통해 접근이 가능합니다.
$this->assertEquals('Taylor', $response['name']);
assertViewHasAll
response-응답 뷰에서 주어진 데이터 리스트를 가지고 있는지 확인:
$response->assertViewHasAll(array $data);
assertViewIs
라우터에 의해서 주어진 뷰가 반환되었는지 확인:
$response->assertViewIs($value);
assertViewMissing
response-응답 뷰가 주어진 데이터가 아닌것을 확인:
$response->assertViewMissing($key);
인증 Assertions
라라벨은 또한 PHPUnit 피쳐 테스트를 위해서 인증과 관련된 다양한 assertion 메소드를 제공합니다.
메소드 | 설명 |
---|---|
$this->assertAuthenticated($guard = null); |
사용자가 인증되었는지 확인. |
$this->assertGuest($guard = null); |
사용자가 인증되지 않은 것을 확인. |
$this->assertAuthenticatedAs($user, $guard = null); |
주어진 사용자가 인증되었는지 확인. |
$this->assertCredentials(array $credentials, $guard = null); |
주어진 인증정보가 유효한지 확인. |
$this->assertInvalidCredentials(array $credentials, $guard = null); |
주어진 인증정보가 유효하지 않은 것을 확인. |