48 votes

Transmettre des paramètres à PHPUnit

Je commence à écrire des tests PHPUnit et j'aimerais que les tests soient exécutés à la fois sur les machines des développeurs et sur nos serveurs. Les machines des développeurs sont configurées différemment des serveurs et même différemment les unes des autres.

Pour s'exécuter à ces endroits différents, il semble que la personne qui exécute le test devra indiquer où il est en cours d'exécution. Le test peut ensuite rechercher la configuration appropriée de la machine sur laquelle il s'exécute.

Je m'imagine quelque chose comme:

phpunit.bat -X johns_laptop unittest.php

ou sur le serveur alpha:

phpunit -X alpha unittest.php

Dans le test, je pourrais obtenir la valeur du paramètre 'X' (ou autre chose) et savoir, par exemple, quel est le chemin d'accès à la racine de l'application pour cette machine.

Il ne semble pas que la ligne de commande le permette - ou ai-je manqué quelque chose?

46voto

Mark Theunissen Points 673

Vous pouvez utiliser l'option --bootstrap de PHPUnit pour cela.

--bootstrap        Un fichier PHP "bootstrap" qui est exécuté avant les tests.

Ensuite, créez un fichier bootstrap.php qui contient des variables :

$port = 4445;

Dans vos tests, vous pouvez obtenir ces valeurs :

global $port;
$this->setPort($port);

Ensuite, exécutez :

phpunit --bootstrap boot.php MyTest.php

3 votes

Je pense que cette solution répond plus adéquatement à la question originale que la réponse déjà sélectionnée de Paulo. C'est précisément le but du fichier bootstrap.

4 votes

@WallyLawless parfois les valeurs ne peuvent pas être codées en dur et doivent être envoyées dynamiquement en tant que paramètre CL

2 votes

Ceci est certainement utile, mais manque le point de la question originale, qui était comment passer des arguments à la ligne de commande.

34voto

Paolo Points 419

Une façon serait de vérifier $argv et $argc. Quelque chose comme:

assertGreaterThan(2, $argc, 'Aucun nom d'environnement passé');
            $environment = $argv[2];
    }
}

Ensuite, vous pouvez appeler votre phpunittest de cette manière:

phpunit EnvironmentTest.php mon-ordinateur

0 votes

Cela semble prometteur, je vais essayer cela

2 votes

Phpunit utilise également des arguments, de cette façon vous ne pouvez pas les utiliser du tout

0 votes

Les premières méthodes ont été supprimées. Merci @jimbo. Je voulais juste montrer les points d'extension, mais j'imagine que c'est une connaissance générale de PHPUnit.

17voto

scribu Points 1150

Une façon élégante de passer des variables à la fois aux fichiers bootstrap et aux fichiers de test est d'utiliser des variables d'environnement :

export MY_ENV_VAR="valeur quelconque"

phpunit all

Ensuite, dans vos fichiers PHP, vous pouvez y accéder comme ceci :

getenv('MY_ENV_VAR')

Source : http://blog.lysender.com/2010/10/phpunit-passing-environment-variable-to-your-application/

1 votes

J'ai besoin d'utiliser export MY_ENV_VAR="some value" pour que cela fonctionne.

4voto

Charles Points 451

Je ne pense pas que les réponses ci-dessus résolvent mon même problème.

La réponse acceptée n'est pas parfaite. De cette façon, les options personnalisées devraient toujours être placées à la fin de la liste de paramètres, et il n'y a pas d'indicateur pour dire qu'elles sont des options personnalisées. Si le nombre d'options personnalisées dont j'ai besoin n'est pas fixe, je devrais coder beaucoup pour analyser les options personnalisées avec des expressions régulières ou quelque chose comme ça.

La solution des variables d'environnement est bonne, mais pas naturelle. Cela semble bizarre.

VAR1=aaa VAR2=bbb VAR3=ccc ./phpunit-custom-option CustomOptionTest.php

La solution du script shell plus setUp() partage la même faiblesse que celle acceptée. Peut-être devriez-vous coder beaucoup pour analyser le fichier et gérer des nombres imprévisibles d'options personnalisées.

Je ne pense pas que le script de démarrage soit la bonne solution. Il pourrait être utilisé pour gérer automatiquement les tâches sales, en faisant les mêmes choses à chaque fois mais sans bien traiter les parties modifiées.

Je n'aime aucune des réponses ci-dessus.

Et je n'ai pas non plus de bonne idée moi-même. Mais peut-être que ce que j'ai fait pourrait vous donner de l'inspiration. J'ai forké le projet phpunit sur GitHub, et j'ai modifié un peu le code, et je l'ai rendu compatible avec la fonctionnalité d'option personnalisée.

entrer ici une description de l'image

La version modifiée de phpunit pourrait accepter des options personnalisées comme ceci :

./phpuint-custom-option --custom var1=value1 --custom var2=value2 CustomOptionTest.php

Et dans le test, vous pouvez accéder aux options personnalisées en accédant aux variables superglobales $_SERVER

assertEquals('value1', $_SERVER['var1']);
        $this->assertEquals('value2', $_SERVER['var2']);
    }
}

et vous pouvez trouver mon code ici, et télécharger la version modifiée ici (en cliquant sur le lien "voir le fichier complet" sur la page).

FYI. cet article est une solution similaire.

-1voto

erenon Points 9361

Si vous souhaitez exécuter des tests sur une machine distante, utilisez ssh puis exécutez-le. Sur une machine locale, il vous suffit de vous rendre dans votre répertoire racine, puis d'exécuter phpunit.

utilisateur@local:/chemin/vers/votre/projet$ phpunit
utilisateur@à distance:/var/www/projet$ phpunit

Modifier : Vous parlez d'une configuration dépendante de la machine. (Quel type de configuration d'ailleurs ?) Ma solution consiste à mettre ces configurations au même endroit, non versionné, puis les lire/parser à l'exécution, dans les méthodes de configuration nécessaires par exemple.

0 votes

Je sais comment exécuter phpunit. Ma question est comment passer des informations de configuration afin qu'il puisse être conscient de la configuration de cette machine?

0 votes

Je pense que je vois ce que vous suggérez. Le problème est que je voudrais que les configurations soient sous contrôle de version. Elles peuvent changer avec le temps et j'aimerais les suivre.

0 votes

@dl: Cela n'a aucun sens pour moi. Si vous voulez contrôler la version des configurations, pourquoi sont-elles différentes sur différentes machines?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X