HTTP-Test


HTTP Tests

Einführung

Laravel bietet eine sehr flüssige API sowohl für die Generierung von HTTP-Anfragen als auch für die Überprüfung der Ausgabe. Sie können sich beispielsweise den folgenden Testfall ansehen: Die Methode

<?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 erstellt eine GET-Anfrage an Ihre Anwendung und die Methode assertStatus stellt sicher, dass die zurückgegebene Antwort den angegebenen HTTP-Status hat Code. Zusätzlich zu dieser einfachen Behauptung enthält Laravel auch verschiedene Behauptungen, die Antwortheader, Inhalt, JSON, Struktur usw. überprüfen.

Benutzerdefinierte Anforderungsheader

Sie können die withHeaders-Methode verwenden, um die Anforderung anzupassen, bevor Sie sie an senden Anwendungsheader. Sie können beliebige benutzerdefinierte Header hinzufügen.

<?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} Die CSRF-Middleware wird beim Ausführen von Tests automatisch deaktiviert.

Sitzung/Authentifizierung

Laravel bietet mehrere Helfer für die Verwendung von Session während der HTTP-Testfunktion. Zuerst müssen Sie ein Array an die Methode withSession übergeben, um die Sitzungsdaten festzulegen. Dadurch können Sie die Sitzung ganz einfach mit Daten laden, bevor Sie die Testanfrage der Anwendung senden:

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

Natürlich wird die Sitzung im Allgemeinen zur Aufrechterhaltung des Benutzerstatus verwendet, beispielsweise zur Authentifizierung von Benutzern. actingAs Hilfsfunktionen bieten eine einfache Möglichkeit, den Benutzer anzugeben, der sich als aktueller Benutzer authentifizieren soll. Beispielsweise können wir das Factory-Modell verwenden, um Benutzer zu generieren und zu authentifizieren:

<?php
    use App\User;
    class ExampleTest extends TestCase{ 
       public function testApplication()  
         {     
            $user = factory(User::class)->create();        
            $response = $this->actingAs($user)                 
                    ->withSession(['foo' => 'bar'])                        
                    ->get('/');  
          }
     }

Sie können auch angeben, über welchen Watcher der Benutzer authentifiziert wird, indem Sie den Watcher-Namen als zweiten Parameter von actingAs übergeben:

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

JSON testen APIs

Laravel bietet außerdem mehrere Hilfsfunktionen zum Testen von JSON-APIs und deren Antworten. Beispielsweise können json, get, post, put, patch und delete zum Senden verschiedener HTTP-Aktionen verwendet werden. Sie können diesen Methoden auch problemlos Daten und Anforderungsheader übergeben. Beginnen wir mit der Verwendung, indem wir eine POST-Anfrage an /user schreiben und bestätigen, dass die erwarteten Daten zurückgegeben werden:

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

{tip} Die assertJson-Methode wandelt die Antwort in ein Array um und verwendet das PHPUnit::assertArraySubset, um zu überprüfen, ob das angegebene Array in der von der Anwendung zurückgegebenen JSON-Antwort vorhanden ist. Wenn also andere Attribute in der JSON-Antwort vorhanden sind, wird der Test trotzdem bestanden, sofern das Array vorhanden ist:

Überprüfen Sie eine genaue Übereinstimmung

, wenn Sie ein bestimmtes Array exakt überprüfen möchten Um von einer Anwendung zurückgegebene JSON-Ergebnisse abzugleichen, sollten Sie die Methode assertExactJson verwenden:

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

Testdatei-Upload

IlluminateHttpUploadedFile bietet eine fake Methode zum Generieren virtueller Dateien oder Bilder zu Testzwecken. Es kann mit der Storage-Methode der fake-Fassade kombiniert werden, um das Testen des Datei-Uploads erheblich zu vereinfachen. Beispielsweise können Sie die beiden Funktionen kombinieren, um das Avatar-Upload-Formular ganz bequem zu testen:

<?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');   
       }
 }

Virtuelle Dateivorbereitung

In Verwendung fake Wenn Sie eine Datei mit dieser Methode erstellen, können Sie die Breite, Höhe und Größe des Bildes angeben, um die Testregeln besser zu überprüfen:

UploadedFile::fake()->image('avatar.jpg', $width, $height)->size(100);

Zusätzlich zum Erstellen von Bildern können Sie auch create verwenden Methoden zum Erstellen anderer Dateitypen:

UploadedFile::fake()->create('document.pdf', $sizeInKilobytes);

Verfügbare Behauptungen

Response Assertion

Laravel bietet eine Vielzahl gängiger Assertionsmethoden für PHPUnit-Tests. Verfügbar unter json, get, post, put und delete Greifen Sie in der Testmethode auf diese Behauptungen zu:

assertCookie

Bestätigt, dass die Antwort das Gegebene enthält Cookie:

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

assertCookieExpired

Stellen Sie sicher, dass die Antwort das angegebene Cookie enthält und es ist abgelaufen:

$response->assertCookieExpired($cookieName);

assertCookieNotExpired

Stellen Sie sicher, dass das angegebene Cookie in der Antwort enthalten war und es ist nicht abgelaufen:

$response->assertCookieNotExpired($cookieName);

assertCookieMissing

Bestätigt, dass die Antwort das Gegebene nicht enthält Cookie:

$response->assertCookieMissing($cookieName);

assertDontSee

Stellen Sie sicher, dass die angegebene Zeichenfolge nicht in der Antwort enthalten ist:

$response->assertDontSee($value);

as sertDontSeeText

Bestätigt, dass die angegebene Zeichenfolge nicht im Antworttext enthalten ist:

$response->assertDontSeeText($value);

assertExactJson

< 🎜 Stellen Sie sicher, dass die in der Antwort enthaltenen Daten mit den angegebenen übereinstimmen JSON Die Daten stimmen genau mit:

$response->assertExactJson(array $data);

assertForbidden

Assertionsantwort Es gibt einen verbotenen Statuscode:

$response->assertForbidden();

assertHeader

Bestätigt, was in der Antwort angegeben ist Header:

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

assertHeaderMissing

Assertion-Antwort Es gibt keinen angegebenen Header in:

$response->assertHeaderMissing($headerName);

assertJson

Bestätigt, dass die Antwort das Gegebene enthält JSON-Daten:

$response->assertJson(array $data);

assertJsonCount

Assertionsantwort JSON Es gibt ein Array, das die erwartete Anzahl von Elementen für einen bestimmten Schlüssel enthält:

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

assertJsonFragment

Bestätigen, dass die Antwort enthält gegebenes JSON Snippet:

$response->assertJsonFragment(array $data);

assertJsonMissing

Stellen Sie sicher, dass die Antwort nicht den angegebenen JSON enthält Snippet:

$response->assertJsonMissing(array $data);

assertJsonMissingExact

Stellen Sie sicher, dass die Antwort kein exaktes JSON enthält Snippet:

$response->assertJsonMissingExact(array $data);

assertJsonMissingValidationErrors

Stellen Sie sicher, dass die Antwort kein JSON für den angegebenen Schlüssel hat Validierungsfehler:

$response->assertJsonMissingValidationErrors($keys);

assertJsonStructure

Stellen Sie sicher, dass die Antwort den angegebenen JSON hat Struktur:

$response->assertJsonStructure(array $structure);

assertJsonValidationErrors

Stellen Sie sicher, dass die Antwort Validierungsfehler für den angegebenen JSON mit dem angegebenen Schlüssel aufweist:

$response->assertJsonValidationErrors($keys);

assertLocation

Antwort bestätigen in Location mit der angegebenen URI im Header Wert:

$response->assertLocation($uri);

assertNotFound

Assertion-Antwortobjekt Statuscode nicht gefunden:

$response->assertNotFound();

assertOk

Antwort bestätigen Ja 200 Statuscode:

$response->assertOk();

assertPlainCookie

Stellen Sie sicher, dass die Antwort das angegebene Cookie enthält (unverschlüsselt):

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

assertRedirect

Stellen Sie sicher, dass die Antwort an die angegebene Adresse weitergeleitet wird URI:

$response->assertRedirect($uri);

assertSee

Bestätigen, dass die angegebene Zeichenfolge in der Antwort enthalten ist:

$response->assertSee($value);

assertSeeInOrder

Stellen Sie sicher, dass die Antwort die angegebene Zeichenfolge in der folgenden Reihenfolge enthält:

$response->assertSeeInOrder(array $values);

a ssertSeeText

Stellt sicher, dass die angegebene Zeichenfolge im Antworttext enthalten ist:

$response->assertSeeText($value);

assertSeeTextInOr der

Stellen Sie sicher, dass die angegebene Zeichenfolge im Antworttext in der folgenden Reihenfolge enthalten ist:

$response->assertSeeTextInOrder(array $values);

assertSessionHas

Behauptung Die Sitzung enthält die angegebenen Daten:

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

assertSessionHasAll

Assert session Es gibt eine Liste der angegebenen Werte in:

$response->assertSessionHasAll(array $data);

assertSessionHasErrors

Assert session Enthält einen Fehler für ein bestimmtes Feld:

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

assertSessionHasErrorsIn

assert session mit dem angegebenen Fehler:

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

assertSessionHasNoErrors

assert session Keine Fehler:

$response->assertSessionHasNoErrors();

assertSessionDoesntHaveErrors

Assert-Sitzung Kein Schlüsselfehler angegeben:

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

assertSessionMissing

Assert-Sitzung Der angegebene Schlüssel ist nicht enthalten in:

$response->assertSessionMissing($key);

assertStatus

Bestätigt, dass die Antwort den angegebenen Statuscode hat:

$response->assertStatus($code);

assertSuccessful

Stellen Sie sicher, dass die Antwort einen erfolgreichen Statuscode enthält:

$response->assertSuccessful();

assertViewHas

Assert Die Antwortansicht ist ein gegebenes Datenelement:

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

assertVi ewHasAll

Bestätigt, dass die Antwortansicht die angegebene Datenliste enthält:

$response->assertViewHasAll(array $data);

assertViewIs

Assert Route gibt die angegebene Ansicht zurück:

$response->assertViewIs($value);

assertViewMissing

Bestätigen Sie, dass die Antwortansicht fehlt Ein verbindliches Datenelement:

$response->assertViewMissing($key);

Authentifizierung Behauptungen

Laravel bietet auch verschiedene authentifizierungsbezogene Behauptungen für Ihre PHPUnit-Tests:

MethodDescription
$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);断言给定的凭证无效。
Dieser Artikel wurde zuerst auf LearnKu.com veröffentlicht auf der Website.