# Tests E2E dans WordPress Playground : des environnements jetables

> Lancer une suite de tests E2E sur des instances Playground ou wp-now jetables, avec des blueprints de données prêts à l'emploi, et connaître leurs limites.

- Auteur : Clément Hadrot
- Publié le : 2024-12-25
- Mis à jour le : 2024-12-25
- Catégorie : Tests
- URL : https://wpmoderne.dev.wordpress-developpement.fr/tests/tests-e2e-wordpress-playground-jetables/

## L’essentiel

- Chaque exécution de CI démarre sur une instance strictement vierge
- Les blueprints décrivent l'état initial en JSON, versionnable avec le projet
- Certaines extensions dépendant de vraies requêtes réseau restent hors de portée

Le jour de Noël, pendant que la majorité de l'équipe était en congé, on a profité du calme pour finaliser un chantier resté en attente depuis plusieurs mois : remplacer les conteneurs Docker un peu lourds utilisés pour les tests E2E par des instances WordPress Playground jetables, démarrées en quelques secondes directement dans le job de CI, sans image à construire ni base de données à provisionner manuellement.

WordPress Playground, ce moteur qui exécute WordPress entièrement dans un environnement WebAssembly sans serveur PHP traditionnel, n'est pas qu'une démo impressionnante pour tester rapidement un thème : couplé à `wp-now` pour un usage en ligne de commande, il devient un outil sérieux pour des tests E2E rapides à instancier, avec des garanties d'isolation que les conteneurs classiques peinent parfois à offrir aussi simplement.

## Pourquoi des instances jetables changent la donne

Le problème récurrent avec des environnements de test partagés ou réutilisés d'une exécution à l'autre, c'est la contamination progressive : une option laissée en base par un test précédent, un utilisateur créé et jamais supprimé, un plugin resté activé, qui finissent par fausser les résultats de tests censés partir d'un état neutre. Une instance Playground démarrée à chaque exécution, entièrement en mémoire, élimine ce problème par construction : il n'y a littéralement rien à nettoyer entre deux exécutions, puisque rien ne persiste.

## Décrire l'état initial avec un blueprint

Playground utilise des « blueprints », des fichiers JSON qui décrivent précisément l'état de départ souhaité : version de WordPress, extensions et thème à installer, contenus à créer, options à définir. Ce fichier se versionne avec le projet, au même titre que le code testé, ce qui rend l'environnement de test reproductible à l'identique par n'importe quel membre de l'équipe :

```
{
  "landingPage": "/wp-admin/",
  "preferredVersions": {
    "php": "8.2",
    "wp": "6.7"
  },
  "steps": [
    { "step": "login", "username": "admin", "password": "password" },
    {
      "step": "installPlugin",
      "pluginZipFile": { "resource": "url", "url": "https://example.test/mon-extension.zip" }
    },
    {
      "step": "runPHP",
      "code": "<?php wp_insert_post(['post_title' => 'Article de test E2E', 'post_status' => 'publish']);"
    }
  ]
}
```

> L'essentiel à retenir : Chaque exécution de CI démarre sur une instance strictement vierge ; Les blueprints décrivent l'état initial en JSON, versionnable avec le projet ; Certaines extensions dépendant de vraies requêtes réseau restent hors de portée

## Lancer wp-now depuis un job de CI

Pour un usage en ligne de commande, `wp-now` démarre une instance locale à partir d'un blueprint, sur un port dédié, ce qui permet de piloter le navigateur de test contre cette instance comme contre n'importe quel serveur WordPress classique :

```
npx @wp-now/wp-now start --blueprint=./tests/blueprint-e2e.json --port=8881 &
npx wait-on http://localhost:8881
npx playwright test --config=playwright.config.ts
```

Le temps de démarrage observé, sur les projets où on l'a mesuré, tourne autour de quelques secondes, nettement plus rapide qu'un conteneur Docker complet avec sa propre base MySQL à initialiser, ce qui réduit d'autant la durée totale du pipeline de CI sur des suites qui démarrent et arrêtent l'environnement plusieurs fois.

## Les limites à connaître avant de tout migrer

Playground repose sur SQLite plutôt que sur MySQL par défaut, via le plugin d'intégration SQLite for WordPress. La grande majorité du code applicatif ne voit aucune différence, mais un test qui vérifierait explicitement une requête SQL brute écrite pour la syntaxe MySQL, ou qui dépendrait d'une fonctionnalité spécifique au moteur MySQL, ne peut pas se fier à ce type d'instance et doit rester sur un environnement MySQL classique.

Autre limite réelle : toute extension qui effectue de vrais appels réseau sortants, vers une passerelle de paiement ou une API tierce, ne peut pas être testée de façon fiable dans cet environnement sans mise en place d'un mock réseau, l'environnement WebAssembly imposant des contraintes spécifiques sur les requêtes HTTP sortantes selon le contexte d'exécution.

### Cas d'usage à privilégier

- Tests d'interface d'administration d'une extension, sans dépendance réseau externe
- Tests de rendu d'un thème ou d'un bloc Gutenberg sur différents contenus de démonstration
- Vérification rapide de compatibilité d'une extension sur plusieurs versions de WordPress en parallèle, chaque instance démarrant avec sa propre version déclarée dans le blueprint

## Paralléliser sur plusieurs versions de WordPress

L'un des bénéfices les plus concrets constatés : faire tourner la même suite E2E sur trois versions différentes de WordPress simultanément, chacune dans sa propre instance Playground jetable, simplement en changeant la valeur `preferredVersions.wp` du blueprint dans trois jobs de CI parallèles. Sur un projet d'extension distribuée publiquement, qui doit rester compatible avec les deux ou trois dernières versions majeures du cœur, cette matrice aurait demandé trois conteneurs Docker distincts à maintenir auparavant.

> Un environnement de test qui ne laisse littéralement aucune trace derrière lui élimine une catégorie entière de bugs de tests, ceux qu'on croit provoqués par le code alors qu'ils viennent en réalité d'un résidu de l'exécution précédente.

## En résumé

WordPress Playground et wp-now apportent une rapidité de démarrage et une isolation par construction qui simplifient réellement une suite E2E, en particulier pour des tests de matrice multi-versions ou des vérifications d'interface sans dépendance réseau. Ils ne remplacent pas totalement un environnement MySQL classique pour les projets qui en dépendent explicitement, ni les scénarios impliquant de vrais appels réseau sortants : le bon réflexe consiste à réserver Playground aux scénarios qui n'en ont pas besoin, et à garder un environnement traditionnel pour le reste.
