Le WordPress d'aujourd'hui, décodé pour les développeurs

Tests

Arguments nommés PHP 8 : rendre lisible un data provider PHPUnit à rallonge

Un data provider qui empile dix paramètres positionnels devient illisible à la relecture. Les arguments nommés de PHP 8.0 changent la donne.

Par WordPress Développement • 12 avril 2021 • 4 min de lecture • Aucun commentaire
Arguments nommés PHP 8 : rendre lisible un data provider PHPUnit à rallonge

[true, false, null, 'fr_FR', 3, false] : que représente chacune de ces six valeurs sans ouvrir la définition de la méthode testée ? C’est la question que pose tout data provider PHPUnit dont les cas de test s’accumulent avec le temps, chaque nouveau paramètre ajouté rendant la ligne précédente plus difficile à déchiffrer sans naviguer entre deux fichiers.

PHP 8.0 introduit les arguments nommés, qui permettent d’associer explicitement chaque valeur à son paramètre plutôt que de compter sur sa position dans la liste. Appliqués à un data provider fourni, ils transforment un tableau de valeurs opaques en une description directement lisible.

Le problème d’un data provider positionnel

public function fournisseur_configurations(): array {
    return [
        'utilisateur connecté, langue française' => [ true, false, null, 'fr_FR', 3, false ],
        'invité, langue anglaise, cache actif'    => [ false, true, null, 'en_US', 0, true ],
    ];
}

/**
 * @dataProvider fournisseur_configurations
 */
public function test_rendu_page( $connecte, $cache, $utilisateur, $locale, $tentatives, $mode_debug ): void {
    // ...
}

Le libellé du cas de test aide à comprendre l’intention générale, mais dès qu’il faut vérifier quelle valeur correspond à quel paramètre, la seule solution consiste à compter les virgules dans le tableau, puis à faire correspondre cette position avec la signature de la méthode testée, potentiellement dans un autre fichier ou plus bas dans le même fichier.

La méthode avec des arguments nommés

L'essentiel à retenir : Chaque valeur associée explicitement à son paramètre ; Fini le comptage de virgules pour relire un jeu de données ; Compatible avec les valeurs par défaut existantes
/**
 * @dataProvider fournisseur_configurations
 */
public function test_rendu_page(
    bool $connecte,
    bool $cache,
    ?int $utilisateur,
    string $locale,
    int $tentatives,
    bool $mode_debug
): void {
    // ...
}

public function fournisseur_configurations(): array {
    return [
        'utilisateur connecté, langue française' => [
            'connecte'    => true,
            'cache'       => false,
            'utilisateur' => null,
            'locale'      => 'fr_FR',
            'tentatives'  => 3,
            'mode_debug'  => false,
        ],
    ];
}

Techniquement, ce tableau associatif fonctionne déjà avec PHPUnit avant même l’existence des arguments nommés en PHP, du moment que les clés correspondent exactement au nom des paramètres attendus par la méthode de test. Ce que PHP 8.0 apporte en plus, c’est la possibilité de construire ces tableaux avec la même syntaxe explicite ailleurs dans le code, en particulier lors de l’appel direct d’une fonction utilitaire de préparation de fixture.

Là où le gain devient concret : construire la fixture elle-même

function construit_configuration(
    bool $connecte = false,
    bool $cache = false,
    ?int $utilisateur = null,
    string $locale = 'fr_FR',
    int $tentatives = 0,
    bool $mode_debug = false
): array {
    return compact( 'connecte', 'cache', 'utilisateur', 'locale', 'tentatives', 'mode_debug' );
}

$configuration = construit_configuration( locale: 'en_US', cache: true, tentatives: 5 );

Ici, seuls trois paramètres sur six sont précisés explicitement, dans un ordre qui ne correspond même pas à leur position dans la signature. Les autres conservent leur valeur par défaut. C’est cette combinaison, arguments nommés associée à des valeurs par défaut, qui rend un data provider particulièrement lisible : chaque cas de test ne montre que ce qui le distingue réellement du cas nominal, sans répéter les six paramètres à chaque fois.

Un jeu de données comparatif avant/après

ApprocheLisibilité à la relectureRisque d’inversion de paramètres
Tableau positionnelFaible, dépend de la mémorisation de l’ordreÉlevé, surtout après ajout d’un paramètre
Tableau associatif avec clésBonne, chaque clé nomme sa valeurFaible, une clé mal orthographiée est ignorée silencieusement par PHP en argument de tableau, à surveiller
Arguments nommés sur une fonction de fabriqueTrès bonne, seuls les écarts au cas par défaut apparaissentFaible, PHP lève une erreur sur un nom de paramètre inexistant

Cette dernière ligne du tableau mérite d’être soulignée : contrairement à un tableau associatif classique, un argument nommé mal orthographié dans un appel de fonction provoque une erreur immédiate à l’exécution, plutôt qu’une valeur silencieusement absente.

Un data provider illisible n’est jamais un problème de PHPUnit, mais un problème de choix d’écriture : nommer explicitement chaque valeur coûte quelques caractères de plus et fait gagner des minutes de relecture à chaque nouvelle contribution.

Une limite à connaître

Les arguments nommés ne peuvent pas être utilisés dans la définition même de la structure d’un data provider fourni à l’annotation @dataProvider, qui reste un tableau indexé ou associatif classique. Le gain se situe dans les fonctions de fabrique appelées depuis ce data provider, pas dans le mécanisme d’annotation de PHPUnit lui-même.

En résumé

Les arguments nommés de PHP 8.0 ne changent rien au comportement d’un data provider, mais ils transforment la façon dont une équipe construit les fixtures qui l’alimentent. Combinés à des valeurs par défaut sensées, ils permettent à chaque cas de test de ne montrer que ce qui compte réellement, ce qui réduit directement le temps passé à relire un jeu de données à rallonge.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Partager :

À propos de l'auteur

WordPress Développement

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi