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?
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
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
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/
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.
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.
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
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'
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" />
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
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.