← Retour à la liste
★★★★½ 4.8 / 5
Catégorie 04SKILLS

Drupal Testing

PHPUnit 11, pyramide Unit/Kernel/Functional/JS, DTT site existant, PHPStan 6, CI/CD

Installation
Via npx (recommandé)npx skill add ThomasRoger76/drupal-testing
Via gitgit clone https://github.com/ThomasRoger76/drupal-testing.git ~/.claude/skills/drupal-testing
Vérifier dans Claude Code/skills
VersionPHPUnit 11 (D11), DTT, PHPStan 6
PrixGratuit
Plateformes
Drupal 10Drupal 11
Commandes10
Exemples3
SKL
À propos

Skill de connaissance pure qui transforme Claude en expert tests automatisés Drupal 8-11+ avec PHPUnit 11 et PHP Attributes D11. Contenu injecté : pyramide de décision à 4 niveaux (Unit 0 bootstrap → Kernel avec container Drupal réel → Functional navigation HTTP → FunctionalJavascript Selenium), syntaxe PHPUnit 11 complète (#[Group] #[Test] #[CoversClass] #[DataProvider]), mocking services avec createMock/Prophecy, Kernel tests avec Entity API et Config API réels, Functional tests HTTP, Drupal Test Traits ExistingSiteBase (tests sur site existant sans réinstall — 10× plus rapide), PHPStan niveau 6 avec règles Drupal, phpcs standard Drupal, Rector dry-run, pipeline CI/CD GitLab avec seuil coverage 70% et ChromeDriver headless. Pas d'agents — skill de connaissance pure. Gain mesuré : pyramide de décision intégrée évite les Functional là où un Kernel suffirait (économie de 10× sur le temps d'exécution), code PHPUnit 11 correct (PHP Attributes vs annotations supprimées) dès le premier essai.

Fonctionnalités clés
Pyramide de décision — toujours le niveau minimum suffisantUnit (mocks, 0 bootstrap), Kernel (container Drupal réel), Functional (HTTP), FunctionalJS (Selenium). Règle absolue : Functional pour ce qu'un Kernel couvre = 10× plus lent sans bénéfice.
PHPUnit 11 — PHP Attributes D11, annotations suppriméesSyntaxe complète #[Group], #[Test], #[CoversClass], #[DataProvider]. Génère des tests compatibles PHPUnit 11 D11 sans aucune annotation @ deprecated.
Kernel Tests — Entity et Config API avec vrai container DrupalinstallEntitySchema(), installSchema(), installConfig() uniquement pour ce qui est nécessaire. Tests de l'Entity API, Config API, hooks invoqués, Queue, Cron, emails avec test_mail_collector.
Drupal Test Traits — site existant, 10× plus rapideExistingSiteBase utilise la vraie base de données sans réinstallation. createUser(), drupalLogin(), assertions Session disponibles. Idéal pour les smoke tests post-déploiement.
PHPStan 6 + phpcs + Rector — analyse statique intégréePHPStan niveau 6 avec mglaman/phpstan-drupal. phpcs standard Drupal (2 espaces, docblocs). Rector dry-run pour visualiser les corrections de dépréciations avant application.
Pipeline CI/CD GitLab — validate + test + coverage3 stages : validate (phpcs+phpstan+rector en parallèle), test (Unit+Kernel avec seuil coverage 70%), functional (ChromeDriver headless). Artifacts HTML en téléchargement.
Commandes
CommandeDescription
vendor/bin/phpunit web/modules/custom/mon_module/tests/ --testdoxLancer les tests d'un module avec sortie lisible (noms de méthodes)
vendor/bin/phpunit --group=mon_moduleLancer les tests d'un groupe — #[Group('mon_module')] PHPUnit 11
vendor/bin/phpunit --testsuite=unitUnit tests uniquement (0 bootstrap Drupal, les plus rapides)
vendor/bin/phpunit --testsuite=kernelKernel tests (Entity/Config API, hooks — container Drupal réel)
vendor/bin/phpunit --coverage-html reports/ --coverage-clover coverage.xmlRapport de couverture HTML + Clover XML (nécessite Xdebug ou PCOV)
vendor/bin/phpstan analyse web/modules/custom/ --level=6Analyse statique niveau 6 (types, dépréciations, services inexistants)
vendor/bin/phpcs --standard=Drupal,DrupalPractice web/modules/custom/Coding standards Drupal (2 espaces, docblocs obligatoires)
vendor/bin/phpcbf --standard=Drupal web/modules/custom/Corriger automatiquement les violations de coding standards
vendor/bin/rector process web/modules/custom/ --dry-runPrévisualiser les corrections de dépréciations sans modifier les fichiers
vendor/bin/phpunit --list-tests web/modules/custom/Lister tous les tests disponibles sans les exécuter
Exemples
Kernel Test — Entity API avec setup minimalCODE
<?php
#[Group('article_stats')]
class ArticleStatsServiceTest extends KernelTestBase {
  protected static $modules = ['node', 'field', 'user', 'system', 'article_stats'];

  protected function setUp(): void {
    parent::setUp();
    $this->installEntitySchema('node');
    $this->installEntitySchema('user');
    $this->installSchema('system', ['sequences']);
    NodeType::create(['type' => 'article', 'name' => 'Article'])->save();
  }

  #[Test]
  public function testCountsOnlyPublishedArticles(): void {
    Node::create(['type' => 'article', 'title' => 'Publie', 'status' => 1])->save();
    Node::create(['type' => 'article', 'title' => 'Brouillon', 'status' => 0])->save();

    $service = $this->container->get('article_stats.service');
    $this->assertEquals(1, $service->getPublishedCount('article'));
  }
}
Smoke tests post-déploiement avec Drupal Test TraitsCODE
<?php
// Pas de réinstall — utilise la vraie DB de prod, 10× plus rapide
class SmokeTest extends ExistingSiteBase {

  #[Test]
  public function testFrontPageLoads(): void {
    $this->drupalGet('/');
    $this->assertSession()->statusCodeEquals(200);
    $this->assertSession()->elementExists('css', 'h1');
  }

  #[Test]
  public function testEditorCanCreateArticle(): void {
    $user = $this->createUser(['create article content', 'edit own article content']);
    $this->drupalLogin($user);
    $this->drupalGet('/node/add/article');
    $this->assertSession()->statusCodeEquals(200);
    $this->assertSession()->fieldExists('title[0][value]');
  }
}
// SIMPLETEST_BASE_URL=https://mon-site.com vendor/bin/phpunit tests/smoke/
Pipeline GitLab CI — validate + test + coverage 70%CODE
# .gitlab-ci.yml
stages: [validate, test, functional]

validate:
  stage: validate
  parallel:
    matrix:
      - TOOL: [phpcs, phpstan, rector]
  script:
    - if [ "$TOOL" = "phpcs" ]; then vendor/bin/phpcs --standard=Drupal web/modules/custom/; fi
    - if [ "$TOOL" = "phpstan" ]; then vendor/bin/phpstan analyse web/modules/custom/ --level=6; fi
    - if [ "$TOOL" = "rector" ]; then vendor/bin/rector process web/modules/custom/ --dry-run; fi

test:
  stage: test
  script:
    - vendor/bin/phpunit --testsuite=unit,kernel --coverage-clover=coverage.xml
    - php -r "if (simplexml_load_file('coverage.xml')->attributes()['line-rate'] < 0.70) { exit(1); }"
  artifacts:
    reports: { coverage_report: { coverage_format: cobertura, path: coverage.xml } }
Points forts & faibles
Points forts
+Pyramide de décision — plus jamais de Functional pour du Kernel
+PHPUnit 11 PHP Attributes D11 corrects dès le premier essai
+DTT pour tester en production sans réinstall — workflow post-déploiement
+Pipeline CI/CD GitLab complet avec seuil coverage configurable
Points faibles
FunctionalJavascript nécessite ChromeDriver — infrastructure supplémentaire
Coverage nécessite Xdebug ou PCOV (impact sur les performances)
Verdict

Référence complète pour tester du code Drupal custom à tous les niveaux. La pyramide de décision et l'intégration DTT couvrent les cas d'usage quotidiens comme les smoke tests post-déploiement en production.

Développeurs Drupal backend, équipes qui mettent en place du TDD ou de la CI/CD Drupal