À ma gauche, GreenPepper, un outil de tests fonctionnels, destiné aux MOA et leur permettant d’exprimer les spécifications sous forme de tests exécutables.
À ma droite, Team Foundation Server, usine de construction et de livraison de logiciel.
L’idée : lorsqu’un développeur effectue un check-in de son code, les tests GreenPepper sont lancés et le build échoue en cas de problème.
Comment faire ?
La configuration de GreenPepper est très bien expliquée sur leur site, je vais donc me contenter d’un renvoi vers la page idoine : http://greenpeppersoftware.com/confluence/display/GP/System+Under+Test+Configuration
Quelques précisions cependant :
Nous allons à présent modifier le build template de TFS pour y intégrer la copie des binaires dans le répertoire défini par le SUT ainsi que l’invocation du runner GreenPepper et la récupération des résultats
Commençons par rappeler la règle d’or : on ne travaille jamais sur le DefaultTemplate fourni par défaut mais toujours sur une copie.
Voilà la séquence à insérer :
Et quelques détails :
Commençons par le batch :
@ECHO OFF
SET GPPATH=C:Confluencegreenpepper-open-net-2.9-V4.0
SET EXECUTABLE=%GPPATH%\GreenPepper.exe
REM SET BUILDSOURCE=C:\Drops\Homologation\GreenPepper
SET BUILDSOURCE=%1
SET CLASSPATH="
SET CLASSPATH=%CLASSPATH%%GPPATH%\CookComputing.XmlRpc.dll;
SET CLASSPATH=%CLASSPATH%%GPPATH%\GreenPepper.Core.dll;
SET CLASSPATH=%CLASSPATH%%GPPATH%\GreenPepper.exe;
SET CLASSPATH=%CLASSPATH%%GPPATH%\GreenPepper.Extensions.dll;
REM SET CLASSPATH=%CLASSPATH%%BUILDSOURCE%\LG.GreenPepperTest.dll;
SET CLASSPATH=%CLASSPATH%%BUILDSOURCE%\%2;
SET CLASSPATH=%CLASSPATH%"
SET REPOSITORY="
SET REPOSITORY=%REPOSITORY%GreenPepper.Repositories.GreenPepperRepository
SET REPOSITORY=%REPOSITORY%;http://vmlgdev1:8585/confluence/rpc/xmlrpc?handler=greenpepper1&sut=
REM SET REPOSITORY=%REPOSITORY%HomologationBuild
SET REPOSITORY=%REPOSITORY%%3
SET REPOSITORY=%REPOSITORY%"
SET SUD=GreenPepper.Fixtures.PlainOldSystemUnderDevelopment
SET INPUT=Confluence-ElGeneral
SET OUTPUT="%BUILDSOURCE%\result\"
%EXECUTABLE% --stop --xml -a %CLASSPATH% -s -r %REPOSITORY% -f %SUD% %INPUT% %OUTPUT%
En commentaires se trouvent des valeurs d’exemple liées à mon dernier projet. En rouge se trouvent l’adresse du serveur GreenPepper et le nom du projet GreenPepper (visible dans la configuration de l’espace confluence), à modifier évidemment en fonction de votre configuration.
Plusieurs remarques :
Et c’est tout alors ? Non, il reste une subtilité qui a son importance : la façon d’exécuter. Elle est fondamentalement différente entre le batch présenté et un clic sur ‘execute’ dans l’interface web.
En effet, GreenPepper, lorsqu’on clique sur ‘Execute’, va exécuter le runner une fois pour chaque page de spécification, alors que le batch ne lance qu’un seul processus pour l’ensemble des spécifications. La conséquence ? Si vos tests GreenPepper utilisent des bouchons pour des services réseau ou une base de donnée en mémoire, ceux-ci ne seront par recréés entre chaque page de spécification.
Il faut donc penser à rajouter en tête de chaque page de spécifications une fixture qui va s’occuper de nettoyer la base mémoire (voire de la recréer) et de remettre dans leur état initial l’ensemble des bouchons utilisés par vos spécifications exécutables, faute de quoi vos pages de spécifications risquent d’échouer les unes après les autres parce que les données ne sont pas bonnes (voire d’échouer sur les INSERT en base pour cause d’IDs dupliqués).
En l’état, vous aurez seulement un avis global sur GreenPepper (tout est vert/Au moins un test ne passe pas) sans plus de détail. Il faudra aller consulter les rapports d’exécution pour cela.
Si vous voulez un rapport plus complet, il faut rediriger la sortie du batch vers le log TFS (en ajoutant une activité WriteBuildMessage sur l’output de l’activité InvokeProcess), ce qui vous indiquera, par page de spécifications, le nombre de tests verts et rouges.
Et oui, c’est l’inconvénient de cette façon de faire. Supposez que vous lanciez deux fois le même build en parallèle. Si, pendant l’exécution de GreenPepper, le second build tente de supprimer le répertoire dans lequel se trouvent les binaires, soit il n’y arrive pas parce que c’est verrouillé, soit il y arrive (par chance) et le premier build voit son GreenPepper partir en erreur sur tous les tests.
D’où également l’importance de choisir un répertoire de binaires différent pour chaque build.