Automatiser le non-automatisable
Publié le 17/02/2012, par Xavier Renaudin dans Test, Tutoriel | Ajouter un commentaire
Kesako Sikuli ?
Pour quoi ?
- Automatiser des scénarios pour une application
- Automatiser les interactions entre plusieurs applications (même des applications tierces)
- Automatiser le lancement et la vérification de tests automatisés
exemples d’utilisation dans mon cas :
- Tester l’interaction d’éléments Flash dans une page Web
- Vérifier les mails envoyés par l’application dans un outil externe type Outlook ou Gmail
- Intégrer au build continu et vérifier des captures d’écran faites sur IPhone avec UIAutomation
Pour qui ?
Comment ?
- Avec l’IDE fourni après l’installation de Sikuli on crée un nouveau script
- L’IDE permet d’ajouter facilement au script des étapes comme “Click(<une image>)” ou “Wait(<une image>)”. La récupération des images se faisant dans un mode où la souris permet de capturer une zone de l’écran.
- Le script ainsi créé est sauvegardé dans un répertoire de type “monScript.sikuli” qui contient le script python et les images capturées.
Mais j’ai pour ma part expérimenté quelques déboires dont certains peuvent être évités assez simplement une fois qu’on sait comment.
1- Structurer l’arborescence :
setBundlePath("C:\\TESTS\\assets") |
Après quoi on accède à une image avec la chaine de caractère représentant son chemin en relatif :
exists ("monImage.png") # permet de vérifier si l'image est visible à l'écran |
import mon_autre_script |
from sikuli.Sikuli import * |
myPath = os.path.dirname(getBundlePath()) if not myPath in sys.path: sys.path.append(myPath) |
2- Structure des fichiers de tests
import unittest |
class TestScenario(unittest.TestCase): |
def setUp(self): # code... def tearDown(self): # code... |
def testScenario1(self): # ... |
assert (exists ("monImage.png")) |
3- Intégrer au Continuous Build
- Il faut permettre au service d’interagir comme un utilisateur :
“Dans Administrative Tools-> Services, clique droit sur le service Apache Tomcat qui correspond à Hudson -> Properties. Dans l’onglet “Log On”, on coche la case “Allow service to interact with desktop”. On redémarre le service.” (cf. https://answers.launchpad.net/sikuli/+question/153455) - Il faut ajouter “<path-to-sikuli>\libs” et “<path-to-java>\jre6\bin” dans le system path et dans le PATH de Jenkins (page “configure”)
- Il faut rajouter ce patch : http://www.microsoft.com/download/en/details.aspx?displaylang=en]Microsoft&id=5582
call Sikuli.bat -r %SIKULI_SCRIPT_PATH%/TestScenario.sikuli |
4- Autres trucs en vrac
#coding: utf-8 |
Il est possible d’écrire simplement dans la sortie avec :
print ("Mon message") |
Si votre script ne semble pas fonctionner alors qu’il devrait, penser à rajouter des pauses après chaque action. En effet l’ordinateur peut être beaucoup plus rapide que vous et parfois il va simplement trop vite. Pour le faire attendre 2 secondes utiliser la commande suivante :
wait(2) |
Et pour ceux qui veulent se faciliter la vie et les copies d’écran sans passer par l’IDE : PrtScr
Conclusion
(+) :
- Complètement cross-plateforme et cross-produit
- Décorrélé du code et n’implique pas de connaître la techno des outils qu’on veut tester.
- Permet de rester très haut niveau et de se mettre à la place d’un utilisateur (si c’est trop compliqué à scripter, c’est peut être juste trop compliqué comme fonctionnalité)
- Basé sur du Jython et en open source il peut être associé à d’autres outils (ex : avec Selenium, avec RobotFramework)
(-) :
- Le plus long est de trouver la bonne copie d’écran (pour le web, le rendu des différents navigateurs peut multiplier les copies d’écran)
- La maintenance peut être rude (Si c’est le cas passez à autre chose ou simplifiez)
- Il manque un générateur de code “click by click” (Si ça intéresse quelqu’un : https://answers.launchpad.net/sikuli/+question/136146)

