Pour expédier du code de qualité, nous devons avoir les tests en tête tout en codant (si nous ne faisons pas de TDD). Cependant, avec le large éventail d’outils de test PHP disponibles, il est difficile de faire un choix !
Cet article met en avant les outils de test les plus populaires et a été mis à jour pour refléter l’état des outils d’assurance qualité en 2021.
PHPUnit
PHPUnit est le framework de test par excellence pour PHP. Il a été créé par Sebastian Bergmann en 2004 et actuellement en version 6 qui nécessite PHP 7.
Nous avons de nombreux tutoriels à venir à ce sujet.
Cucumber
Cucumber est un framework permettant de créer des tests d’acceptation à partir de spécifications. Il est connu pour ses textes descriptifs générés qui peuvent être lus en anglais simple. L’implémentation PHP officielle de Cucumber est Behat.
L’exemple ci-dessous, tiré de la documentation, illustre bien l’expressivité de ces attentes.
Feature: Listing command
In order to change the structure of the folder I am currently in
As a UNIX user
I need to be able see the currently available files and folders there
Scenario: Listing two files in a directory
Given I am in a directory "test"
And I have a file named "foo"
And I have a file named "bar"
When I run "ls"
Then I should get:
"""
bar
foo
"""
Atoum
Atoum est un autre framework de test unitaire pour PHP. C’est un paquetage autonome que vous pouvez installer via GitHub, Composer ou via un fichier exécutable PHAR.
Les tests d’Atoum sont très lisibles avec des noms de méthodes et des enchaînements expressifs.
$this->integer($classInstance->myMethod())
->isEqualTo(10);
$this->string($classInstance->myMethod())
->contains("Something heppened");
Sélénium
Sélénium est un outil de test automatisé du navigateur (tests d’intégration et d’acceptation). Il transforme les tests en commandes API de navigateur et affirme les résultats attendus. Il supporte la plupart des navigateurs disponibles sur le marché.
Nous pouvons utiliser Selenium avec PHPUnit en utilisant une extension.
composer require --dev phpunit/phpunit
composer require --dev phpunit/phpunit-selenium
Voici un exemple simple :
class UserSubscriptionTest extends PHPUnit_Extensions_Selenium2TestCase
{
public function testFormSubmissionWithUsername()
{
$this->byName('username')->value('name');
$this->byId('subscriptionForm')->submit();
}
}
Crépuscule
Dusk de Laravel est un autre outil d’automatisation du navigateur. Il peut être utilisé de manière autonome (avec chromedriver) ou avec Selenium. Il a une API facile à utiliser et couvre toutes les possibilités de test comme l’attente d’éléments, le téléchargement de fichiers, le contrôle de la souris, etc. Voici un exemple simple :
class LanguagesControllerTest extends DuskTestCase
{
public function testCreate()
{
$this->browse(function (Browser $browser) {
$user = $this->getAdminUser();
$browser->loginAs($user)
->visit('/panel/core/languages')
->click('#add')
->assertPathIs('/panel/core/languages/create')
->type('name', 'Arabic')
->select('direction', 'rtl')
->press('Submit')
->assertSee('Language: Arabic')
->assertSee('ar')
->assertSee('rtl')
->assertSee('Language created');
});
}
}
Kahlan
Kahlan est un cadre de test Unit & ; BDD complet qui utilise une syntaxe describe-it.
describe("Positive Expectation", function() {
it("expects that 5 > 4", function() {
expect(5)->toBeGreaterThan(4);
});
});
Vous pouvez voir de la syntaxe ci-dessus qu’elle est similaire aux tests Behat. Kahlan prend en charge le stubbing et le mocking dès le départ, sans dépendances, la couverture de code, les rapports, etc.
it("makes a instance double with a parent class", function() {
$double = Double::instance(['extends' => 'KahlanUtilText']);
expect(is_object($double))->toBe(true);
expect(get_parent_class($double))->toBe('KahlanUtilText');
});
php_testability
Le dernier paquet que je veux mentionner ici est Testabilité de PHP. Il s’agit d’un outil d’analyse statique qui vous indique les problèmes de testabilité de votre programme et génère un rapport détaillé.
Le paquet n’a pas actuellement de version balisée sur laquelle vous pouvez compter, mais vous pouvez l’utiliser sans risque en développement. Vous pouvez l’installer via Composer :
composer require edsonmedina/php_testability "dev-master"
Exécutez-le ensuite comme ceci :
vendor/bin/testability . -x vendor
Services d’intégration continue (CI)
Une partie importante de la livraison du code lors du travail en équipe est la capacité de vérifier automatiquement le code avant qu’il ne soit fusionné au dépôt officiel du projet. La plupart des services/outils d’intégration continue disponibles permettent de tester le code sur différentes plates-formes et configurations afin de s’assurer que votre code peut être fusionné en toute sécurité.
Il existe de nombreux services qui proposent de bons tarifs, mais vous pouvez également utiliser des outils open source :
- PHPCI: (source ouverte)
- TravisCI: (gratuit pour les projets open source)
- SémaphoreCI: (gratuit pour les projets open source)
- Jenkins
Conclusion
Adopter la culture du test est difficile, mais cela se développe lentement avec la pratique. Si vous tenez à votre code, vous devez le tester !