formats
Publié le 9 octobre 2013, par dans Non classé.

Après quelque mois d’utilisation de l’outil Behat pour réaliser des tests fonctionnels PHP, j’aimerais poster aujourd’hui un nouveau conseil : créez vos « steps » personnalisées.

Une fois de plus, avant de lire cet article il me parait important de remettre les choses dans leur contexte. Je rédige ces tests pour vérifier l’exécution correcte d’un ensemble de fonctionnalités d’un ERP en mode SaaS. J’imagine que cela implique des choix différents au niveau de la rédaction de ces tests, car j’utilise un framework développé en interne.

Cela dit, certain d’entre vous utilisent peut être certains frameworks ou librairies comme jQuery ou Bootstrap, et les « steps » personnalisées ont également du sens dans ce contexte.

Pourquoi ne pas créer des « steps » personnalisées dans Behat ?

Notre ERP dans sa version précédente utilisait beaucoup jQuery. Nous utilisons dans sa version actuelle beaucoup plus de Bootstrap. Ces deux outils permettent de gérer des fenêtres modales.

Or, parfois notre volonté est simplement de fermer la fenêtre ouverte. Il se trouve qu’elle ne se fermera pas de la même manière suivant que l’on utilise jQuery ou Bootstrap (ou autre chose).
Si vous aviez créé une étape qui serait par exemple

je clique sur « .ui-dialog .ui-icon-closethick »

Cette étape est spécifiquement destinée à jQuery au vu des classes utilisées. Imaginons maintenant que l’on change et que l’on désire utiliser Bootstrap de twitter pour gérer les fenêtre modales.
Toutes ces étapes écrites spécifiquement pour jQuery deviennent alors obsolètes. La charge de travail lors de mises à jour devient alors non négligeable puisqu’il faut reprendre tous les tests un par un.

Alors, quelle est la solution pour ne pas ré écrire tous les tests ?

Très simplement, la solution à ce problème est la « step » personnalisée et générique. Au lieu d’écrire une « step » spécifique jQuery, il suffit d’écrire une « step » générique :

je ferme la fenêtre « #id_fenetre »

Et, la seule chose que vous aurez à modifier lors d’un changement de framework est votre méthode PHP dans le fichier featureContext.

Bien sûre, ce problème ne résout pas tout : si vous utilisez simultanément jQuery et Bootstrap sur votre site avec des fenêtres modales issues de ces deux frameworks, cela complique un peu les choses. Si vous désirez absolument garder une seule « step », qui passera peut importe que la cible soit une fenêtre modale issue de Bootstrap ou de jQuery, il va falloir traiter ce cas dans votre « step » générique.
Pour faire cela, il faut réussir à cibler l’élément et vérifier la présence de certaines classes propres à jQuery ou à Bootstrap.

Mais cela est un autre sujet, qui fera peut être également l’objet d’un article !

 

 
formats
Publié le 18 mars 2013, par dans Behat.

Comme je le disais dans un précédent article, je vous conseille vivement de ne pas utiliser de scénarios à rallonge. Cela dit, il ne faut pas que vos scénarios soient dépendant les uns des autres, sinon cela revient peu ou prou au même résultat.

Une fois de plus, en testant notre outil de gestion commerciale j’ai commencé par créer un scénario qui crée des articles, un autre qui crée des factures qui utilisent ces mêmes articles créés dans le précédent scénario, puis enfin un dernier scénario qui vient tester des actions sur la modification de ces factures.

Au moment où j’ai écrit les tests, tout passait sans aucun problème. Cependant quelques jours plus tard en testant à nouveau ma série de scénarios, j’ai eu une étape qui ne passait plus dans la création de mes articles. Cela aboutissait donc dans un enchaînement d’échecs de mes tests : les articles n’étaient pas créés, donc les factures ne pouvait pas être créées etc.

Ce que je vous conseille donc est de rendre indépendant autant que possible vos scénarios dans le but de trouver en échec uniquement les scénarios qui réellement posent problème. Une des choses que j’ai du donc mettre en place au moment de l’écriture des tests est de faire un export de ma base de données à la fin d’un scénario pour l’importer telle quelle au début du scénario suivant peu importe l’issue du scénario précédent.

Autrement dit, toujours en gardant l’exemple du test de notre gestion commerciale, si la création d’un article ne passe pas correctement, pour le début du scénario suivant l’article sera quand même présent et le scénario pourra être testé avec les bonnes « hypothèses ».

 

 
formats
Publié le 18 mars 2013, par dans Behat.

Une des premières erreurs que j’ai pu faire en utilisant Behat est d’avoir fait des scénarios à rallonge qui n’en finissent plus.

Pourquoi j’ai commis cette erreur ?

Etant donné que je teste un logiciel, l’utilisateur doit être connecté pour pouvoir utiliser le logiciel. J’ai alors un scénario « background » qui est automatiquement lancé avant chaque scénario. Mais cela veut dire que je perds environ 10 secondes à chaque scénario.

Il me semble avoir lu que l’on peut installer des sessions PHP qui perdurent d’un scénario à l’autre, mais je n’ai pas pris le temps de chercher dans ce sens.

Pourquoi cela est une erreur ?

Lorsque Behat rencontre une erreur dans un scénario (un texte non trouvé sur la page, un lien non cliquable…), il arrête l’exécution de ce scénario et passe automatiquement au suivant. Ce qui veut dire qu’il est difficile de voir rapidement quels sont les points de blocage pour un scénario donné, et surtout de voir tout de suite quels sont les points à corriger.

Plus concrètement

Par exemple, je devais tester les fonctionnalités liées à la gestion de factures de vente dans notre gestion commerciale. J’ai donc créé un scénario où :

- Je crée une facture
- Je vais sur la liste des factures
- Je la modifie
- Je valide ma facture
- J’enregistre un paiement

Ce qui aboutissait donc en un scénario qui faisait plusieurs dizaines d’étapes.
Il aurait été plus malin pour moi de créer un scénario quasiment pour chacune des étapes ci dessus, et lors de l’exécution des tests, je peux facilement voir si simplement la validation de la facture ne se fait pas correctement et donc m’atteler à corriger ce point.

De plus, une fois que vous aurez des scénarios bien séparés, vous pourrez plus facilement tester une seule fonctionnalité de votre application.

 
formats
Publié le 18 mars 2013, par dans Behat.

Behat est un outil utilisé pour valider le comportement d’un site de manière automatisée en simulant un navigateur.

Le but est de définir un ensemble de scénarios avec des étapes qui seront exécutées automatiquement pour gagner du temps en évitant des tests manuels. De plus, un des avantages de Behat est la personnalisation possible de ces étapes. Certes il existe quelques étapes simples fournies avec le framework (remplir un input par exemple), mais l’on peut en définir des bien plus complexes qui représentent un enchaînement de sous étapes.

Un exemple simple de scénario serait :

- Je vais sur la page inscription.php
- Je rempli le champs « nom » avec « BRY »
- Je rempli le camps « prenom » avec « Frédéric »
- Je clique sur le bouton « Inscription »
- Je devais voir un message de confirmation
- Je devrais voir « Merci, votre inscription a bien été prise en compte »

Behat s’utilise donc pour enchaîner et exécuter des tests comme celui, pour valider les nouvelles fonctionnalités tout en évitant les régressions.

J’utilise Behat depuis quelques semaines dans le cadre du développement de notre ERP en mode SaaS. Evidemment, comme tout bon débutant j’ai commis des erreurs, que je vais partager avec vous en espérant que cela puisse vous faire gagner du temps.

 

 
formats
Publié le 19 octobre 2012, par dans Producteev.

Producteev est un outil de gestion de « to-do list ». Après avoir testé leur application iPhone et leur plateforme web, j’ai bien apprécié le tout. Nous avons donc décidé de d’intégrer cet outil à notre logiciel de CRM. Bien heureux qu’ils aient prévu une API, bien surpris de n’avoir pas trouvé de librairies pour s’en servir !

J’ai donc dû développer en quelques sortes un début de librairie pour l’utilisation de l’API Producteev avec PHP. Voici donc quelques explications liées à l’installation de cette librairie, puis à son utilisation.

 Téléchargement de la librairie API Producteev PHP

Voici le lien du dépôt sur GitHub pour télécharger l’API :

https://github.com/easydeveloppement/Producteev-API-non-official-PHP-example

Configuration de l’API

Clés de l’API

Ouvrez le fichier producteev.php.

A l’initialisation de la classe producteev_api, vous trouverez les lignes suivantes :

// your API Key
$this->apiKey = ‘xxxxxxx’;
// your API secret
$this->apiSecret = ‘xxxxxxxx’;
// API end point URL
$this->apiUrl = ‘https://api.producteev.com/’;

Pour obtenir votre clé API et la clé secrète, il suffit de faire une demande auprès de l’équipe de producteev. J’ai reçu leur réponse dans les 24h.

Gestion des tokens

Par défaut les tokens sont gérés grâce aux sessions PHP. Vous pouvez cependant modifier ces deux fonctions pour y insérer votre propre système de gestion des tokens (les sauvegarder dans une base de données mysql par exemple).

// Used to store the token
function setToken($token) {…}

// Used to retrieve the token
function getToken() {…}

Gestion des erreurs

Pour configurer la gestion des erreurs, vous pouvez modifier cette fonction :

// Error management
function error($error) {…}

Personnalisation du formulaire de connexion de l’utilisateur

// EDIT this function in order to create your own form to ask for email and password to connect the user
function whoAreYou() {…}

Cette fonction est utilisée pour générer un formulaire pour que l’utilisateur puisse entrer son adresse email et mot de passe pour se connecter à son compte Producteev. La validation est ensuite faite sur une page AJAX, qui se charge d’enregistrer le token retourné par l’API Producteev.

Exemple d’utilisation de la librairie

Connexion d’un utilisateur

// class instantiation
$producteev = new producteev_api();

// user login
$producteev->loginUser(‘email@example.com’, ‘password’);

Récupération de l’ensemble des tâches

Attention, il faut noter que cette fonction renvoie également les tâches supprimées de Producteev.

// getting list of tasks
$tasks = $producteev->tasksList();

Création d’une tâche

// create a task
$task = array();
$task['title'] = « test depuis notre CRM »;
$task['deadline'] = ’2012-10-20 15:30:00′;
$task['status'] = 1;  // 1 = à faire ; 2 = fait
$producteev->createTask($task);

En espérant que ces quelques exemples et cette librairie pourront vous être utiles !