Maison  >  Article  >  développement back-end  >  Un guide complet pour tester dans Laravel avec PHPUnit

Un guide complet pour tester dans Laravel avec PHPUnit

WBOY
WBOYoriginal
2024-07-29 06:56:53697parcourir

Introduction aux tests dans Laravel

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.

Structure des dossiers : tests unitaires et tests de fonctionnalités

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.

Exécuter des tests dans Laravel

Pour exécuter tous les tests dans votre application Laravel, utilisez la commande suivante :

./vendor/bin/phpunit

Configuration de l'environnement de test

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

Test des interactions avec la base de données

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

Un guide complet pour tester dans Laravel avec PHPUnit

Exemple : tester l'enregistrement des utilisateurs

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

Test de l'action du magasin

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

Test d'échec

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

**

Exécuter des tests spécifiques avec PHPUnit

**

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn