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 미들웨어는 자동으로 비활성화 됩니다.

응답 디버깅

애플리케이션에 테스트 요청을 한 후에는 dumpdumpHeaders 메소드를 사용하여 응답 내용을 검사하고 디버그 할 수 있습니다.

<?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->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-요청을 할 수 있습니다. 이 메소드들에 손쉽게 데이터와 헤더를 전달할 수도 있습니다. 이를 위해 /userPOST 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이 정확하게 일치하는지 확인하기

주어진 배열이 반환된 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);

사용 가능한 Assertions

응답-response Assertions

라라벨은 PHPUnit 테스트를 위해 다양한 커스텀 assertion 메소드를 제공합니다. 이러한 assertions 은 json, get, post, put, 그리고 delete 테스트 메소드에서 반환된 response-응답에 엑세스 할 수 있습니다.

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-응답에 주어진 문자열이 포함되어 있지 않은 것을 확인:

$response->assertDontSee($value);

assertDontSeeText

response-응답 텍스트에 주어진 문자열이 포함되어 있지 않은 것을 확인:

$response->assertDontSeeText($value);

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-응답이 주어진 문자열을 포함하고 있는지 확인:

$response->assertSee($value);

assertSeeInOrder

response-응답이 주어진 문자열 배열을 순서대로 포함하고 있는지 확인:

$response->assertSeeInOrder(array $values);

assertSeeText

response-응답 텍스트가 주어진 문자열을 포함하고 있는지 확인:

$response->assertSeeText($value);

assertSeeTextInOrder

response-응답 텍스트가 주어진 문자열 배열을 순서대로 포함하고 있는지 확인:

$response->assertSeeTextInOrder(array $values);

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);

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); 주어진 인증정보가 유효하지 않은 것을 확인.