Eine umfassende Anleitung zum Testen in Laravel mit PHPUnit

WBOY
Freigeben: 2024-07-29 06:56:53
Original
533 Leute haben es durchsucht

Einführung in das Testen in Laravel

Testen ist ein entscheidender Aspekt der Softwareentwicklung, der sicherstellt, dass Ihre Anwendung wie vorgesehen funktioniert. Laravel stellt mit PHPUnit, einem beliebten Test-Framework für PHP, eine robuste Testsuite bereit. Dieser Leitfaden führt Sie durch das Einrichten und Ausführen von Tests in Laravel, erklärt die Unterschiede zwischen Unit- und Feature-Tests und stellt Beispiele für verschiedene Testszenarien bereit.

Ordnerstruktur: Unit- vs. Feature-Tests

In Laravel sind Tests normalerweise in zwei Hauptverzeichnisse organisiert: Unit und Feature.

Unit-Tests: Diese Tests dienen dazu, kleine, isolierte Teile Ihrer Anwendung zu testen, beispielsweise einzelne Methoden oder Klassen. Sie befinden sich normalerweise im Verzeichnis Tests/Unit. Jede Testfunktion sollte mit dem Wort test.

beginnen

Beispiel:

public function testExampleFunction() {
    $this->assertTrue(true);
}
Nach dem Login kopieren

Funktionstests: Diese Tests verarbeiten komplexere Interaktionen und testen typischerweise die Zusammenarbeit mehrerer Komponenten. Sie befinden sich im Verzeichnis Tests/Feature. Bei Funktionstests geht es oft darum, HTTP-Anfragen zu stellen und Antworten zu prüfen.

Ausführen von Tests in Laravel

Um alle Tests in Ihrer Laravel-Anwendung auszuführen, verwenden Sie den folgenden Befehl:

./vendor/bin/phpunit
Nach dem Login kopieren
Nach dem Login kopieren

Konfigurieren der Testumgebung

Bevor Sie Tests ausführen, ist es wichtig, Ihre Testumgebung zu konfigurieren. Ändern Sie Ihre phpunit.xml-Datei, um Umgebungsvariablen zum Testen festzulegen. Um beispielsweise eine SQLite-In-Memory-Datenbank für schnellere Tests zu verwenden:


    
    
    
    
    
    
    
    
    
    
    

Nach dem Login kopieren

Nachdem Sie SQLite als Testumgebung aktiviert haben, leeren Sie den Konfigurationscache:

php artisan config:clear

Nach dem Login kopieren

*Beispiel: Testen, ob die Profilroute vorhanden ist und ordnungsgemäß funktioniert
*

Erstellen Sie einen Test für die Profilroute:

php artisan make:test ProfileTest
Nach dem Login kopieren

Fügen Sie eine Testmethode hinzu, um zu überprüfen, ob auf der Profilseite bestimmter Text angezeigt wird:

public function testProfilePage(){
    $response = $this->get('/profile');
    $response->assertSeeText('Your Profile');
}
Nach dem Login kopieren

Testen von Datenbankinteraktionen

Einrichten einer Testdatenbank

Bevor Sie Datenbankinteraktionen testen, erstellen Sie eine Testdatenbankkonfiguration in config/database.php:

'mysqltesting' => [
    'driver' => 'mysql',
    'url' => env('DB_URL'),
    'host' => env('DB_HOST', '127.0.0.1'),
    'port' => env('DB_PORT', '3306'),
    'database' => 'laravel_testing',
    'username' => env('DB_USERNAME', 'root'),
    'password' => env('DB_PASSWORD', ''),
    'unix_socket' => env('DB_SOCKET', ''),
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
    'prefix_indexes' => true,
    'strict' => true,
    'engine' => null,
    'options' => extension_loaded('pdo_mysql') ? array_filter([
        PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
    ]) : [],
],
Nach dem Login kopieren

Durchführen von Datenbanktests

Führen Sie den PHPUnit-Befehl aus, um sicherzustellen, dass die Testdatenbank erstellt wurde und funktioniert:

./vendor/bin/phpunit
Nach dem Login kopieren
Nach dem Login kopieren

Eine umfassende Anleitung zum Testen in Laravel mit PHPUnit

Beispiel: Testen der Benutzerregistrierung

Erstellen Sie einen Test zur Benutzerregistrierung:

php artisan make:test UserTest

Nach dem Login kopieren

Fügen Sie eine Testmethode hinzu, um zu überprüfen, ob ein Benutzer erstellt und in der Datenbank gespeichert werden kann:

public function test_registration(): void
{
    $user = new User();
    $user->name = 'Test User';
    $user->email = 'email@example.com';
    $user->password = bcrypt('password');

    $user->save();

    $this->assertDatabaseHas('users', ['email' => 'email@example.com']);
}
Nach dem Login kopieren

Store-Aktion testen

Erstellen Sie einen Test für die Store-Aktion in der PostTest-Klasse:

public function testPostStoreValid()
{
    $data = [
        'title'=> 'Test Post',
        'slug' => 'test-post',
        'content' => 'Content of the post',
        'active' => true,
    ];

    $this->post('/posts', $data)
         ->assertStatus(302)
         ->assertSessionHas('status');

    $this->assertEquals(session('status'), 'Post was created!');
}
Nach dem Login kopieren

Prüfung auf Fehler

Fügen Sie eine Testmethode hinzu, um auf Validierungsfehler zu prüfen:

public function testPostFail()
{
    $data = [
        'title'=> '',
        'content' => '',
    ];

    $this->post('/posts', $data)
         ->assertStatus(302)
         ->assertSessionHas('errors');

    $messages = session('errors')->getMessages();

    $this->assertEquals($messages['title'][0], 'The title must be at least 4 characters.');
    $this->assertEquals($messages['title'][1], 'The title field is required.');
    $this->assertEquals($messages['content'][0], 'The content field is required.');
}
Nach dem Login kopieren

*Aktualisierungsaktion testen
*

Fügen Sie eine Testmethode zum Aktualisieren eines Beitrags hinzu:

public function testPostUpdate()
{
    $post = new Post();

    $post->title = "Initial Title";
    $post->slug = Str::slug($post->title, '-');
    $post->content = "Initial content";
    $post->active = true;

    $post->save();

    $this->assertDatabaseHas('posts', $post->toArray());

    $data = [
        'title' => 'Updated Title',
        'slug' => 'updated-title',
        'content' => 'Updated content',
        'active' => false,
    ];

    $this->put("/posts/{$post->id}", $data)
         ->assertStatus(302)
         ->assertSessionHas('status');

    $this->assertDatabaseHas('posts', ['title' => $data['title']]);
    $this->assertDatabaseMissing('posts', ['title' => $post->title]);
}
Nach dem Login kopieren

Löschaktion testen

Fügen Sie eine Testmethode zum Löschen eines Beitrags hinzu:

public function testPostDelete()
{
    $post = new Post();

    $post->title = "Title to delete";
    $post->slug = Str::slug($post->title, '-');
    $post->content = "Content to delete";
    $post->active = true;

    $post->save();

    $this->assertDatabaseHas('posts', $post->toArray());

    $this->delete("/posts/{$post->id}")
         ->assertStatus(302)
         ->assertSessionHas('status');

    $this->assertDatabaseMissing('posts', $post->toArray());
}
Nach dem Login kopieren

**

Ausführen spezifischer Tests mit PHPUnit

**

Um eine bestimmte Testmethode oder -klasse auszuführen, verwenden Sie die Option --filter mit PHPUnit. Hier einige Beispiele:

Führen Sie eine bestimmte Testmethode aus

./vendor/bin/phpunit --filter PostTest::testPostDelete
Nach dem Login kopieren

Führen Sie alle Tests in einer bestimmten Klasse aus

./vendor/bin/phpunit --filter PostTest
Nach dem Login kopieren

Tests in einer bestimmten Datei ausführen

./vendor/bin/phpunit tests/Feature/PostTest.php
Nach dem Login kopieren

Ausführliche Ausgabe

Für eine detailliertere Ausgabe fügen Sie die Option -v hinzu:

./vendor/bin/phpunit --filter PostTest::testPostDelete -v
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonEine umfassende Anleitung zum Testen in Laravel mit PHPUnit. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!