On a déjà présenté Selenium IDE dans un billet précédent (Stratégie de tests: Automatisation de tests fonctionnels de non-regression. PHP-unit Selenium et PHP). Ce même billet présentait un développement PHP un peu lourd pour réussir à obtenir des tests multiplate-forme et viabilisé.La solution était basée sur l'utilisation de PHP-UNIT. Ce n'est plus le cas ici.

Cacique

Cacique a été créé et est maintenu par Mercadolibre. Mercadolibre est le e-bay sud-américain créé en Argentine en 1999. En 2008 Mercadolibre employait 1300 collaborateurs et a réalisé un chiffre d'affaire de 825 millions de dollar (wikipedia). Il y a donc une organisation solide derrière Cacique.

Cacique est développé en Ruby, la documentation existe en anglais et en espagnol. Ce projet est open-source et gratuit.

Installation & Architecture

L'installation suppose la mise en place d'une panoplie de service:

  • MySQL
  • Apache
  • Ruby + passenger pour Apache
  • Cacique + les service starling, workling et le job work.
  • Selenium Grid
  • les seleniumRC

A noter: Tout ces services et les composants nécessaires à la solution décrite dans ce billet sont open-source et gratuit.

On peut faire tourner l'ensemble de la plate-forme sur une même machine. Tous les services peuvent être lancé sur une machine et permettent d'utiliser le logiciel. Il est toutefois préférable d'avoir plusieurs plate formes pour dispatcher les seleniumRC et bénéficier environnement de test variés.

Lancement du serveur d’exécution

Pour faire tourner un test, il faut lancer plusieurs serveur à la main (ou configurer leur lancement automatique dans le cas d'une plateforme dédiée). Ces commandes se retrouvent dans la documentation.

sudo ./script/starling.rb (en root)

ensuite, il faut lancer workling:

./script/workling_client start

enfin lancer selenium grid

cd extras/selenium-grid-1.0.8/

ant launch-hub

java -jar selenium-server-standalone-2.16.1.jar firefox -port 4443  -trustAllSSLCertificates

rake jobs:work RAILS_ENV=production

Utilisation interface

Si l'installation et le lancement de Cacique nécessitent des compétences techniques certaines, l'utilisation de la solution de test est nettement plus abordable. Cacique est une application web qui se pilote via le navigateur. Après un écran de login on arrive donc sur un écran comportant 3 diapositives présentant les premières étapes.

cacique_login_screen.png

On sent bien l'utilisation des bibliothèques ajax de ruby on rails, il y a beaucoup d’interaction à la "web 2.0". Notamment, la création de l'arborescence du projet (dans la partie gauche de l'écran) se fait au clic droit:
 

puis ...

cacique_menu_2_folderdone_zoom.png
 
 
 

On passe ensuite à la création du script de test en tant que tel.

Cacique prend en entrée un script issue de Selenium IDE et

exporté au format Ruby TestSuite.




cacique_menu_4_newscript_wizard.pngUne fois l'import effectué, on constate la première grande valeur ajouté de Cacique: il détecte les chaines de caractères contenues dans le script et va les viabiliser. Il affiche donc le liste des champs et demande à l'utilisateur de nommer ces variables:


cacique_menu_5_newscript_mapping_fields.pngLa fin du processus de création affiche l'écran d'édition du script.

cacique_menu_6_script_editing.pngOn peut alors regarder dans l'onglet "Data Set":

cacique_dataset_zoom.png
Dans la barre de bouton, on trouve les boutons d'import et export: C'est le deuxième effet magique!
On télécharge un modèle à remplir dans Excel directement au format xls (mais ça marche aussi avec OpenOffice...)

cacique_excel_export.pngOn complète :

cacique_excel_import.png


On réupload et on obtient les données rempli dans Excel:


cacique_dataset_uploaded_zoom.pngLes données importées s'ajoutent aux données existantes (d'où le doublon des 2 premières lignes).

Selenium embarquait déjà la notion de TestSuite. Une suite de test c'est un ensemble de plusieurs scénario chacun avec leur jeux de données.

cacique_testsuite_creation_form.png
error_500.pngJusqu'ici, les écrans et leurs enchaînements sont relativement intuitifs. Généralement, c'est pour l’exécution et le recueil des résultats que ça se complique. Non que les manipulations soient complexes ou nécessitent des compétences techniques mais plutôt que l'ergonomie est déplorable. On se perd facilement dans les menus, la navigation est vraiment pas claire du tout. 

Quelques exemples (listes non-exhaustive):
- Le bouton actualiser envoi systématiquement sur l'écran d'erreur 500 ci contre.
- sur l'écran de suite (non présenté ici), il n'y a pas de case à cocher pour sélectionner un élément. Il faut deviner qu'il faut cliquer dessus pour le sélectionner.
- les icônes disparaissent derrière le panneau "project" quand le navigateur n'est pas en plein écran.
Cet écueil passé on arrive quand même à exécuter son travail. D'abord en configurant environnement d’exécution.Il faut donc choisir les éléments correspondant à votre Selenium Grid et aux serveurs selenium RC correspondant.


cacique_execution_panel.pngOn lance l’exécution de la suite de test:

cacique_execution_of.png

En cliquant sur output, on obtient le détail de ce qui a été effectivement joué. Ce résultat n'est accessible que là.


cacique_run_result_detail.png
Tandis que sur un autre écran, dans l'onglet "history", on retrouve l'historique des exécutions mais impossible de retrouver cet output. Par contre, sur cet écran on peut générer un rapport PDF.


cacique_execution_history.pngOn peut produire un export / rapport PDF en sélectionnant les tirs à intégrer.

Pour aller plus loin

Quelques commandes utiles pour compléter les script:

  • selenium_stop() pour fermer les navigateurs à la fin d'un script.
  • selenium_html_snapshot("titre") Pour enregistrer le code HTML de la page courrante. Un lien vers ce fichier apparait ensuite dans le
  • selenium.capture_entire_page_screenshot "/somewhere/screenshot1.png" pour enregistrer un screenshot de la page courante
  • Lancer java -jar selenium-server-standalone-2.16.1.jar firefox -port 4443  -trustAllSSLCertificates pour que le navigateur n'affiche pas d'avertissement sur le https.
  • Des champs d'autocomplétion ou des actions javascrit réagissent à l'événement "key up": selenium.key_up "id=textfield2", "A"
  • utiliser :
    begin
    (...)
    rescue
      selenium_stop()
      exit(0)
    end
    Pour fermer les navigateurs quand un cas de test échoue (Sinon les navigateurs s'empilent)
  • La liste des comandes ruby utilisable dans Cacique : http://selenium.rubyforge.org/rdoc/classes/Selenium/SeleniumDriver.html

Limites de la solution

Cacique est encore en bêta. Il n'est pas rare de se heurter à des bugs, des messages non-traduits ou à des problèmes ergonomiques. On se perd facilement!
Certaines fonctionnalités sont un peu obscures. De plus, la sortie, le rapport de tests est quasi inexistant. Les captures html ou les captures écrans ne sont pas liées au rapport de test. On n'accède pas non plus à une liste synthétique des acceptions testées.

Conclusion

Toutefois, l'outil tel qu'il est aujourd'hui apporte une réelle valeur ajoutée et permet facilement d'automatiser des tests en variabilisant les scénarios et en exploitant plusieurs plateformes différentes. Tout cela basé sur un enregistrement d'une navigation dans Firefox. Bravo !