Et oui, encore et toujours du symfony. Que voulez-vous, ce framework déjà bien avancé et encore très prometteur possède une bonne actualité.
Les slides présentés sont disponibles, une bonne occasion pour les absents comme pour les absents de retracer ce qui a été abordé. Au programme, pas mal de sujets, dont les tests unitaires et fonctionnels, déjà abordés au sein de ZT. On y retrouve également l’avenir avec symfony 2 (qui s’écrit dorénavant avec une majuscule), des bonnes pratiques, ou le retour d’expérience très formatteur de Dailymotion. Et ce n’est pas tout, je vous invite à vous rendre directement sur les liens ci-dessus pour profiter de ces précieuses ressources.
Ça y’est, vous êtes en train d’écrire vos tests fonctionnels pour votre application symfony. MAIS votre application – ou une partie – nécessite une identification de la part de l’utilisateur. Il y a bien sûr la solution qui consiste à systématiquement remplir le formulaire dans chaque fichier de test.
Je vous présente ici une solution pour palier à cela. La solution consiste à étendre la classe sfTestFunctional du framework. Ce qui donne, par exemple :
class sfGuardTestFunctional extends sfTestFunctional
{
public function __construct($browser, $lime = null, $testers = array())
{
parent::__construct($browser, $lime, $testers);
$this->signin(array('username' => 'foo', 'password' => 'bar'));
}
/**
* Perform user authentication
*
* @param array of String $user_data
* @return sfGuardTestFunctional $this
*/
public function signin($user_data)
{
return $this->info(sprintf('Login as "%s"', $user_data['username']))->
get('/admin/login')->
click("S'identifier", array('login' => $user_data))->
with('form')->begin()->
hasErrors(false)->
end()->
with('user')->begin()->
isCulture('fr_FR')->
isAuthenticated(true)->
end()->
with('request')->begin()->
isParameter('module', 'admin')->
isParameter('action', 'login')->
end()->
isRedirected()->
followRedirect();
}
}
De cette manière, dans votre fichier de test il vous suffira d’instancier votre browser avec votre nouvelle classe :
$browser = new sfGuardTestFunctional(new sfBrowser('my_vhost'));
Et voilà, vous pouvez vous considérer comme identifié et écrire directement vos tests fonctionnels ! La solution présentée ici est minimale, la mise en forme du code PHP avec Blogspot n’étant pas des meilleure et votre motivation étant sans doute plus grande à déchiffrer 20 lignes de code plutôt que 42.
Une petite mise en oeuvre de ce cette classe, mise en place au sein de Piwam. L’exemple est destiné à la version 1.2 du framework..
C’est un point très mal explicité dans la documentation de symfony. Lorsque vous être en train de concevoir votre schéma au sein du fichier eponyme – schema.yml -, vous aimeriez bien avoir le contrôle de vos champs de type DECIMAL, non ?
La documentation n’étant pas très bavarde, peut être comme moi vous contentiez vous d’indiquer :
amount: { type: decimal }
Pour exécuter ensuite des requêtes SQL bien placées pour modifier ce ce champ et lui affecter par exemple un stockage de 3 chiffres après la virgule. Je n’avais pas trouvé la réponse immédiatement, mais après un petit tour On Ze Ouaib, j’ai enfin déniché ce qui me manquait :
amount: { type : decimal, size: 8, scale: 2 }
Pour un champ de type DECIMAL(8,2). Reste plus qu’à compléter la documentation symfony…
Pour ceux qui en douteraient, ça sert. Plutôt seul dans le développement de Piwam, j’ai décidé de fournir des batteries de tests « plus tard », pas avant la version beta.
Or, entre plusieurs versions alpha, il se trouve qu’en corrigeant certains bugs, j’en ai inséré d’autres – le genre bug critique, tant qu’à faire. Évidemment, l’insertion d’un bug est rarement volontaire, et chez moi les causes identifiées sont plutôt :
- Etourderies, comme un léger refactoring de code dans lequel on inverse une condition (!)
- Fatigue au moment de la correction
- Fautes de frappes stupides
Je ne vous cache pas la honte qui montait en moi lorsque j’ai découvert que j’étais en train de distribuer une version avec un bug empêchant la création même d’une association… Bon, c’était une version alpha, mais quand même, Un simple petit coup de
> symfony test:functional front
aurait permis de s’apercevoir que ça ne marchait plus. Promis, les prochaines releases seront testées peut être… Les tests fonctionnels avec symfony

Sensio Labs, avec l’aide de l’AFUP, est heureux de vous inviter à la symfony Live Conference, à Paris, les 11 et 12 juin 2009. L’occasion pour – au moins – deux invités de prestige, Yahoo et Dailymotion, de partager leurs expériences avec le framework, tout comme plusieurs développeurs qui s’exprimeront sur leur retour vis à vis de symfony.
20 sessions se succèderont sur ces 2 jours, à la Cité Universitaire Internationale (Paris). Les conférences se tiendront en français. Si vous êtes interessé, n’hésitez pas à vous enregistrer, ou à suivre les actualités via Twitter (compte sflive09).
Il va très bien ! Pour ceux qui ne connaissent pas encore ce fabuleux projet, il s’agit d’une application web que je développe dans mon temps libre, avec une utilité bien définie : gérer son association. J’avais publié cette application écrite en PHP il y a plusieurs mois de cela, et la revoilà complètement refaite. Basée sur le framework symfony 1.2, les utilisateurs la version 1.0 seront ravis de voir les bugs corrigés, les différents formulaires remodelés et les fonctionnalités encore plus poussées.

Il s’agit d’une version ALPHA. La première du genre devrais-je rajouter. Elle ne contient pour le moment aucune documentation digne de ce nom, je la réserve donc plutôt à des personnes à l’aise avec symfony et capable de configurer l’accès à la base de données.
Un seul lien utile, l’espace Google Code de Piwam ! Bon allez, pour ne pas faire trop nombriliste, voici un second lien… l’accès direct à l’archive !