Automatisation et tests des IHM avec SIKULI

SIKULI permet d’automatiser des tâches répétitives ou d’automatiser des tests fonctionnels au niveau IHM. C’est un projet récent développé par le MIT et que je suis de très près. Son principe ? Il se base sur la reconnaissance des images faisant partie d’une application (bouton, boîte de texte…) afin de les retrouver lors de la ré-exécution du script pour interagir avec les objets correspondants (cliquer sur un bouton, saisir du texte…).

Comme je le disais en introduction, SIKULI  a deux buts principaux :

  • Automatiser des tâches répétitives avec un script construit graphiquement.
  • Faire des tests unitaires automatisés sur une application graphique (client lourd, Smartphone via émulateur…).

Il est doté d’un enregistreur. C’est-à-dire qu’on peut lancer depuis son IDE un enregistrement des actions effectuées sur n’importe quelle application de manière à construire un script d’automatisation. On peut ensuite modifier ce script (ajout de paramètres, boucles, contrôles…) dans une IDE très graphique, comme on peut le voir sur cette copie d’écran :

SIKULI_exemple_script

Exemple de script SIKULI

Il existe même une édition portable qui permet de tester le logiciel SIKULI sans rien installer.

Comment enregistrer un script?

L’IDE est très orientée graphique et cela transparaît lors de la création du script. On peut construire le script à l’aide de la barre d’outils à gauche de l’IDE. Elle propose une liste d’interactions avec l’application cible. Par exemple, si vous souhaitez simuler un clic sur l’application, cliquez sur click.

instruction click sikuli

click sikuli

SIKULI va perdre le focus et la fenêtre de l’IDE va se réduire. Cela vous permet de désigner la zone de l’application sur laquelle vous souhaitez simuler un clic.

Sélection d'une zone de click

Sélection d’une zone de clic

Vous sélectionnez la zone en commençant par un clic gauche sur un des coins du rectangle de sélection et vous maintenez le bouton gauche de la souris en déplaçant le curseur jusqu’au coin diamétralement opposé. En relâchant le bouton gauche de la souris, la zone d’interaction du clic est créée dans l’IDE. Elle est matérialisée dans l’IDE par une capture d’écran de la zone où cliquer (voir la première capture d’écran de cet article).

Comme expliqué par la suite, vous pourrez améliorer le script produit avec des conditions, des assertions et du code Jython.

Trucs et astuces

Le fait que SIKULI se base sur la reconnaissance d’image peut être détourné lors de la conception des scripts. Prenons un exemple avec le menu démarrer du système d’exploitation Windows 7. Imaginons que vous souhaitiez ouvrir Outlook de manière automatisée en sélectionnant l’entrée dans le menu démarrer. Le hic c’est qu’avec le mécanisme de focus expliqué précédemment (pour les captures des zones graphiques d’interaction), le menu démarrer ne sera pas déplié lorsque vous essayerez de capturer la zone d’interaction (clic sur l’icône Outlook). Puisque le temps de retourner sur l’IDE SIKULI, le menu Démarrer disparaît. La solution? Faites une capture d’écran dans MSpaint et lors de l’enregistrement, utilisez MSPaint comme zone de capture. Fermer MSPaint avant la ré-exécution du script et le tour est joué (comme SIKULI se base sur la reconnaissance des images visibles à l’écran).

Menu démarrer windows

Capture d’écran du Menu démarrer de Windows 7

Déroulement du script

Pour bien comprendre le fonctionnement, voici le déroulement pas-à-pas de l’exécution de l’exemple de script que nous venons de concevoir dans le paragraphe précédent.

  1. Lorsque l’on lance l’exécution du script, l’IDE SIKULI est réduite et perd le focus. Le script est exécuté sur la fenêtre qui avait le focus avant SIKULI.
  2. Dans la fenêtre qui a le focus (donc l’application cible du script) SIKULI recherche l’image qui ressemble le plus à l’icône home. Puis SIKULI clique sur la zone contenant l’image trouvée (ou arrêter le script si l’image n’a pas été trouvée). On notera que la comparaison n’est pas une comparaison par bitmap (ou pixel par pixel), mais une comparaison par ressemblance.

Comment améliorer un script?

D’après les auteurs, tout ce que l’on peut faire en Java peut être fait dans un script SIKULI et à peu près tout ce que l’on peut faire en Python peut être fait dans un script SIKULI (c’est un script Jython). Ce qui permet — à l’instar de QTP avec les possibilités offertes par VBS et les objets COM — de faire à peu près tout :

  • Entrées/sorties fichiers.
  • Dialogue avec une base de données, un serveur FTP, HTTP

Conditions de sortie

Dans l’optique d’une utilisation de SIKULI pour des tests automatisés, on peut utiliser un mécanisme interne d’assertion. En cas d’évaluation négative de l’assertion, SIKULI générera une erreur (que l’on pourra capturer si on l’utilise SIKULI avec un outil ou un script).

Test passant :

Test non passant :

Dans les coulisses de SIKULI

Dans les paragraphes suivants, je vous propose de découvrir les composants de SIKULI ainsi que quelques considérations sur le format des scripts.

Décortiquons l’application

SIKULI se base sur des bibliothèques répandues, notamment sur OpenCV. OpenCV est une bibliothèque de Computer Vision (traitement de l’image) qui contient plus de 500 algorithmes de traitement de l’image. Et également un composant de reconnaissance optique des caractères Tesseract OCR (initialement développé par HP, puis reversé dans le domaine public). Cependant, la première implémentation de l’OCR ne m’a pas convaincu par son efficacité et par l’impossibilité de définir la langue de la reconnaissance optique. Cependant, les développeurs ont annoncé vouloir améliorer sérieusement cette fonctionnalité dans les prochaines versions.

SIKULI utilise d’autres bibliothèques permettant d’interagir avec le système d’exploitation (comme réduire SIKULI au moment de l’exécution, capturer de zones visibles à l’écran…).

Décortiquons un script

En enregistrant, on se rend compte que l’IDE fabrique un script qui est enregistré sous la forme d’un répertoire contenant :

  • Du code (script Jython).
  • Un fichier HTML représentant visuellement le script et les interactions avec les applications.
  • Les captures d’écran au format PNG.

Le code Jython est un script qui fait référence aux objets manipulés. L’IDE présente les images désignées par le nom de fichier de capture afin d’améliorer la présentation du script. Mais c’est le code ci-dessous qui est interprété par SIKULI lors de l’exécution du script d’automatisation :

click("1339588795599.png")
wait("France.png")
type("1339588862789.png", "toto" + Key.TAB)
click("RechercheGoo.png")
wait("1339590399500.png")
click("TotoVentedet.png")
wait("MAGASINSDEPU.png")
exists("TOTOestlelea.png")

En fait, cette représentation graphique du code (images mélangées au code source) est réalisée par un fichier HTML intermédiaire également présent dans le répertoire du source du script :

<pre class="sikuli-code">
<span class="skw">click</span>(<img src="1339588795599.png" />)
<span class="skw">wait</span>(<img src="France.png" />)
<span class="skw">type</span>(<img src="1339588862789.png" />, <span class="str">"toto"</span> + Key.TAB)
<span class="skw">click</span>(<img src="RechercheGoo.png" />)
<span class="skw">wait</span>(<img src="1339590399500.png" />)
<span class="skw">click</span>(<img src="TotoVentedet.png" />)
<span class="skw">wait</span>(<img src="MAGASINSDEPU.png" />)
exists(<img src="TOTOestlelea.png" />)
</pre>

Note sur l’automatisation des tests

Il y a deux entrées intéressantes dans la documentation du produit :

  • Intégration avec JUnit. Pour l’utilisation de SIKULI en tant que test unitaire (nécessite une session interactive — ne peut donc pas être exécuté en mode silent sur un serveur).
  • Utilisation de Sikuli depuis la ligne de commande.

La sortie des erreurs se faisant sur le canal stderr, si vous exécutez vos scripts sous Windows vous devrez passer par un script intermédiaire ou un petit programme de votre crû qui affichera les erreurs le cas échéant. En effet, la console Windows ne contiendrait aucun message d’erreur (puisqu’elle affiche le canal stdout), Sikuli se contenterait de vous laisser la main.

Un indice, en VBS utilisez l’objet WshShell.Exec (voir cet article pour afficher correctement la sortie des erreurs, et en PowerShell)

Ou plus classiquement, une redirection des canaux stdout et stderr dans un fichier texte, après l’ajout en fin de linge de commande de :

>output.txt 2>&1

Conclusion

SIKULI un projet récent, mais assez abouti et avec un fort potentiel. C’est vrai que la partie OCR (reconnaissance optique des caractères) ne m’a pas convaincu, cependant les développeurs travaillent dessus pour les prochaines versions. On peut le comparer avec des automates open-source ou gratuits plus célèbres.

Comparaison avec Selenium

Selenium ne fonctionne quasiment qu’avec Firefox. On est donc limité aux interfaces web fonctionnant sous Firefox. La philosophie n’est pas la même : Selenium agit sur les objets du DOM (sur le contenu intrinsèque d’un document web via son code HTML et JavaScript), alors que Sikuli agit sur les images et sur n’importe quel type d’application.

Autres solutions

  • L’excellent AutoIt, mais limité à Windows.
  • Son alternative, Autokey pour Linux.
  • Pour essayer d »être exhaustif : AutoHotKey.

Et, d’une manière plus générale, je conseille le site AlternativeTo.Net qui liste les solutions alternatives aux logiciels commerciaux ou libres ou Osalt (créé dans l’optique de proposer des alternatives OSS aux logiciels propriétaires).

Aller plus loin

Une réflexion au sujet de « Automatisation et tests des IHM avec SIKULI »

  1. Dominique Mereaux

    Merci pour cet article intéressant, mais je voudrais juste rectifier: selenium fonctionne sur tous les browser, seul l’IDE qui permet de faire des enregistrements fonctionne uniquement sur FF.
    Après vous pouvez construire des scripts dans le langage choisi et les lancer sur n’importe quel navigateur.

    Cordialement.
    Dominique.

    Répondre

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *