mediatribe.net -- Drupal and Web Development

Notice: this post was last updated 3 years 32 weeks ago so it might be outdated. Please be cautious before implementing any of suggestions herein.

Écrire des tests automatisés pour Wordpress

Nous tentons dans mon agence d'implémenter des tests automatisés pour plusieurs technologies avec lesquelles nous travaillons.

Pour Drupal, la méthode que nous avons mise en place est documentée sur le site Dcycle.

Pour Wordpress, je me suis basé sur cette méthode pour donner la procédure suivante.

Étant un développeur Drupal, le monde du Wordpress m'est à peu près inconnu, alors si quelque chose ici ne suit pas les normes reconnues de la communauté, je m'en excuse; n'hésitez pas à m'en faire part dans la section "commentaires".

Voici donc les étapes que j'ai suivies qui me permettent de faire des tests automatisés sur un projet Wordpress:

(1) Vous assurer que phpunit et svn soient installés sur votre machine

phpunit --version
svn --version

ne devraient pas donner "command not found".

(2) aller dans dans votre répertoire wordpress local

WPDIR=/chemin/vers/wordpress
cd $WPDIR

(3) si le répertoire wordpress-develop n'existe pas dans votre répertoire wordpress, l'installer:

svn co http://develop.svn.wordpress.org/trunk/ wordpress-develop
cd wordpress-develop

(4) contrairement à Drupal qui gère automatiquement les bases de données jetables pour les tests, pour Wordpress, il faut créer une base de données à cette fin. Attention: si vous utilisez votre BD existante, tout votre contenu sera effacé! (paraît-il).

TESTDB=wptest
echo "create database $TESTDB" | mysql -uroot -proot

(5) créer le document qui contient l'info sur votre BD:

cp wp-tests-config-sample.php wp-tests-config.php

(6) ouvrir wp-tests-config.php avec un éditeur texte et y mettre les infos sur votre BD de tests.

(7) wordpress-develop/src contient une installation complète de Wordpress. Puisque votre code personnalisé se trouve dans wp-content, il faut retirer wordpress-develop/src/wp-content et y mettre plutôt un alias vers votre code.

cd src
rm -rf wp-content
ln -s ../../wp-content wp-content
cd ..

(8) Dire au test d'utiliser votre thème:

THEME=nom_machine_de_mon_theme
echo "define( 'WP_DEFAULT_THEME', '$THEME' );" >> wp-tests-config.php

(9) À présent écrivons notre premier test, nous assurant que notre thème a été bien installé. Pour ce faire, nous allons créer un document tests/phpunit/tests/my.php et y mettre:

<?php
/**
 * @file
 * See http://mediatribe.net/fr/node/95
 */

class Test_My extends WP_UnitTestCase {
  function test_simple() {
    $this->assertEquals(wp_get_theme(), 'Nom humain de mon thème');
  }
}

(10) roulons à présent notre test:

phpunit tests/phpunit/tests/my.php

(11) vous devrez voir à présent:

OK (1 test, 1 assertion)

(12) mettons à présent un .htaccess dans wordpress-develop pour éviter que ce répertoire ne soit accessible sur le web:

echo 'Deny from all' >> .htaccess

(13) Ajoutons tout ça à notre répertoire .git et poussons ça à master. (À noter que wordpress-develop/wp-tests-config.php ne se trouvera pas dans git car il y a une ligne spécifiant qu'il doit être ignoré dans wordpress-develop/.gitignore.)

cd ../
git add .
git commit -am 'Added a test, see http://mediatribe.net/fr/node/95'
git push origin master

Intégration continue

Suivez les étapes suivantes si vous avez un serveur d'intégration continue comme Jenkins qui teste votre code sur chaque push.

(14) Faites rouler votre job au moins une fois pour récupérer votre nouveau code, notamment le répertoire wordpress-develop.

(14) Vous connecter en ligne de commande avec l'utilisateur jenkins sur votre serveur d'intégration continue.

(15) Refaites les étapes (1), (2), (4), (5), (6) et (8), ci-dessus, mais sur votre serveur d'intégration continue (il se peut que vous deviez installer phpunit sur votre serveur):

phpunit --version
cd /var/lib/jenkins/workspace/monprojetjenkins
TESTDB=wptest
echo "create database $TESTDB" | mysql -uroot -proot
cd wordpress-develop
cp wp-tests-config-sample.php wp-tests-config.php
vi wp-tests-config.php # et mettre vos infos de DB
THEME=nom_machine_de_mon_theme
echo "define( 'WP_DEFAULT_THEME', '$THEME' );" >> wp-tests-config.php

(16) Croisez-vous les doigts et votre test devrait passer.

phpunit tests/phpunit/tests/my.php

(17) maintenant ajouter cette ligne à votre job d'intégration continue, par exemple à http://jenkins.example.com/job/monprojet/configure:

cd wordpress-develop && phpunit tests/phpunit/tests/my.php

(18) lancer un build de votre job jenkins ("Build now"). Votre test devrait passer (indicateur bleu sur Jenkins).

(19) Voyez ce qui se passe lorsque votre test ne passe pas. Ajoutez cette fonction dans wordpress-develop/tests/phpunit/tests/my.php

...
function test_fail() {
  $this->assertEquals(1, 2);
}
...

(20) Poussez ça sur master.

git commit -am 'exemple de test qui ne passe pas'
git push origin master

(21) Si votre job Jenkins n'est pas configurée pour être déclanchée automatiquement lors d'un changement au répertoire git, lancez votre job.

(22) Si tout marche, vous verrez un beau point rouge signalant un échec de votre test.

(23) Commentez votre test qui échoue (gardez-le pour faire des démos sur le fonctionnement des tests, à l'intention de votre équipe), puis poussez à nouveau votre code, dorénavant fonctionnel.