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
, get
, post
, put
, patch
,和 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
在使用 除创建图像外,你也可以用 < code>fake 메소드를 사용하여 파일을 생성하는 경우 이미지의 너비, 높이 및 크기를 지정하여 테스트 규칙을 더 잘 확인할 수 있습니다. Laravel은 PHPUnit 테스트를 위한 다양한 공통 어설션 방법을 제공합니다. 이러한 어설션은 assertCookie 응답에 지정된 쿠키가 포함되어 있고 쿠키가 만료되었음을 확인: 응답에 지정된 쿠키가 포함되어 있고 만료되지 않았는지 확인: 주어진 쿠키가 응답에 포함되지 않았는지 확인: 주어진 문자열이 응답에 포함되지 않았는지 확인: 주어진 문자열이 응답 텍스트에 포함되어 있지 않은지 확인: 응답에 포함된 데이터가 지정된 JSON 데이터와 정확히 일치하는지 확인: 응답에 금지된 상태 코드가 있는지 확인: 응답에 지정된 헤더가 있는지 확인: 주어진 내용이 응답 헤더에 없는지 확인: 응답에 지정된 JSON 데이터가 포함되어 있는지 확인: 응답이 다음과 같다고 주장 JSON에는 지정된 키에 대해 예상되는 배열이 포함되어 있습니다. 요소 수: 응답에 지정된 JSON 조각이 포함되어 있는지 확인: 응답에 정확한 JSON 조각이 포함되어 있지 않습니다. 응답에 지정된 키에 대한 JSON이 포함되어 있지 않은지 확인 유효성 검사 오류: 그렇다고 주장하세요 응답에는 주어진 JSON 구조가 있습니다: 응답에 주어진 키에 대해 주어진 JSON 유효성 검사 오류가 있는지 확인: 응답의 어설션 응답에 상태 코드가 없습니다: 어설션 응답에 상태 코드가 있습니다: 다음을 주장합니다. 응답에 지정된 쿠키가 포함되어 있습니다(암호화되지 않음): 응답이 지정된 URI로 리디렉션되는지 확인: 주어진 것을 주장 문자열이 응답에 포함되어 있음 매체: 주어진 문자열이 응답 텍스트에 포함되어 있는지 확인: Assert 주어진 문자열은 응답 텍스트에 포함됨: 주어진 문자열이 응답 텍스트에 순서대로 포함되어 있는지 확인: 세션이 포함되어 있는지 확인 데이터: 세션에 지정된 값 목록이 포함되어 있는지 확인: Ass 세션에 특정 필드에 대한 오류가 포함되어 있음을 확인합니다. 세션에 지정된 오류가 있는지 확인: 세션에 오류가 있는지 확인 오류 없음: 세션에 주어진 키가 없다고 주장 오류: 세션에 주어진 키가 없다고 주장: 응답에 지정된 상태 코드가 있는지 확인: 응답에 성공 상태 코드가 있는지 확인: 응답 확인 view는 주어진 데이터 조각입니다. 응답 뷰에 지정된 데이터 목록이 있는지 확인합니다. Assert 경로는 주어진 뷰를 반환합니다 : 응답 뷰에 바인딩 데이터 조각이 누락되었는지 확인: Laravel도 다음을 제공합니다. PHPUnit 테스트는 다양한 기능을 제공합니다. 인증 관련 주장: 요청 헤더 맞춤설정
를 사용할 수 있습니다. withHeaders
메소드는 요청을 애플리케이션에 보내기 전에 요청 헤더를 사용자 정의합니다. 원하는 사용자 정의 헤더를 추가할 수 있습니다. <?php
class ExampleTest extends TestCase{
/**
* 一个基本的功能测试用例。
*
* @return void
*/
public function testBasicExample()
{
$response = $this->json('POST', '/user', ['name' => 'Sally']);
$response
->assertStatus(201)
->assertExactJson([
'created' => true,
]);
}
}
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
, 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);
가상 파일 공식화
$response->assertDontSeeText($value);
이미지 생성 외에도 create<를 사용할 수도 있습니다. /code> 다른 유형의 파일을 생성하는 방법:
$response->assertExactJson(array $data);
🎜🎜🎜🎜Response Assertion
json
, get
, post
, put
,和 delete
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
$response->assertJsonMissing(array $data);
assertForbidden
$response->assertJsonMissingExact(array $data);
assertHeader
$response->assertJsonMissingValidationErrors($keys);
assertHeaderMissing
$response->assertJsonStructure(array $structure);
assertJson
$response->assertJsonValidationErrors($keys);
assertJsonCount
$response->assertLocation($uri);
assertJsonFragment
$response->assertNotFound();
assertJsonMissingEx act
$response->assertOk();
assertJsonMissingValidationErrors
$response->assertPlainCookie($cookieName, $value = null);
assert JsonStructure
$response->assertRedirect($uri);
assertJsonValidationErrors
$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
$response->assertSessionHasAll(array $data);
assertSee
$response->assertSessionHasErrors(array $keys, $format = null, $errorBag = 'default');
assertSeeInOrder
$response->assertSessionHasErrorsIn($errorBag, $keys = [], $format = null);
assertSeeText
$response->assertSessionHasNoErrors();
assertSeeTextInOrder
$response->assertSessionDoesntHaveErrors($keys = [], $format = null, $errorBag = 'default');
assertSessionHas
$response->assertSessionMissing($key);
assertSessionHasAll
$response->assertStatus($code);
assertSessionHasErrors
$response->assertSuccessful();
assertSessionHasErrorsIn
$response->assertViewHas($key, $value = null);
assertSessionHasNoErrors
$response->assertViewHasAll(array $data);
assertSessionDoesntHaveErrors
$response->assertViewIs($value);
assertSessionMissing
$response->assertViewMissing($key);
assertStatus
assertSuccessful
assertViewHas
assertViewHasAll
assertViewIs
assertViewMissing
Authentication Assertions
Method Description $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->assertGuest($guard = null);
$this->assertAuthenticatedAs($user, $guard = null);
🎜🎜해당 사용자가 인증되었는지 확인합니다. 🎜🎜🎜🎜$this->assertCredentials(array $credentials, $guard = null);
🎜🎜주어진 자격 증명이 유효한지 확인합니다. 🎜🎜🎜🎜$this->assertInvalidCredentials(array $credentials, $guard = null);
🎜🎜주어진 자격 증명이 유효하지 않은지 확인합니다. 🎜🎜🎜🎜🎜이 글은 🎜LearnKu.com🎜 웹사이트에 처음 게시되었습니다. 🎜🎜