Framework de test : Robot Framework

Rédigé par Dominique Mereaux le 17 septembre 2011

Actuellement je travaille sur un framework de test intéressant à mon sens nommé Robotframework.

Il est né des besoins suivants:
  • Offrir un langage de haut niveau pour des testeurs fonctionnels
  • Possibilités d'écrire des tests de recette avant livraison du produit


Le principe est le suivant :
  1. des mots-clefs de base correspondent à des actions unitaires (par exemple "entrer une chaine de caractères dans le champ de login", "entrer une chaine de caractère dans le champ password", "cliquer sur login" ...)
  2. On peut créer des mots-clefs à partir d'autre mots-clefs, par exemple un mot clef login correspond à la séquence "entrer une chaine de caractères dans le champ de login" + "entrer une chaine de caractère dans le champ password" + "cliquer sur login"


Il offre les fonctionnalités suivantes:
  • Ecrire des tests de type "Behavior Test Driven"
  • Ecrire des tests de type "Data Test Driven"
  • Gestion de variable de test avec des valeurs par défaut
  • Fourniture d'un rapport de test html (excellent)
  • Possibilités de tagger les tests afin de fournir des résultats par tag
  • Library d'action de base Selenium, AutoIt ...
  • Possibilité de créer sa propre library
  • Library de gestion système (création fichier, directory ....)
  • Library dédié test (screenshot, step manuel ...)
  • Découpage en test et test suite
  • Possibilité d'arborescence pour classer les tests
  • Possibilité d'associer des actions de début et fin de test (pré requis, post test)
  • Format des tests : html, csv ou texte.
Etc ...

Quelques défauts :
  • L'éditeur de test n'est pas terrible voir buggé
  • Pas de vrai gestion de test mais il y aurait une possibilité de le connecter à testlink.
Voilà après quelques essais je suis assez emballée ...

Classé dans : Automatisation - Mots clés : robot framework - 1 commentaire

Selenium : Element-filters

Rédigé par Dominique Mereaux le 17 septembre 2011

A quoi servent les element-filters : ce post, je l'espère va vous l'expliquer.

Soit le code extrait de meto.fr qui permet de sélectionner celsius ou fahrenheit pour la température:


<p class="clearfix"><span>
<input checked="checked" class="checkbox" id="celsius" name="unit" type="radio" value="celsius"/>
<label for="celsius">degrés Celsius (°C)</label>
</span></p>
<p class="clearfix"><span>
<input class="checkbox" id="fahrenheith" name="unit" type="radio" value="fahrenheith"/>
<label for="fahrenheith">degrés Fahrenheit (°F)</label>
</span>

Tel que on ne peut pas sélectionner l'élément en utilisant le nom (Name=unit), d'où l'intéret d'utiliser les element-filters qui vont permettre de raffiner la recherche :

<tr> <td>click</td> <td>link=Options</td> <td></td> </tr> <tr> <td>click</td> <td>name=unit index=1</td> <td></td> </tr>

Ici on prendra le deuxième élément avec name=unit (index commence à 0).

Il existe deux types d'element-filter:
  • index : que l'on vient de voir et
  • Value : si l'élément possède une "value" on peut utiliser cette dernière pour préciser la recherche tel que dans l'exemple suivant :
<tr> <td>click</td> <td>link=Options</td> <td></td> </tr> <tr> <td>click</td> <td>name=unit value=celsius</td> <td></td> </tr>

Classé dans : Automatisation, Outil de test - Mots clés : selenium - aucun commentaire

Automatiser oui mais ...

Rédigé par Dominique Mereaux le 17 septembre 2011

J'ai trouvé cette citation d'un responsable de test qui résume bien la situation:

"Automated test are by nature scripted, not exploratory. Even with an automation stack which injects all sort of variability, the tests wear grooves in those areas of the product they cover and they ignore everything else. "

Finalement faire uniquement confiance à des tests automatisés peut conduire à ne pas voir des problèmes liés à des effets de bord: en effet dans un test automatique on ne vérifie que des points particuliers et parfois une action peut affecter de façon non attendu l'application testée. Également il arrive que l'on réinitialise plus fréquemment l'environnement de test ce qui ne nous met pas dans toujours dans des conditions réalistes d'utilisation.

De la même façon lorsque l'on réalise des tests de façon manuelle on le réalise souvent avec des variantes, voir on image de nouveaux tests qui améliore la couverture des tests.

Voilà pourquoi à mon sens et de part quelques expériences récentes je préconiserais de toujours garder une part de test manuel.

Classé dans : Automatisation - Mots clés : aucun - aucun commentaire

Consigner vos résultats de test automatiquement avec Testlink

Rédigé par Dominique Mereaux le 17 juin 2011

Testlink est un outil de gestion de test classique (Exigences-Plan de test-Exécution de test). Il n'est pas possible de lancer les tests de façon mais on peut reporter les résultats de test de façon automatique grâce à une API qui permet de se connecter via RPC. Le client peut-être écrit dans le langage désiré.

Vous trouverez la description de l'interface à cette adresse:
TestlinkXMLRPCServer

La mise à jour se fait grâce à la fonction suivante en python:

result = client.reportTCResult(TestID, TestPlanID, "p")

fonction définie de la façon suivante:

def reportTCResult(self, testcaseid, testplanid, status): data = {"devKey":self.devKey, "testcaseid":testcaseid, "testplanid":testplanid,"status":status} return self.server.tl.reportTCResult(data)

Correspondant à coté testlink:

mixed reportTCResult( struct $args, string $args["devKey"], int $args["testcaseid"], int $args["testplanid"], string $args["status"], int $args["buildid"], string $args["notes"], bool $args["guess"] )

Parameters:
struct $args:  
string $args["devKey"]:  
int $args["testcaseid"]:  
int $args["testplanid"]:  
string $args["status"]: - status is $validStatusList
int $args["buildid"]: - optional
string $args["notes"]: - optional
bool $args["guess"]: - optional definiing whether to guess optinal params or require them explicitly default is true (guess by default)
API Tags:
Return: [status] => true/false of success [id] => result id or error code [message] => optional message for error message string
Access: public
Premier paramètre DevKey: cette clef permet de s'authentifier dans testlink, chaque développeur ou testeur à sa clef qu'il peut générer grâce à un menu: generate DevKey que l'on trouve dans l'ongle personal(gestion de ses données personnelles).

devkey.JPG

Par défaut ce menu n'est pas présent. Il faut modifier la configuration du serveur testlink pour avoir ce menu. Il faut modifier le fichier custom_config.inc.php (sous testlink) qui va surcharger les valeur par défaut du fichier config.inc.php:

$tlCfg->api->enabled = TRUE; 2ème paramètre: TesCaseId: il s'agit d'un identifiant interne du cas de test. Il est extrair grâce à la fonction python:

def getTestCaseIDByName (self, testcasename): data = {"devKey":self.devKey, "testcasename":testcasename} return self.server.tl.getTestCaseIDByName(data)

dont l'équivalent côté php est:

getTestCaseIDByName [line 1540]



mixed getTestCaseIDByName( struct $args, string $args["devKey"], string $args["testcasename"], string $args["testsuitename"] )

Find a test case by its name

Searching is case sensitive. The test case will only be returned if there is a definite match. If possible also pass the string for the test suite name. No results will be returned if there are test cases with the same name that match the criteria provided.

Parameters:
struct $args:  
string $args["devKey"]:  
string $args["testcasename"]:  
string $args["testsuitename"]: - optional
API Tags:
Access: public

Pour simplifier je n'ai pas pris en compte le paramètre testsuitename.

3ème paramètre: Le test plan Id soit l'identifiant interne du plan de test dont on peut récupérer la valeur grâce à la fonction suivante:

def getProjectTestPlans(self, testprojectid): data = {"devKey":self.devKey, "testprojectid":testprojectid} return self.server.tl.getProjectTestPlans(data) qui correspond coté testlink à:

getProjectTestPlans [line 1329]



mixed getProjectTestPlans( struct $args, string $args["devKey"], int $args["testprojectid"] )

Gets a list of test plans within a project

Parameters:
struct $args:  
string $args["devKey"]:  
int $args["testprojectid"]:  
API Tags:
Access: public
4ème paramètre: le statut du test, içi il est à "p" comme passed.

les paramètres suivants sont optionnels, pour simplifier je ne les ai pas préciser, néanmoins il faut modifier le paramètre

const BUILD_GUESS_DEFAULT_MODE=ON; (fichier xmlrpc.php)

qui signifie que par défaut on utilise le dernier build par défaut. Il peut y avoir plusieurs builds dans un même plan de test.

Des exemples plus complets existent pour le langage php sous \testlink\lib\api\sample_clients\php.

Classé dans : Automatisation - Mots clés : testlink - aucun commentaire

Selenium : trouver un objet par identifiant

Rédigé par Dominique Mereaux le 17 juin 2011

C'est le moyen le plus simple d'accéder aux objets avec selenium à condition que les développeurs positionnent ces éléments.
identifier=id

L'élément est sélectionné d'abord avec l'attribut id (code html) puis si pas de concordance avec l'attribut name.

id=id

L'élément est sélectionné d'abord avec l'attribut id (code html).
name=name


L'élément est sélectionné d'abord avec l'attribut name (code html).

Exemple :
Soit le code cible html:

<a id="Sell" href="http://annonces.ebay.fr/sell">Vendre</a>

Les codes suivants fonctionnent et permettent de cliquer sur le lien Vendre.
<tr>
<td>clickAndWait</td>
<td>Identifier=Sell</td>
<td></td>
</tr>


<tr>
<td>clickAndWait</td>
<td>Id=Sell</td>
<td></td>
</tr>


Soit le code html suivant (sfr.fr):
	<div style="float:left;"><label for="prof_sexe"><strong>Je suis</strong></label><br>

 	<select name="prof_sexe">

 		<option value="2">Une femme</option>

		<option value="1">Un homme</option>

 	</select>

       </div>
Les codes de test permettent de sélectionner "Un homme" dans le choix "prof_sexe":
<tr>
<td>open</td>
<td>/accueil/adsl.html</td>
<td></td>
</tr>
<tr>
<td>select</td>
<td>Name=prof_sexe</td>
<td>label=Un homme</td>
</tr>
<tr>
<td>open</td>
<td>/accueil/adsl.html</td>
<td></td>
</tr>
<tr>
<td>select</td>
<td>Identifier=prof_sexe</td>
<td>label=Un homme</td>
</tr>


Si on ne précise rien (Name, Identifier, Id) par défaut la recherche se fait par "Identifier".

D'ailleurs lors d'un enregistrement rien n'est précisé.

Classé dans : Automatisation - Mots clés : selenium - aucun commentaire

Fil Rss des articles de cette catégorie

précédentepage 2 sur 2

Catégories

Archives

Mots clés

Derniers articles

Derniers commentaires