Maison >développement back-end >tutoriel php >Un guide complet pour tester dans Laravel avec PHPUnit
Les tests sont un aspect essentiel du développement logiciel qui garantit que votre application fonctionne comme prévu. Laravel fournit une suite de tests robuste et prête à l'emploi avec PHPUnit, un framework de test populaire pour PHP. Ce guide vous guidera dans la configuration et l'exécution de tests dans Laravel, expliquant les différences entre les tests unitaires et de fonctionnalités et fournissant des exemples pour divers scénarios de test.
Dans Laravel, les tests sont généralement organisés en deux répertoires principaux : Unit et Feature.
Tests unitaires : Ces tests sont conçus pour tester de petites parties isolées de votre application, telles que des méthodes ou des classes individuelles. Ils se trouvent généralement dans le répertoire tests/Unit. Chaque fonction de test doit commencer par le mot test.
Exemple :
public function testExampleFunction() { $this->assertTrue(true); }
Tests de fonctionnalités : Ces tests gèrent des interactions plus complexes et testent généralement plusieurs composants fonctionnant ensemble. Ils se trouvent dans le répertoire tests/Feature. Les tests de fonctionnalités impliquent souvent de faire des requêtes HTTP et de vérifier les réponses.
Pour exécuter tous les tests dans votre application Laravel, utilisez la commande suivante :
./vendor/bin/phpunit
Avant d'exécuter des tests, il est important de configurer votre environnement de test. Modifiez votre fichier phpunit.xml pour définir les variables d'environnement à des fins de test. Par exemple, pour utiliser une base de données SQLite en mémoire pour des tests plus rapides :
<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>
Après avoir activé SQLite comme environnement de test, videz le cache de configuration :
php artisan config:clear
*Exemple : tester si la route de profil existe et fonctionne correctement
*
Créez un test pour l'itinéraire de profil :
php artisan make:test ProfileTest
Ajoutez une méthode de test pour vérifier si la page de profil affiche un texte spécifique :
public function testProfilePage(){ $response = $this->get('/profile'); $response->assertSeeText('Your Profile'); }
Configuration d'une base de données de tests
Avant de tester les interactions avec la base de données, créez une configuration de base de données de test dans 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'), ]) : [], ],
Exécution de tests de base de données
Exécutez la commande PHPUnit pour vous assurer que la base de données de test est créée et fonctionne :
./vendor/bin/phpunit
Créez un test pour l'enregistrement des utilisateurs :
php artisan make:test UserTest
Ajoutez une méthode de test pour vérifier qu'un utilisateur peut être créé et enregistré dans la base de données :
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']); }
Créez un test pour l'action du magasin dans la classe PostTest :
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!'); }
Ajoutez une méthode de test pour vérifier les erreurs de validation :
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.'); }
*Test de l'action de mise à jour
*
Ajouter une méthode de test pour mettre à jour une publication :
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]); }
Test de l'action de suppression
Ajouter une méthode de test pour supprimer une publication :
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()); }
**
**
Pour exécuter une méthode ou une classe de test spécifique, utilisez l'option --filter avec PHPUnit. Voici quelques exemples :
Exécuter une méthode de test spécifique
./vendor/bin/phpunit --filter PostTest::testPostDelete
Exécuter tous les tests dans une classe spécifique
./vendor/bin/phpunit --filter PostTest
Exécuter des tests dans un fichier spécifique
./vendor/bin/phpunit tests/Feature/PostTest.php
Sortie détaillée
Pour une sortie plus détaillée, ajoutez l'option -v :
./vendor/bin/phpunit --filter PostTest::testPostDelete -v
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!