Est-il possible de créer des tests Selenium en utilisant le plugin Firefox qui utilise des valeurs générées aléatoirement pour faciliter les tests de régression?
L'histoire complète: .__ Je voudrais aider mes clients à effectuer des tests d'acceptation en leur fournissant une suite de tests qui utilise des connaissances intelligentes pour créer des valeurs aléatoires (ou au moins pseudo-aléatoires) pour la base de données. L'un des problèmes avec mes tests Selenium IDE pour le moment est qu'ils ont des valeurs prédéfinies, ce qui rend certains types de tests problématiques.
Tout d’abord, Selenium IDE est plutôt limité, vous devriez envisager de passer à Selenium RC, qui peut être piloté par Java, Perl ou Ruby ou d’autres langages.
En utilisant uniquement Selenium IDE, vous pouvez incorporer des expressions JavaScript pour dériver les paramètres de commande . Vous devriez pouvoir taper un nombre aléatoire dans un champ de texte, par exemple:
type fieldName javascript{Math.floor(Math.random()*11)}
Update: Vous pouvez définir des fonctions d'assistance dans un fichier nommé "user-extensions.js". Voir la Référence de sélénium .
(Basé sur la réponse de Thilo) Vous pouvez mélanger des littéraux et des nombres aléatoires comme ceci:
javascript{"joe+" + Math.floor(Math.random()*11111) + "@gmail.com";}
Avec Gmail, tout ce qui utilise des alias, par exemple, [email protected]
, sera automatiquement envoyé à votre adresse [email protected]
Multiplier * 11111 pour vous donner plus de valeurs aléatoires que 1 à 9 (dans l'exemple de Thilo)
Vous pouvez ajouter l'utilisateur exentions.js pour obtenir les valeurs aléatoires.
Copiez le code ci-dessous et enregistrez-le sous l'extension .js (randomgenerator.js) et ajoutez-le aux extensions du noyau Selenium (SeleniumIDE -> Options ---> onglet général)
Selenium.prototype.doRandomString = function( options, varName ) {
var length = 8;
var type = 'alphanumeric';
var o = options.split( '|' );
for ( var i = 0 ; i < 2 ; i ++ ) {
if ( o[i] && o[i].match( /^\d+$/ ) )
length = o[i];
if ( o[i] && o[i].match( /^(?:alpha)?(?:numeric)?$/ ) )
type = o[i];
}
switch( type ) {
case 'alpha' : storedVars[ varName ] = randomAlpha( length ); break;
case 'numeric' : storedVars[ varName ] = randomNumeric( length ); break;
case 'alphanumeric' : storedVars[ varName ] = randomAlphaNumeric( length ); break;
default : storedVars[ varName ] = randomAlphaNumeric( length );
};
};
function randomNumeric ( length ) {
return generateRandomString( length, '0123456789'.split( '' ) );
}
function randomAlpha ( length ) {
var alpha = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.split( '' );
return generateRandomString( length, alpha );
}
function randomAlphaNumeric ( length ) {
var alphanumeric = '01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.split( '' );
return generateRandomString( length, alphanumeric );
}
function generateRandomString( length, chars ) {
var string = '';
for ( var i = 0 ; i < length ; i++ )
string += chars[ Math.floor( Math.random() * chars.length ) ];
return string;
}
Manière d'utiliser
Command Target Value
----------- --------- ----------
randomString 6 x
type username ${x}
Le code ci-dessus génère une chaîne de 6 caractères et est assigné à la variable x
Le code au format HTML ressemble à ceci:
<tr>
<td>randomString</td>
<td>6</td>
<td>x</td>
</tr>
<tr>
<td>type</td>
<td>username</td>
<td>${x}</td>
</tr>
Voici une solution en une ligne pour générer une chaîne de lettres aléatoire dans JS:
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".split("").filter(function(e, i, a) { return Math.random() > 0.8 }).join("")
Utile pour coller dans Selenium IDE.
<tr>
<td>store</td>
<td>javascript{Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 8)}</td>
<td>myRandomString</td>
</tr>
Une ligne pour choisir au hasard parmi un petit nombre d'alternatives:
javascript{['brie','cheddar','swiss'][Math.floor(Math.random()*3)]}
J'ai légèrement amélioré la fonction generateRandomString .. Lorsque FF plante, il est bon de pouvoir utiliser à nouveau le même nombre aléatoire.
En gros, il vous sera demandé de saisir vous-même une chaîne. Si vous n'entrez rien, cela le générera.
function generateRandomString( length, chars ) {
var string=Prompt("Please today's random string",'');
if (string == '')
{for ( var i = 0 ; i < length ; i++ )
string += chars[ Math.floor( Math.random() * chars.length ) ];
return string;}
else
{
return string;}
}
Tout en donnant un sens au message de RajendraChary ci-dessus, j'ai passé quelque temps à écrire une nouvelle extension de Selenium IDE.
Mon extension permettra à l'utilisateur de renseigner une variable avec le texte lorem ipsum. Il y a un certain nombre d'options configurables et c'est devenu une petite commande sympa. Vous pouvez faire des choses comme "5 mots | wordcaps | nomarks" pour générer 5 mots lorem ipsum, tous capitalisés, sans ponctuation.
J'ai expliqué en détail l'installation et l'utilisation et fourni la base de code complète ici
Si vous jetez un coup d'œil au code, vous aurez une idée de la façon de créer des fonctionnalités similaires.
Voici une autre variante de l'exemple gmail:
<tr>
<td>runScript</td>
<td>emailRandom=document.getElementById('email');console.log(emailRandom.value);emailRandom.value="myEmail+" + Math.floor(Math.random()*11111)+ "@gmail.com";</td>
<td></td>
</tr>
Math.random peut être "assez bon" mais, dans la pratique, le Classe aléatoire est souvent préférable à Math.random (). En utilisant Math.random, les nombres que vous obtenez peuvent ne pas être complètement aléatoires. Le livre "Effective Java Second Edition" traite de cela à la question n ° 47.
Une autre solution, que j'ai copiée et collée dans des centaines de tests:
<tr>
<td>store</td>
<td>javascript{var myDate = new Date(); myDate.getFullYear()+"-"+(myDate.getMonth()+1)+"-"+myDate.getDate()+"-"+myDate.getHours()+myDate.getMinutes()+myDate.getSeconds()+myDate.getMilliseconds();}</td>
<td>S_Unique</td>
</tr>
<tr>
<td>store</td>
<td>Selenium Test InternalRefID-${S_Unique}</td>
<td>UniqueInternalRefID</td>
</tr>
<tr>
<td>store</td>
<td>Selenium Test Title-${S_Unique}</td>
<td>UniqueTitle</td>
</tr>
<tr>
<td>store</td>
<td>SeleniumEmail-${G_Unique}@myURL.com</td>
<td>UniqueEmailAddress</td>
</tr>
Chaque suite de tests commence par définir une série de variables (s'il s'agit d'une grande suite, utilisez un fichier séparé, tel que Set_Variables.html). Ces variables peuvent ensuite être utilisées dans votre suite pour définir, tester et supprimer des données de test. Et comme les variables utilisent la date plutôt qu'un nombre aléatoire, vous pouvez déboguer votre suite de tests en recherchant les objets partageant une date.
Selenium RC vous donne beaucoup plus de liberté que Selenium IDE, en ce sens que vous pouvez:
Vous avez demandé comment entrer une valeur aléatoire dans un champ à l'aide de Selenium IDE, d'autres personnes vous ont expliqué comment générer et entrer des valeurs aléatoires dans un champ à l'aide de Selenium RC. Cela entre dans la phase de test (1): "Entrez n'importe quelle valeur dans un certain champ".
En utilisant Selenium RC, vous pouvez facilement réaliser les phases (2) et (3): tester n’importe quel champ sous n’importe quelle étape d’exécution en programmant dans un langage pris en charge, tel que Java, PHP, CSharp, Ruby, Perl, Python.
Voici les étapes à suivre pour effectuer les phases (2) et (3):
Voir mon autre réponse à propos du test de fuzzing, du sélénium et des tests de boîte blanche/noire