Heim >Backend-Entwicklung >PHP-Tutorial >Eine umfassende Anleitung zum Testen in Laravel mit PHPUnit
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.
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.
Um alle Tests in Ihrer Laravel-Anwendung auszuführen, verwenden Sie den folgenden Befehl:
./vendor/bin/phpunit
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'); }
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
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']); }
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!'); }
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()); }
**
**
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!