Laravel 12.38 : optimisez vos tests avec les traits WithCachedRoutes et WithCachedConfig

L
Laravel Actu
4 min

Laravel 12.38 introduit deux traits de test qui promettent d’accélérer significativement vos suites de tests. Pourquoi compiler vos routes et votre configuration à chaque test quand vous pouvez les mettre en cache ? Cette version apporte également des améliorations sur la commande model:show et le support officiel de Symfony 7.4.

Le problème de performance dans les tests

Lorsque vous exécutez une suite de tests Laravel complète, le framework reconstruit les routes et la configuration à chaque test. Sur des applications de taille moyenne ou importante, cette opération répétitive peut faire grimper le temps d’exécution de manière significative. Laravel 12.38 répond à ce problème avec deux nouveaux traits de test.

WithCachedRoutes : compilez vos routes une seule fois

Le trait WithCachedRoutes, contribué par Luke Kuzmish, compile vos routes une seule fois et les stocke en mémoire pour toute la suite de tests. Voici comment l’utiliser :

use App\Http\Controllers\UserController;
use Illuminate\Foundation\Testing\WithCachedRoutes;
use Tests\TestCase;

class UserControllerTest extends TestCase
{
    use WithCachedRoutes;

    public function test_user_index(): void
    {
        // Les routes sont compilées une seule fois pour tous les tests
        $response = $this->get(action([UserController::class, 'index']));

        $response->assertStatus(200);
    }
}

Avec Pest, la syntaxe devient encore plus concise :

use App\Http\Controllers\UserController;
use Illuminate\Foundation\Testing\WithCachedRoutes;

// Activer le trait pour tous les tests
pest()->use(WithCachedRoutes::class);

test('affiche la liste des utilisateurs', function () {
    $this->get(action([UserController::class, 'index']))
        ->assertStatus(200);
});

Les routes ne sont compilées qu’une seule fois au début de la suite de tests, puis réutilisées pour chaque test individuel.

WithCachedConfig : partagez la configuration entre les tests

Le trait WithCachedConfig, également proposé par Luke Kuzmish, fonctionne selon le même principe pour la configuration de votre application :

use Illuminate\Foundation\Testing\WithCachedConfig;
use Tests\TestCase;

class ConfigTest extends TestCase
{
    use WithCachedConfig;

    public function test_modifies_config(): void
    {
        // Modification locale de la config pour ce test
        config(['services.postmark.key' => 'xyz']);

        $this->assertEquals('xyz', config('services.postmark.key'));
    }

    public function test_uses_default_config(): void
    {
        // La config par défaut est restaurée automatiquement
        $this->assertNotEquals('xyz', config('services.postmark.key'));
    }
}

Chaque test peut modifier la configuration localement sans affecter les autres tests. Le trait restaure automatiquement les valeurs par défaut entre chaque test.

Amélioration de la commande model:show

Razin Shaikh a amélioré l’expérience développeur de la commande model:show. Désormais, si vous exécutez la commande sans argument, elle vous propose interactivement de sélectionner un modèle plutôt que d’afficher une erreur :

php artisan model:show

# Avant Laravel 12.38 : erreur
# À partir de Laravel 12.38 : prompt interactif avec suggestions

La commande propose automatiquement la liste des modèles disponibles dans votre application, facilitant ainsi la découverte et l’inspection de vos modèles Eloquent.

Support de Symfony 7.4

Laravel 12.38 officialise le support de Symfony 7.4, assurant la compatibilité avec les dernières dépendances du framework. Cette mise à jour inclut notamment des correctifs pour la méthode Request::getAcceptableContentTypes() qui a évolué dans Symfony 7.4.

use Illuminate\Http\Request;

class ApiController extends Controller
{
    public function index(Request $request)
    {
        // Fonctionne correctement avec Symfony 7.4
        $acceptedTypes = $request->getAcceptableContentTypes();

        if (in_array('application/json', $acceptedTypes)) {
            return response()->json(['data' => 'valeur']);
        }
    }
}

Améliorations complémentaires

Cette version apporte plusieurs autres optimisations de performance :

  • Mise en cache du résultat de configurationIsCached(), routesAreCached() et eventsAreCached()
  • Support SQLite pour la méthode whereNotMorphedTo
  • Gestion améliorée du failover AWS ElasticCache avec reconnexion automatique en mode READONLY
// Exemple d'utilisation de whereNotMorphedTo avec SQLite
use App\Models\Post;
use App\Models\User;

$comments = Comment::query()
    ->whereNotMorphedTo('commentable', Post::class)
    ->get();

// Récupère tous les commentaires qui ne sont pas liés à des Posts

Points d’attention

  • Les traits de cache (WithCachedRoutes et WithCachedConfig) sont particulièrement bénéfiques sur des projets avec de nombreux tests
  • Si vos tests modifient dynamiquement les routes, WithCachedRoutes peut ne pas convenir
  • Le trait WithCachedConfig fonctionne correctement avec les tests parallèles grâce au correctif de la version 12.38.1

Mise à jour

Pour profiter de ces nouveautés, mettez à jour votre projet Laravel :

composer update

Laravel 12.38 apporte des optimisations concrètes pour accélérer vos tests sans compromis sur la fiabilité. Les nouveaux traits de cache représentent une avancée significative pour les équipes qui maintiennent des suites de tests volumineuses.

Ressources

À propos de Laravel Actu

Développeur passionné par Laravel et son écosystème.

Voir tous les articles
Partager :