web-dev-qa-db-fra.com

Passer des paramètres à PHPUnit

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

Pour exécuter dans ces différents endroits, il semble que la personne qui exécute le test devra indiquer où il est exécuté. Le test peut ensuite rechercher la configuration appropriée de la machine sur laquelle il fonctionne.

J'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 serais en mesure d'obtenir la valeur si le paramètre "X" (ou quoi que ce soit) et de 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 oublié quelque chose?

44
dl__

Une façon serait d'inspecter $ argv et $ argc. Quelque chose comme:

<?php

require_once 'PHPUnit/Framework/TestCase.php';

class EnvironmentTest extends PHPUnit_Framework_TestCase {
    public function testHasParam() {
            global $argv, $argc;
            $this->assertGreaterThan(2, $argc, 'No environment name passed');
            $environment = $argv[2];
    }
}

Ensuite, vous pouvez appeler votre phpunittest comme ceci:

phpunit EnvironmentTest.php my-computer
33
Paolo

Vous pouvez utiliser le commutateur --bootstrap de PHPUnit pour cela.

--bootstrap <file>       A "bootstrap" PHP file that is run before the tests.

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

$port = 4445;

Dans vos tests, vous pouvez saisir ces valeurs:

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

Exécutez ensuite:

phpunit --bootstrap boot.php MyTest.php
40
Mark Theunissen

Une manière élégante de passer des variables aux deux fichiers bootstrap ainsi que de tester des fichiers consiste à utiliser des variables d'environnement:

export MY_ENV_VAR="some value"

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/

15
scribu

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 doivent toujours être placées à la fin de la liste des paramètres, et il n'y a aucun indicateur pour indiquer qu'il s'agit d'options personnalisées. Si le nombre d'options personnalisées dont j'ai besoin n'est pas fixe, je devrais beaucoup coder 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. Semble étrange.

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

Le script Shell plus la solution setUp () partagent la même faiblesse avec la solution acceptée. Peut-être que vous devriez coder beaucoup pour analyser le fichier et gérer un nombre imprévisible d'options personnalisées.

Je ne pense pas que le script bootstrap 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 traiter correctement les pièces de rechange.

Je n'aime pas toutes les réponses ci-dessus.

Et je n'ai aucune bonne idée moi aussi. Mais peut-être que ce que j'ai fait pourrait vous inspirer. J'ai bifurqué le projet phpunit sur GitHub, et modifié un peu le code, et l'ai fait pour supporter la fonctionnalité d'options personnalisées.

enter image description here

La version modifiée de phpunit, pourrait accepter des options personnalisées comme celle-ci:

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

Et dans le test, vous pouvez visiter les options personnalisées en accédant aux super variables globales $ _SERVER

<?php

class CustomOptionTest extends PHPUnit_Framework_TestCase {

    public function testCustomOption() {
        $this->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).

Pour info. cet article est la solution similaire.

4
Charles

Comme Jasir l'a déjà mentionné, une solution sur une ligne serait de définir la variable d'environnement avant l'appel phpunit.

Sous Linux:

X=alpha phpunit unittest.php

Sur Windows probablement:

set X=johns_laptop && phpunit.bat unittest.php

Et à l'intérieur de votre script, utilisez

getenv('X')

lire la valeur

3
Victor

J'ai eu du mal avec ce problème précis et j'ai trouvé une sorte de solution hacky-pourtant-pratique: j'écris des paramètres dans un fichier sur le disque et les récupère dans la méthode setUp():

public function setUp() {
    $this->setBrowser('firefox');
    $this->base_url = file_get_contents("Selenium_Host");
    $this->setBrowserUrl($this->base_url);
}

Plutôt que d'appeler phpunit ou paratest directement, j'ai un script Shell pour lancer les tests. Celui-ci invoque paratest et me permet de spécifier le nombre de processus ainsi que l'hôte sur lequel j'aimerais que les tests s'exécutent.

run_all_tests.sh

if [ $1 ] 
then
    threads=$1
else
    threads=5
fi
if [ $2 ]
then
    echo $2 > Selenium_Host
else
    echo 'http://defaulthost.com' > Selenium_Host
fi

vendor/bin/paratest -p$threads -f --colors TestSuite.php

Ensuite, pour exécuter avec 7 threads contre http://adifferenthost.com :

./run_all_tests.sh 7 'http://adifferenthost.com'

2
ehed

Toutes les solutions ici sont valables pour la question, mais il existe encore un autre moyen qui pourrait être plus simple dans certaines situations. Phing prendra les arguments passés sous la forme -Dargument=value

Donc, en utilisant phing -Dtest=MyTest.class.php

Vous pouvez ensuite utiliser les conditions phing pour gérer ces arguments:

<if>
    <isset property="test" />
    <then>
        <property name="testFile" value="${test}" />
    </then>
    <else>
        <property name="testFile" value="AllTests.php" />
    </else>
</if>
<exec command="phpunit --bootstrap myTestFile/bootstrap.php- myTestFolder/${testFile}"
      passthru="true" returnproperty="phpunitreturn" />
2
Frug

La transmission d'arguments sur la ligne de commande aurait du sens si vous souhaitez faire varier les paramètres de test par exécution de test. L'exécution de tests spécifiques à l'hôte sur différentes machines n'est pas la meilleure justification de cette solution.

Pour cela, le fichier de configuration PHPUnit peut s'avérer plus approprié. Il vous permet de contrôler les variables spécifiques à l'hôte et même aux requêtes, y compris la manipulation de php.ini les paramètres ainsi que la définition des constantes, des variables globales, $_ENV, $_SERVER, et même $_GET, $_POST, etc. Tout cela se fait sous le <php> noeud du fichier de configuration, voir Setting PHP INI settings, Constants and Global Variables

Symfony2 utilise cette approche et fournit à la fois un phpunit.xml.dist (configuration par défaut) et un phpunit.xml avec vos tests unitaires. Ce dernier est gitignored pour vous permettre de le personnaliser pour chaque machine sans affecter le repo. Vous devez ensuite exécuter vos tests avec:

phpunit -c /path/to/phpunit.xml
1
gopherIT

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

user@local:/path/to/your/project$ phpunit
user@remote:/var/www/project$ phpunit

Edit: Vous parlez d'une configuration dépendante de la machine. (Quel type de conf btw?) Ma solution est de placer ces config sous le même endroit, non contrôlé par la version, puis de le lire/analyser le runtime, dans les méthds de configuration nécessaires par exemple.

0
erenon