Position actuelle: Accueil> Derniers articles> Comment utiliser la fonction get_defined_constants pour une comparaison instantanée constante dans le test phpunit?

Comment utiliser la fonction get_defined_constants pour une comparaison instantanée constante dans le test phpunit?

M66 2025-06-11

Dans le processus de développement des projets PHP, en particulier lorsqu'un grand nombre de constantes de configuration sont impliquées, garantissant que la valeur constante n'est pas accidentellement modifiée pendant l'exécution du code est une partie très importante. Lorsque vous utilisez PHPUNIT pour les tests unitaires, il est courant d'affirmer les résultats de sortie de la fonction ou le comportement de la classe, mais il n'est pas suffisamment intuitif pour détecter des changements constants.

Cet article présentera comment utiliser la fonction GET_DEFINED_CONSTANTS intégrée de PHP combinée avec PHPUnit pour enregistrer et comparer le "instantané" d'une collection constante, afin de détecter facilement les changements de constantes pendant le processus de test.

Quelle est la fonction get_defined_constants ?

get_defined_constants est une fonction fournie par PHP pour renvoyer toutes les constantes actuellement définies. Il peut accepter un paramètre booléen, et si True est passé, il renvoie un tableau de constantes groupées par catégorie.

Exemple de code:

 $constants = get_defined_constants(true);
print_r($constants['user']);  // Obtenez uniquement des constantes définies par l'utilisateur

Cela nous permet d'obtenir tous les instantanés constants définis par l'utilisateur actuel pour des comparaisons plus faciles.

Pourquoi avez-vous besoin d'instantanés et de comparer les constantes?

Dans les tests unitaires, si un morceau de code modifie incorrectement une constante, il peut provoquer un comportement anormal du système. Cependant, les constantes ne peuvent pas être redéfinies ou modifiées une fois définies, donc cette "modification" se manifeste généralement comme redéfinissant une constante avec le même nom à certains égards, ou manquant une constante attendue en raison de changements environnementaux.

En comparant les instantanés constants avant et après le test, vous pouvez découvrir en temps opportun des constantes d'ajout, supprimées ou modifiées en temps opportun pour assurer la stabilité du programme.

Idées de mise en œuvre

  1. Capture des instantanés <br> Avant le début du cas de test, appelez get_defined_constants (true) ['utilisateur'] pour enregistrer le tableau de constantes définies par l'utilisateur actuel.

  2. Exécuter le code <br> Exécutez la logique de code qui doit être testée et il peut y avoir des constantes nouvelles ou modifiées.

  3. Capturez à nouveau l'instantané <br> Re-Call get_defined_constants (true) ['utilisateur'] pour obtenir l'état constant actuel.

  4. Instantané comparatif <br> Comparez les deux instantanés pour trouver des valeurs nouvelles, supprimées ou différentes.

  5. Vérification de l'affirmation <br> Comme prévu, utilisez des assertions phpunit pour vous assurer que la constante n'a pas été modifiée de manière inattendue.

Exemple de code spécifique

Voici un exemple d'utilisation du phpunit pour une comparaison instantanée constante:

 use PHPUnit\Framework\TestCase;

class ConstantSnapshotTest extends TestCase
{
    private array $initialConstants;

    protected function setUp(): void
    {
        // Enregistrer les instantanés constants initiaux
        $this->initialConstants = get_defined_constants(true)['user'] ?? [];
    }

    public function testConstantSnapshot()
    {
        // Supposons qu&#39;il s&#39;agit d&#39;un bloc de code de test,Possible de définir ou de modifier les constantes
        if (!defined('MY_CONST')) {
            define('MY_CONST', 'initial_value');
        }

        // Récupérer des instantanés constants
        $currentConstants = get_defined_constants(true)['user'] ?? [];

        // Comparaison de deux instantanés,Trouver les changements
        $added = array_diff_key($currentConstants, $this->initialConstants);
        $removed = array_diff_key($this->initialConstants, $currentConstants);
        $modified = [];

        foreach ($currentConstants as $key => $value) {
            if (isset($this->initialConstants[$key]) && $this->initialConstants[$key] !== $value) {
                $modified[$key] = [
                    'old' => $this->initialConstants[$key],
                    'new' => $value,
                ];
            }
        }

        // Informations de débogage de sortie(Vous pouvez commenter ou écrire des journaux pendant les tests réels)
        print_r([
            'added' => $added,
            'removed' => $removed,
            'modified' => $modified,
        ]);

        // Affirmer qu&#39;il n&#39;y a pas de constantes nouvelles ou supprimées
        $this->assertEmpty($added, 'Il ne devrait pas y avoir de nouvelles constantes');
        $this->assertEmpty($removed, 'Il ne devrait pas y avoir de constantes supprimées');

        // Affirmer que la valeur constante n&#39;est pas modifiée
        $this->assertEmpty($modified, 'Il ne devrait pas y avoir de constantes modifiées');
    }
}

Choses à noter

  • Les constantes ne peuvent pas être redéfinies
    PHP n'autorise pas les définitions répétées des constantes avec le même nom, sauf si elles sont utilisées avec des moyens spéciaux (comme l'exécution d'un espace de noms différent). Cette limitation doit être prise en considération lors des tests.

  • Dépendance environnementale <br> Certaines constantes sont automatiquement définies par l'environnement, et différents environnements avant et après les tests peuvent entraîner des différences d'instantané. Il est recommandé de comparer uniquement les pièces constantes définies par l'utilisateur.

  • Impact de la performance <br> La comparaison des instantanés fréquents d'un grand nombre de constantes peut avoir un léger impact sur les performances, mais il est généralement acceptable.

En combinaison avec des projets réels

Supposons que votre projet implique des configurations complexes, ou que l'exécution chargera dynamiquement différentes constantes de définition de module, cette méthode de comparaison d'instantané peut détecter automatiquement les exceptions de configuration dans le processus CI.

Par exemple, lors des tests d'intégration, assurez-vous que toutes les constantes de configuration répondent aux attentes et évitez l'inadéquation de la configuration en ligne.

résumé

Grâce à la fonction get_defined_constants combinée avec PHPUnit, la comparaison constante de l'instantané peut être facilement implémentée pour assurer la stabilité de l'ensemble constant. Cette méthode est simple et facile à utiliser et convient aux tests automatisés des projets PHP sensibles constants.

Si vous avez des demandes plus approfondies pour la gestion et les tests constants, vous pouvez encapsuler davantage les outils de comparaison des instantanés, la combinaison de journaux et la gestion des exceptions pour améliorer la qualité du code et la fiabilité du projet.