Zend Framework - Tests unitaires

En général, nous pouvons déboguer une application PHP en utilisant le advanced debugger tool ou en utilisant des commandes simples comme echo et die. Dans un scénario Web, nous devons tester les logiques métier ainsi que la couche de présentation. Les formulaires d'une application Web peuvent être testés en saisissant des données de test pertinentes pour garantir que les formulaires fonctionnent comme prévu.

La conception d'un site Web peut être testée manuellement à l'aide d'un navigateur. Ces types de processus de test peuvent être automatisés à l'aide de tests unitaires. Un test unitaire est indispensable dans les grands projets. Ces tests unitaires aideront à automatiser le processus de test et à alerter le développeur en cas de problème.

Configuration de PHPUnit

Le framework Zend s'intègre au framework de tests unitaires PHPUnit. Pour écrire un test unitaire pour le framework Zend, nous devons configurer PHPUnit, ce qui peut être facilement fait en utilisant la commande Composer suivante.

$ composer require --dev phpunit/phpunit

Après avoir exécuté la commande ci-dessus, vous obtiendrez une réponse comme indiqué dans le bloc de code suivant.

Using version ^5.7 for phpunit/phpunit 
./composer.json has been updated 
Loading composer repositories with package information 
Updating dependencies (including require-dev) 
Nothing to install or update 
Writing lock file 
Generating autoload files

Maintenant, lorsque vous ouvrez le fichier «composer.json», vous verrez les changements suivants -

"require-dev": { 
   "phpunit/phpunit": "^5.7" 
}

TestCase et assertions

Le framework Zend fournit des classes d'assistance pour tester l'unité du contrôleur. leTestCase est le composant principal d'un PHPUnit framework pour écrire les cas de test et le Zend Framework fournit une implémentation abstraite du TestCase qui est appelée AbstractHttpControllerTestCase.

Ce AbstractHttpControllerTestCase fournit divers Assertméthodes et peuvent être regroupés par fonctionnalité. Ils sont les suivants -

  • Request Assertions- Utilisé pour affirmer la requête http. Par exemple, assertControllerName.

  • CSS Select Assertions - Utilisé pour vérifier le HTML de réponse à l'aide du modèle HTML DOM.

  • XPath Assertions - Une alternative aux assertions de sélection CSS basées sur XPath.

  • Redirect Assertions - Utilisé pour vérifier la redirection de page.

  • Response Header Assertions - Utilisé pour vérifier l'en-tête de la réponse comme le code d'état (assertResponseStatusCode)

Créer un répertoire de tests

Un test unitaire peut être écrit séparément pour chaque module. Tous les codages liés aux tests doivent être créés dans letest dossier sous le répertoire racine du module.

Par exemple, pour écrire un test pour le TutorialController disponible dans le module Tutorial, la classe de test doit être placée sous le répertoire myapp / module / Tutorial / test / Controller /.

Exemple

Écrivons une classe de test pour tester l'unité TutorialController.

Pour commencer, nous devons écrire une classe appelée TutorialControllerTest et l'étendre à AbstractHttpControllerTestCase.

La prochaine étape consiste à écrire un Setupméthode pour configurer l'environnement de test. Cela peut être fait en appelant lesetApplicationConfig méthode et en passant notre fichier de configuration d'application principale myapp / config / application.config.php

public function setUp() { 
   $configOverrides = [];  
   $this->setApplicationConfig(ArrayUtils::merge( include __DIR__ . '/../../../../config/application.config.php', $configOverrides 
   )); 
   parent::setUp(); 
}

Écrivez une ou plusieurs méthodes et appelez diverses méthodes d'assertion en fonction de l'exigence.

$this->assertMatchedRouteName('tutorial');

Nous avons écrit la classe de test et la liste complète est la suivante -

<?php  
namespace TutorialTest\Controller;  
use Tutorial\Controller\TutorialController; 
use Zend\Stdlib\ArrayUtils; 
use Zend\Test\PHPUnit\Controller\AbstractHttpControllerTestCase;  

class TutorialControllerTest extends AbstractHttpControllerTestCase { 
   public function setUp() { 
      $configOverrides = [];  
      $this->setApplicationConfig(ArrayUtils::merge( include __DIR__ . '/../../../../config/application.config.php', $configOverrides 
      ));  
      parent::setUp(); 
   }  
   public function testIndexActionCanBeAccessed() { 
      $this->dispatch('/tutorial', 'GET'); $this->assertResponseStatusCode(200); 
      $this->assertModuleName('tutorial'); $this->assertControllerName(TutorialController::class); 
      $this->assertControllerClass('TutorialController'); $this->assertMatchedRouteName('tutorial'); 
   } 
}

Maintenant, ouvrez une invite de commande, passez au répertoire racine de l'application et exécutez le phpunit exécutable disponible dans le vendor dossier.

cd /path/to/app  
./vendor/bin/phpunit ./vendor/bin/phpunit module/
   Tutorial/test/Controller/TutorialControllerTest.php

Le résultat sera comme indiqué dans le bloc de code suivant -

PHPUnit 5.7.5 by Sebastian Bergmann and contributors.  
.1 / 1 (100%)  
Time: 96 ms, Memory: 8.00MB  
OK (1 test, 5 assertions)