Tests automatisés : application à un MES


Retour à la page développeur

Mots-clefs : MES, JUnit, C++, ASP, web, testing, script, OPC, scenario.

Problématique :

Un système MES est un logiciel qui couple un système automatisé et un ERP. Dans le cas étudié ici, l'interface entre le MES et l'automatique est faite grâce à la technologie OPC (Ole for process control).
L'application est structurée ainsi :
- un module C++ connecté aux automates via OPC ;
- une base de données ;
- un ensemble de scripts ASP (Active Server Page) qui consistuent l'interface du système.

La difficulté consiste à tester l'ensemble en mode 100% automatique.

Principe :

Le processus de test comporte les étapes suivantes :
1- actualisation du code source (grâce à un système de controle des versions, ou SCM très populaires : CVS)
2- recompilation en mode Debug et Release des projets de Visual C++
3- requêtes automatique sur chacune des pages WEB pour détecter les erreurs 404 ou 500 ;
4 - si l'étape 2 est réussie, exécution d'un scenario de test
5 - en cas d'erreurs à l'étape 2,3 ou 4, envoyer un mail de notification.

Un scénario de test doit pouvoir :
1- simuler le comportement de l'utilisateur sur l'interface WEB ;
2- simuler le comportement de l'automatique sur les variables OPC ;
3- vérifier la cohérence des informations dans la base de données ;
4- vérifier la cohérence des informations transmises à l'automatique.

Mon approche est présentée sur plusieurs pages:
- Automatisation des processus de build
- Automatisation du test de l'interface web
- Présentation d'un pseudo-langage de script
- Automatisation du test C++/Database
- Simulation du traffic OPC.

Code :

Automatisation du process de build

Visual Studio offre la possibilité de créer des fichiers MAKE. Ces fichiers contiennent toutes les informations nécessaires à la compilation du code source de l'application. Il suffit d'invoquer l'utilitaire NMAKE dans chacun des dossiers du projets. Les fichiers BATCH (ici pour Windows 2000) suivants permettent de réaliser simplement l'automatisation du process.

REM Utility for automated building of a VC++ project
REM first argument must be the VC++ project's name
REM second argument must be Debug or Release
REM
REM Author : Pascal Brunot pascal_brunot@yahoo.it
REM
REM Output : nmake standard outpout to makelog.txt
REM nmake error output to makeerrlog.txt

echo *** making %1 %2
echo ******************************************************** >>%automated%\makelog.txt
echo *** now making %1 %2 >>%automated%\makelog.txt
echo ******************************************************** >>%automated%\makelog.txt

cd %coderoot%\%1
nmake /NOLOGO /A /x c:\tmpmklog.txt /f %1.mak CFG="%1 - Win32 %2" >>%automated%\makelog.txt
REM If size of tmpmklog >= 1 then a build error has occured
%automated%\GRADE c:\tmpmklog.txt 1 >NULL
IF EXIST NULL del NULL
IF ERRORLEVEL 1 goto builderr

:buildok
echo Build of %1 complete ! >>%automated%\makelog.txt
echo Build of %1 complete !
set ERRORLEVEL=0
goto fin

:builderr
echo BUILD FAILED %1 %2 !
echo BUILD FAILED %1 %2 >>%automated%\makelog.txt
set HAS_ERROR=1

:fin
echo build of %1 %2 >>%automated%\makeerrlog.txt
type c:\tmpmklog.txt >>%automated%\makeerrlog.txt
del c:\tmpmklog.txt

La variable %coderoot% doit contenir le chemin du workspace.
La variable %automated% est le répertoire qui contient tous les scripts batch et fichiers générés par ceux-ci.

Pour détecter les erreurs, j'utilise le programmer GRADE (téléchargeable ici)qui retourne dans ERRORLEVEL le résultat de la comparaison entre la taille du fichier et l'argument qui lui est passé. Le principe est que si NMAKE a généré un fichier de taille non-nulle comme log d'erreur, c'est que quelque chose c'est mal passé.

L'interpréteur de commande permet d'appeler ensuite ce script pour tous les fichiers présents dans une liste, grâce à des commandes telles que :

for /F "eol=; tokens=1 delims=," %%a in (%automated%\projectslist) do call %automated%\singlebuild %%a Release

for /F "eol=; tokens=1 delims=," %%a in (%automated%\projectslist) do call %automated%\singlebuild %%a Debug

Le fichier projectslist ressemble à ça :

; This is the project list to build automatically
; write the directory name exactly as it appears in VC++ and the output of the make command file name
; note that each directory must contain a .mak file (use Export make file of VC++)
myProject1
myProject2

Dans le cas d'un workspace contenant plusieurs projets, on peut utiliser le script suivant (build.bat), qui envoie automatiquement des mails en cas d'erreur (voire de succès) :

@echo off

REM Author Pascal Brunot - pascal_brunot@yahoo.it
REM
REM This script builds all the projects and runs the test if the build is successfull
REM options :
REM NOMAIL : do not send any mail
REM MAILIFFAILED : do not send "OK" mails

set prevcd=%CD%
set coderoot=C:\usr\Application\PIMS
set exetarget=C:\usr\Application\EXE
set automated=C:\usr\Application\nightbuilds
set mysmtp=smtp.wanadoo.fr
set nberrors=0
set has_error=0

cd %automated%
call cvsupdate.bat
cd %automated%
del %automated%\makelog.txt
del %automated%\makeerrlog.txt

REM Configuring mail client
%automated%\blat -install %mysmtp% pascal_brunot@yahoo.it >NULL

echo ******************************************************** >>%automated%\makelog.txt
echo Starting an automated build on %date% - %time% >>%automated%\makelog.txt
echo ******************************************************** >>%automated%\makelog.txt
for /F "eol=; tokens=1 delims=," %%a in (%automated%\projectslist) do call %automated%\singlebuild %%a Release

for /F "eol=; tokens=1 delims=," %%a in (%automated%\projectslist) do call %automated%\singlebuild %%a Debug

if %HAS_ERROR% GTR 0 goto error
echo All builds complete
if %1==NOMAIL goto end
if %1==MAILIFFAILED goto end
copy %automated%\buildok.txt %automated%\mailok.txt
for /F "eol=; tokens=1 delims=," %%a in (%automated%\projectslist) do echo %%a >>%automated%\mailok.txt
%automated%\blat %automated%\mailok.txt -subject "Build successfull" -attach %automated%\makelog.txt -to pascal_brunot@yahoo.it
del %automated%\mailok.txt
goto end
:error
echo ******** There has been failed builds !!!
if %1==NOMAIL goto end
echo now sending mails
%automated%\blat %automated%\failedbuild.txt -subject "Build failed" -attach %automated%\makeerrlog.txt -attach %automated%\makelog.txt -to pascal_brunot@yahoo.it
:end
del %automated%\NULL
set coderoot=
set exetarget=
set automated=
set a=

set mysmtp=
set has_error=
cd %prevcd%
set cd=

Ce script utilise le programme BLAT pour envoyer des mails depuis la ligne de commande (téléchargeable ici)

Notez que la ligne call cvsupdate.bat appelle la mise à jour du code source avec les modifications des autres développeurs. Voici le détail de ce fichier :

@echo off
set toto=%path%
set path=c:\program files\TortoiseCVS;c:\j2sdk1.4.0\bin;%path%
set CVSROOT=:pserver:LOGIN@SERVER:2401/usr/local/cvsroot
cvs login <passwd
c:
pushd c:\usr\Application
cvs update -Pd
set PATH=%toto%
set toto=
popd

Dans ce fichier j'utilise le client CVS Tortoise (www.sourceforge.net). Un fichier passwd contient le mot de passe pour accès à la repositor (en clair... attention aux droits d'accès à ce fichier!).

Passer à : test automatisés d'une interface web


Retour à la page développeur