HTTP 테스트


ㅋㅋ

HTTP 테스트

소개

Laravel은 HTTP 요청 생성과 출력 검사 모두에 매우 유연한 API를 제공합니다. 예를 들어 아래 테스트 사례를 확인할 수 있습니다.

<?php
    namespace Tests\Feature;
    use Tests\TestCase;
    use Illuminate\Foundation\Testing\RefreshDatabase;
    use Illuminate\Foundation\Testing\WithoutMiddleware;
    class ExampleTest extends TestCase{    
    /**
     * 一个基础的测试用例。
     *
     * @return void
     */   
     public function testBasicTest() 
        {     
           $response = $this->get('/');        
           $response->assertStatus(200);  
         }
      }

get 메서드는 애플리케이션에 대한 GET 요청을 생성하고 assertStatus 메서드는 반환된 응답이 지정된 HTTP 상태 코드임을 어설션합니다. 이 간단한 어설션 외에도 Laravel에는 응답 헤더, 콘텐츠, JSON, 구조 등을 확인하는 다양한 어설션이 포함되어 있습니다. get 方法会创建一个 GET 请求来请求你的应用,而 assertStatus 方法断言返回的响应是指定的 HTTP 状态码。 除了这个简单的断言之外, Laravel 也包含检查响应标头、内容、JSON、结构等各种断言。

自定义请求头

你可以使用 withHeaders 方法在发送到应用程式之前自定义请求的标头。 你可以添加想要的任何自定义标头。

<?php
    class ExampleTest extends TestCase{
     /**
     * 一个基础的功能测试用例。
     *
     * @return void
     */  
       public function testBasicExample() 
          {     
             $response = $this->withHeaders([        
                 'X-Header' => 'Value',        
               ])->json('POST', '/user', ['name' => 'Sally']);        
              $response      
                    ->assertStatus(201)            
                    ->assertJson([        
                            'created' => true,           
                            ]); 
                         }
                      }

{tip} 运行测试时,CSRF 中间件会自动禁用。

Session / 认证

Laravel 提供了几个可在 HTTP 测试时使用 Session 的辅助函数。首先,你需要传递一个数组给 withSession 方法来设置 Session 数据。这让你在应用程序的测试请求发送之前,先给数据加载 Session 变得简单:

<?php
    class ExampleTest extends TestCase{  
      public function testApplication()  
        {     
           $response = $this->withSession(['foo' => 'bar'])              
                      ->get('/'); 
         }
    }

当然,一般使用 Session 时都是用于维护用户状态,如认证用户。actingAs 辅助函数提供了简单的方法来指定的用户认证为当前用户。 例如, 我们可以使用 工厂模型 来生成并认证用户:

<?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 的第二参数以指定用户通过哪种看守器来认证:

$this->actingAs($user, 'api')

测试 JSON APIs

Laravel 也提供了几个辅助函数来测试 JSON APIs 和他们的响应。 例如,json, getpostputpatch,和 delete 可以被用于发送各种 HTTP 动作。 你也可以轻松地将数据和请求头传递到这些方法中。让我们写一个 POST 请求到 /user 并断言返回期望的数据来开始使用他们:

<?php
    class ExampleTest extends TestCase{   
     /**
     * 一个简单的功能测试用例。
     *
     * @return void
     */   
     public function testBasicExample() 
        {    
            $response = $this->json('POST', '/user', ['name' => 'Sally']);     
            $response        
                ->assertStatus(201)            
                ->assertJson([         
                       'created' => true,           
                       ]);  
         }
     }

{tip} assertJson 方法将响应转换为数组并利用 PHPUnit::assertArraySubset 来验证给定的数组存在于应用返回的 JSON 响应中。 所以,如果 JSON 响应中有其他属性,测试仍旧会在给定数组存在的情况下通过:

验证完全匹配

如果你想验证给定的数组 完全 匹配应用返回的 JSON 结果,你应该使用 assertExactJson

요청 헤더 맞춤설정

를 사용할 수 있습니다. withHeaders 메소드는 요청을 애플리케이션에 보내기 전에 요청 헤더를 사용자 정의합니다. 원하는 사용자 정의 헤더를 추가할 수 있습니다.
<?php
    class ExampleTest extends TestCase{   
     /**
     * 一个基本的功能测试用例。
     *
     * @return void
     */  
      public function testBasicExample()  
        {     
           $response = $this->json('POST', '/user', ['name' => 'Sally']);        
           $response         
              ->assertStatus(201)            
              ->assertExactJson([           
                   'created' => true,           
                  ]);  
         }
     }
{tip} 테스트를 실행하면 CSRF 미들웨어가 자동으로 비활성화됩니다. 🎜🎜🎜🎜
🎜🎜세션/인증 🎜🎜Laravel은 사용할 수 있는 여러 옵션을 제공합니다. HTTP에서 테스트할 때 세션의 도우미 기능을 사용하세요. 먼저, 세션 데이터를 설정하려면 withSession 메서드에 배열을 전달해야 합니다. 이렇게 하면 애플리케이션의 테스트 요청을 보내기 전에 세션에 데이터를 로드하는 것이 간단해집니다. 🎜
<?php
    namespace Tests\Feature;
    use Tests\TestCase;
    use Illuminate\Http\UploadedFile;
    use Illuminate\Support\Facades\Storage;
    use Illuminate\Foundation\Testing\RefreshDatabase;
    use Illuminate\Foundation\Testing\WithoutMiddleware;
    class ExampleTest extends TestCase{
        public function testAvatarUpload()  
          {    
              Storage::fake('avatars');        
              $file = UploadedFile::fake()->image('avatar.jpg');        
              $response = $this->json('POST', '/avatar', [        
                  'avatar' => $file,      
             ]);       
           // 断言文件已经存储 . . .       
           Storage::disk('avatars')->assertExists($file->hashName());      
          // 断言文件不存在 . . .        
          Storage::disk('avatars')->assertMissing('missing.jpg');   
       }
 }
🎜물론 세션은 일반적으로 사용자 인증과 같은 사용자 상태를 유지하는 데 사용됩니다. actingAs 도우미 기능을 사용하면 현재 사용자로 인증할 사용자를 쉽게 지정할 수 있습니다. 예를 들어, 공장 모델을 사용하여 사용자를 생성하고 인증할 수 있습니다: 🎜
UploadedFile::fake()->image('avatar.jpg', $width, $height)->size(100);
🎜 감시자 이름을 actingAs의 두 번째 매개변수로 전달하여 사용자를 인증할 감시자를 지정할 수도 있습니다: 🎜
UploadedFile::fake()->create('document.pdf', $sizeInKilobytes);
🎜
🎜🎜
🎜🎜JSON API 테스트🎜🎜Laravel은 JSON API와 응답을 테스트하기 위한 여러 도우미 함수도 제공합니다. . 예를 들어 json, get, post, put, patch 및 < code >delete를 사용하여 다양한 HTTP 작업을 보낼 수 있습니다. 또한 이러한 메서드에 쉽게 데이터를 전달하고 헤더를 요청할 수도 있습니다. /user에 대한 POST 요청을 작성하고 예상 데이터를 다시 어설션하여 사용을 시작해 보겠습니다. 🎜
$response->assertCookie($cookieName, $value = null);
🎜{tip} assertJson 메서드는 응답을 배열로 변환하고 PHPUnit::assertArraySubset를 활용하여 지정된 배열이 애플리케이션에서 반환된 JSON 응답에 있는지 확인합니다. 따라서 JSON 응답에 다른 속성이 있는 경우 배열이 있으면 테스트가 계속 통과됩니다. 🎜
🎜
🎜🎜
🎜

정확한 일치 확인

🎜주어진 배열이 애플리케이션에서 반환한 JSON 결과와 정확히 일치하는지 확인하려면 다음을 사용해야 합니다. assertExactJson 메서드: 🎜
$response->assertCookieExpired($cookieName);
🎜🎜🎜🎜🎜🎜

테스트 파일 업로드

IlluminateHttpUploadedFile은 테스트 목적으로 가상 파일이나 이미지를 생성하기 위한 fake 메서드를 제공합니다. Storage 파사드의 fake 메소드와 결합하여 파일 업로드 테스트를 크게 단순화할 수 있습니다. 예를 들어 두 가지 기능을 결합하여 아바타 업로드 양식을 쉽게 테스트할 수 있습니다. IlluminateHttpUploadedFile 提供了一个 fake 方法用于生成虚拟的文件或者图像以供测试之用。 它可以和 Storage facade 的 fake 方法相结合, 大幅度简化了文件上传测试。举个例子,你可以结合这两者的功能非常方便地进行头像上传表单测试:

$response->assertCookieNotExpired($cookieName);

虚拟文件制定

在使用 fake 方法创建文件时,你可以指定图像的宽高以及大小,从而更好的验证测试规则:

$response->assertCookieMissing($cookieName);

除创建图像外,你也可以用 create

$response->assertDontSee($value);

가상 파일 공식화

< code>fake 메소드를 사용하여 파일을 생성하는 경우 이미지의 너비, 높이 및 크기를 지정하여 테스트 규칙을 더 잘 확인할 수 있습니다.

$response->assertDontSeeText($value);
이미지 생성 외에도 create<를 사용할 수도 있습니다. /code> 다른 유형의 파일을 생성하는 방법:

$response->assertExactJson(array $data);

사용 가능한 주장

🎜🎜🎜🎜

Response Assertion

Laravel은 PHPUnit 테스트를 위한 다양한 공통 어설션 방법을 제공합니다. 이러한 어설션은 json, get, post, put,和 delete

assertCookie
assertCookieExpired
assertCookieNotExpired
assertCookieMissing
assertDontSee에서 액세스할 수 있습니다.
asser tDontSeeText
assertExactJson
assertForbidden
assertHeader ㅋㅋㅋ alidationErrors
assertJsonStructure
assertJsonValidationErrors
assertLocation
assertNotFound
assertOk
assertPlainCookie ㅋㅋㅋ sAll
assertSessionHasErrors
assertSessionHasErrorsIn
assertSessionHasNoErrors
assertSessionDoesntHaveErrors
assertSessionMissing
assertStatus
assertSuccessful
assertViewHas
assertViewHasAll
assertViewIs
assertViewMissing



assertCookie주어진 쿠키가 응답에 포함되어 있는지 확인:

$response->assertForbidden();


assertCookieExpired

응답에 지정된 쿠키가 포함되어 있고 쿠키가 만료되었음을 확인:

$response->assertHeader($headerName, $value = null);

assertCookieNotExpired

응답에 지정된 쿠키가 포함되어 있고 만료되지 않았는지 확인:

$response->assertHeaderMissing($headerName);

assertCookieMissing

주어진 쿠키가 응답에 포함되지 않았는지 확인:

$response->assertJson(array $data);

assertDontSee

주어진 문자열이 응답에 포함되지 않았는지 확인:

$response->assertJsonCount($count, $key = null);

assertDontSeeText

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

$response->assertJsonFragment(array $data);

assertExactJson

응답에 포함된 데이터가 지정된 JSON 데이터와 정확히 일치하는지 확인:

$response->assertJsonMissing(array $data);

assertForbidden

응답에 금지된 상태 코드가 있는지 확인:

$response->assertJsonMissingExact(array $data);

assertHeader

응답에 지정된 헤더가 있는지 확인:

$response->assertJsonMissingValidationErrors($keys);

assertHeaderMissing

주어진 내용이 응답 헤더에 없는지 확인:

$response->assertJsonStructure(array $structure);

assertJson

응답에 지정된 JSON 데이터가 포함되어 있는지 확인:

$response->assertJsonValidationErrors($keys);

assertJsonCount

응답이 다음과 같다고 주장 JSON에는 지정된 키에 대해 예상되는 배열이 포함되어 있습니다. 요소 수:

$response->assertLocation($uri);

assertJsonFragment

응답에 지정된 JSON 조각이 포함되어 있는지 확인:

$response->assertNotFound();

assertJsonMissingEx act

응답에 정확한 JSON 조각이 포함되어 있지 않습니다.

$response->assertOk();

assertJsonMissingValidationErrors

응답에 지정된 키에 대한 JSON이 포함되어 있지 않은지 확인 유효성 검사 오류:

$response->assertPlainCookie($cookieName, $value = null);

assert JsonStructure

그렇다고 주장하세요 응답에는 주어진 JSON 구조가 있습니다:

$response->assertRedirect($uri);

assertJsonValidationErrors

응답에 주어진 키에 대해 주어진 JSON 유효성 검사 오류가 있는지 확인:

$response->assertSee($value);

assertLocation

응답의 Location 헤더에 지정된 URI 값이 있는지 확인:

$response->assertSeeInOrder(array $values);

assertNotFound

어설션 응답에 상태 코드가 없습니다:

$response->assertSeeText($value);

assertOk

어설션 응답에 상태 코드가 있습니다:

$response->assertSeeTextInOrder(array $values);

asser tPlainCookie

다음을 주장합니다. 응답에 지정된 쿠키가 포함되어 있습니다(암호화되지 않음):

$response->assertSessionHas($key, $value = null);

assertRedirect

응답이 지정된 URI로 리디렉션되는지 확인:

$response->assertSessionHasAll(array $data);

assertSee

주어진 것을 주장 문자열이 응답에 포함되어 있음 매체:

$response->assertSessionHasErrors(array $keys, $format = null, $errorBag = 'default');

assertSeeInOrder

주어진 문자열이 응답 텍스트에 포함되어 있는지 확인:

$response->assertSessionHasErrorsIn($errorBag, $keys = [], $format = null);

assertSeeText

Assert 주어진 문자열은 응답 텍스트에 포함됨:

$response->assertSessionHasNoErrors();

assertSeeTextInOrder

주어진 문자열이 응답 텍스트에 순서대로 포함되어 있는지 확인:

$response->assertSessionDoesntHaveErrors($keys = [], $format = null, $errorBag = 'default');

assertSessionHas

세션이 포함되어 있는지 확인 데이터:

$response->assertSessionMissing($key);

assertSessionHasAll

세션에 지정된 값 목록이 포함되어 있는지 확인:

$response->assertStatus($code);

assertSessionHasErrors

Ass 세션에 특정 필드에 대한 오류가 포함되어 있음을 확인합니다.

$response->assertSuccessful();

assertSessionHasErrorsIn

세션에 지정된 오류가 있는지 확인:

$response->assertViewHas($key, $value = null);

assertSessionHasNoErrors

세션에 오류가 있는지 확인 오류 없음:

$response->assertViewHasAll(array $data);

assertSessionDoesntHaveErrors

세션에 주어진 키가 없다고 주장 오류:

$response->assertViewIs($value);

assertSessionMissing

세션에 주어진 키가 없다고 주장:

$response->assertViewMissing($key);

assertStatus

응답에 지정된 상태 코드가 있는지 확인:

rrreee

assertSuccessful

응답에 성공 상태 코드가 있는지 확인:

rrreee

assertViewHas

응답 확인 view는 주어진 데이터 조각입니다.

rrreee

assertViewHasAll

응답 뷰에 지정된 데이터 목록이 있는지 확인합니다.

rrreee

assertViewIs

Assert 경로는 주어진 뷰를 반환합니다 :

rrreee

assertViewMissing

응답 뷰에 바인딩 데이터 조각이 누락되었는지 확인:

rrreee

Authentication Assertions

Laravel도 다음을 제공합니다. PHPUnit 테스트는 다양한 기능을 제공합니다. 인증 관련 주장:

이 사용자가 인증되었음을 어설션합니다. $this->assertGuest($guard = null);
MethodDescription
$this->assertAuthenticated($guard = null);$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);
이 사용자가 인증되지 않았음을 확인합니다.
$this->assertAuthenticatedAs($user, $guard = null);🎜🎜해당 사용자가 인증되었는지 확인합니다. 🎜🎜🎜🎜$this->assertCredentials(array $credentials, $guard = null);🎜🎜주어진 자격 증명이 유효한지 확인합니다. 🎜🎜🎜🎜$this->assertInvalidCredentials(array $credentials, $guard = null);🎜🎜주어진 자격 증명이 유효하지 않은지 확인합니다. 🎜🎜🎜🎜🎜이 글은 🎜LearnKu.com🎜 웹사이트에 처음 게시되었습니다. 🎜🎜