Comme tout framework qui se respecte, Symfony possède une interface permettant d’écrire et exécuter des tests unitaires et fonctionnels.
Voyons un petit peu celle-ci.
Dans votre projet, vous avez le dossier test qui contient trois dossiers.
Bootstrap
Ce dossier contient deux fichiers. functional.php et unit.php.
Ils sont à inclure au début de chacun de vos tests et permettent d’instancier l’environnement.
Unit
Passons donc maintenant aux choses sérieuses avec les tests unitaires 
Voici un exemple de tests :
require_once dirname(__FILE__).'/../bootstrap/unit.php';
$t = new lime_test(2, new lime_output_color());
$t->comment('is the valid() method valid?');
$t->is(Post::my_test(true), true, 'valid() return the argument we give him');
$t->is(Post::my_test(false), false, 'valid() return the argument we give him');
A côté de ce test, nous avons un modèle Post qui contient une méthode my_test, celle-ci étant on ne peut plus basique puisqu’elle retourne la valeur que l’on lui donne.
Pour commencer, vous constatez que en première ligne de nos tests, nous incluons le bootstrap des tests unitaires.
Ensuite nous créons notre nouveau test, en y signalant que nous aurons deux assertions.
$t = new lime_test(2, new lime_output_color());
La méthode comment() permet de placer un commentaire dans l’interface de test, facilitant ainsi le débugguage ensuite.
Puis vient le moment des tests à proprement parler.
$t->is(Post::my_test(true), true, 'valid() return the argument we give him');
Le test échouera si la valeur retournée par Post::my_test n’est pas égale à true.
De nombreuses méthodes sont disponibles en plus de is().
- comment($msg) – Affiche un commentaire mais n’exécute aucun test.
- ok($test, $msg) – Affiche le commentaire et vérifie que $test est vrai.
- is($value1, $value2, $msg) – Affiche le commentaire et vérifie que $value1 est égal à $value2.
- isnt($value1, $value2, $msg) – Affiche le commentaire et vérifie que $value1 n’est pas égal à $value2.
- like($string, $regexp, $msg) – Affiche le commentaire et vérifie que $string respecte l’expression régulière $regexp<./li>
- unlike($string, $regexp, $msg) – Affiche le commentaire et vérifie que $string ne respecte pas l’expression régulière $regexp.
- cmp_ok($value1, $operator, $value2, $msg) – Compare les deux arguments avec l’opérateur.
- isa_ok($value, $type, $msg) – Vérifie le type de l’argument donné.
- isa_ok($object, $class, $msg) – Vérifie que l’objet est bien de la classe mentionnée.
- can_ok($object, $method, $msg) – Vérifie la disponibilité de la méthode pour un objet ou une classe.
- is_deeply($array, $array2, $msg) – Vérifie que deux tableaux ont les mêmes valeurs.
- include_ok($file, $msg) – Vérifie qu’un fichier existe et qu’il est correctement inclu.
- fail() – Echoue toujours. Utile pour tester des exceptions.
- pass() – Passe toujours. Utile pour tester des exceptions.
- skip($msg, $nb_tests) – Compte comme $nb_tests tests. Utile pour les tests conditionnels
- todo() – Compte comme un test. Utile pour les tests restant à écrire.
Functional
Et les tests fonctionnels. Voici un exemple de test :
include(dirname(__FILE__).'/../../bootstrap/functional.php');
$browser = new sfTestFunctional(new sfBrowser());
$browser->get('/')
->info('1 - The culture is appropriately fr')
->with('user')
->isCulture('fr')
->info('2 - The response is 200 and the content has a title')
->with('response')
->begin()
->isStatusCode(200)
->checkElement('body', '/<h1>/i')
->end();
Comme précédemment, nous commencons par implémenter le bootstrap.
Puis nous instancions un objet sfTestFunctional, qui fera office de navigateur et s’occupera de faire les appels http et de faire nos validations.
Ensuite nous faisons une requête get sur l’url /.
Et nous entrons dans la vue culture, pour vérifier que la langue définie pas défaut est bien le français. Voir internationalisation
Ensuite nous passons dans la vue response, nous vérifions que le code HTTP est bien 200 et que la page contient une balise h1.
Puis nous fermons cette requête.
Il serait bien évidemment possible de faire d’autres requêtes sans réinstancier le navigateur. Il suffit de refaire un $browser->get('/chemin');
Par ailleurs, comme précédemment, de multiples méthodes sont présentes :
- get($url, $parameters) – Fait une requête get
- post($url, $parameters) – Fait une requête post
- call($url, $method, $paramaters) – Permet de faire un appel en précisant sa méthode (utilisé pour les requêtes PUT et DELETE).
- back() – Retourne à la page précédente dans l’historique
- forward() – Va à la page suivante dans l’historique
- reload() – Recharge la page courante
- click($name, $arguments, $options) – Clique sur un lien ou un bouton
- select($name) – Sélectionne un bouton radio ou une case à cocher
- deselect($name) – Désélectionne un bouton radio ou une case à cocher
- restart() – Redémarre le navigateur (et la session)
Ainsi que d’autres méthodes pour configurer le comportement du navigateur
- setHttpHeader($header, $value) – Définit une entête HTTP
- setAuth($username, $password) – Définit l’identification http (basique)
- setCookie($name, $value, $expire, $path, $domain, $secure, $httpOnly) – Définit un cookie
- removeCookie($name) – Supprime un cookie
- clearCookie() – Supprime tous les cookies
- followRedirect() – Suis la redirection (et retourne une exception si le lien n’en est pas une)
Une fois que la requête est correctement paramétrée, il vous faut définir la vue que vous désirez avoir et exécuter celle-ci.
Il existe cinq vues. Mais nous n’en verrons que deux dans cet article.
request
Cette vue apporte des méthodes permettant de tester la requête.
- isParameter($key, $value)> – Teste qu’un paramètre est présent et que sa valeur est correcte
- isFormat($format) – Vérifie le format de la requête
- isMethod($method) – Vérifie la méthode de la requête
- hasCookie($key, $exists) – Vérifie que le cookie existe
- isCookie($key, $value) – Vérifie la valeur du cookie
response
Cette méthode permet de vérifier le contenu renvoyé par la page.
- checkElement($selector, $value, $options) – Vérifie qu’un sélecteur CSS respecte les critères donnés
- isHeader($key, $value) – Vérifie la valeur d’une entête HTTP
- isStatusCode($code) – Vérifie le code HTTP renvoyé
- isRedirected() – Vérifie qu’il s’agit d’une redirection
Autres vues
Nous avons donc vu les deux vues les plus couramment utilisées. Cependant il en existe trois autres, que nous ne détaillerons pas ici :
Pour finir, comme vous pouvez le constater, tester ses applications est assez aisé avec Symfony. Alors vous n’avez plus aucune raison de ne pas le faire
