Heim >Backend-Entwicklung >PHP-Tutorial >Eine umfassende Anleitung zum Testen in Laravel mit PHPUnit

Eine umfassende Anleitung zum Testen in Laravel mit PHPUnit

WBOY
WBOYOriginal
2024-07-29 06:56:53745Durchsuche

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

Funktionstests: Diese Tests behandeln 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

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:

<php>
    <env name="APP_ENV" value="testing"></env>
    <env name="APP_MAINTENANCE_DRIVER" value="file"></env>
    <env name="BCRYPT_ROUNDS" value="4"></env>
    <env name="CACHE_STORE" value="array"></env>
    <env name="DB_CONNECTION" value="sqlite"></env>
    <env name="DB_DATABASE" value=":memory:"></env>
    <env name="MAIL_MAILER" value="array"></env>
    <env name="PULSE_ENABLED" value="false"></env>
    <env name="QUEUE_CONNECTION" value="sync"></env>
    <env name="SESSION_DRIVER" value="array"></env>
    <env name="TELESCOPE_ENABLED" value="false"></env>
</php>

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

php artisan config:clear

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

Erstellen Sie einen Test für die Profilroute:

php artisan make:test ProfileTest

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

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'),
    ]) : [],
],

Datenbanktests ausführen

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

./vendor/bin/phpunit

Eine umfassende Anleitung zum Testen in Laravel mit PHPUnit

Beispiel: Testen der Benutzerregistrierung

Erstellen Sie einen Test für die Benutzerregistrierung:

php artisan make:test UserTest

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

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

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

*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]);
}

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

**

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

Alle Tests in einer bestimmten Klasse ausführen

./vendor/bin/phpunit --filter PostTest

Tests in einer bestimmten Datei ausführen

./vendor/bin/phpunit tests/Feature/PostTest.php

Ausführliche Ausgabe

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

./vendor/bin/phpunit --filter PostTest::testPostDelete -v

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!

Stellungnahme:
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