Assurer la compatibilité des tests PHPUnit 6 avec les versions antérieures

Cet article a été publié depuis plus de 6 mois, cela signifie que le contenu peut ne plus être d'actualité.

PHPUnit version 6 a été tagguée le 3 février 2017. Cette nouvelle version n'est dorénavant compatible qu'avec PHP 7+. Un changement majeur introduit par cette nouvelle branche est le renommage de la classe PHPUnit_Framework_TestCase en PHPUnit\Framework\TestCase. Si comme moi, il vous arrive de tester une même branche de code avec plusieurs versions de PHP, cela pourra être un problème.

J'ai eu le cas cette semaine, où, sur une base de code toujours maintenu (mais plus pour très longtemps) sur les versions PHP 5.3+. Sans rentrer dans les détails techniques, pour simplifier l'exécution des tests, nous récupérons une version de PHPUnit avec la définition Composer suivante : phpunit/phpunit:@stable. Ce n'est certes pas l'idéal ni une excellente pratique, mais cela fonctionne bien.

Lors du passage des tests avec PHP 7, nous récupérons ainsi la version 6 de PHPUnit qui provoque alors une erreur puisque la classe PHPUnit_Framework_TestCase qui était utilisée jusque-là n'est plus disponible.

En attendant la fin du support des versions de PHP 5.x pour le code concerné, la solution de contournement utilisé a été de définir un alias de classe dans le "bootstrap" de PHPUnit de la manière suivante :

// Keep PHPUnit < 6.0 BC
if (!class_exists('PHPUnit_Framework_TestCase') && class_exists('PHPUnit\Framework\TestCase')) {
    class_alias('PHPUnit\Framework\TestCase', 'PHPUnit_Framework_TestCase');
}

De ce fait, si la classe PHPUnit_Framework_TestCase n'existe pas, c'est que nous sommes certainement en train d'éxecuter la nouvelle version de PHPUnit. Et nous définissons donc un alias vers la classe PHPUnit\Framework\TestCase si cette dernière existe.