Il est possible de faire exécuter du code Java externe par les utilisateurs virtuels durant un test en charge. Cette fonctionnalité permet d'élargir le champ fonctionnel de NeoLoad pour concevoir des utilisateurs virtuels au comportement très avancé.
Ce tutorial se base sur l'exemple d'appels RMI (Remote Method Invocation) vers un serveur Java distant. Le serveur offre deux services : un service fournissant la valeur en dollars d'une action américaine en bourse, un autre pouvant convertir une somme d'argent d'une monnaie dans une autre. Nous allons chainer l'appel à ces deux services pour obtenir la valeur d'une action en Euro.
NeoLoad permet d'appeler du code Java à partir du code JavaScript, au sein de l'action logique "JavaScript".
Pour utiliser des classes Java au sein du JavaScript, les noms de
classes doivent être pleinement qualifiés (même pour les classes Java
comme java.util.List) et précédés par
"Packages.".
Par exemple :
var myObj = new Packages.com.company.MyClass(); var result = myObj.compute(myArg); var result2 = Packages.com.company.MyClass.someStaticMethod(result);
Selon les cas, il peut être opportun de cacher une partie de la complexité d'appel à une API derrière une couche "métier".
Dans le cas de notre exemple, nous choisissons de gérer de manière transparente le résultat intermédiaire, c'est à dire le cours de l'action en dollars. Le but est de simplifier au maximum les appels Javascripts par la suite.
public class SampleClient {
private StockProvider remoteStockProvider;
private CurrencyConverter remoteCurrencyConverter;
private float usdStockQuote=-1;
public void connect() throws NotBoundException, IOException {
this.remoteStockProvider = (StockProvider) Naming.lookup(
"//fooserver/StockProvider"
);
this.remoteCurrencyConverter = (CurrencyConverter) Naming.lookup(
"//fooserver/CurrencyConverter"
);
}
public boolean isConnected() {
return this.remoteStockProvider != null && remoteCurrencyConverter != null;
}
public void getStockQuoteUSD(String stockSymbol) throws RemoteException {
if (!isConnected()) {
throw new IllegalStateException("Not connected to server");
}
this.usdStockQuote = this.remoteStockProvider.getStockQuote(stockSymbol);
}
public float getStockQuoteEur() throws RemoteException {
if (this.usdStockQuote < 0) {
throw new IllegalStateException("The method getStockQuoteUSD() " +
"has not been called.");
}
return this.remoteCurrencyConverter.currencyConvert(
"USD", "EUR", this.usdStockQuote
);
}
}La méthode connect() permet de se
connecter à l'objet distant, getStockQuoteUSD()
récupère et stocke de manière interne le cours de l'action spécifiée, puis
getStockQuoteEur() retourne le cours de l'action
converti en Euro.D'une manière générale, NeoLoad doit avoir accès aux classes Java utilisées.
Copier le code à appeler ainsi que les librairies utilisées dans le
répertoire <projet-neoload>/lib/jslib/. Vous
pouvez aussi bien placer des fichiers JARs que des fichiers .class dans ce
répertoire.
Pour notre exemple, copier la classe SampleClient
compilée dans <projet-neoload>/lib/jslib/ ainsi
que les JARs contenant les interfaces des objets distants utilisés :
StockProvider et
CurrencyConverter.
Nos appels RMI nécessitent des données en entrée : les symboles
d'actions dont on veut récupérer le cours. Créer la variable
"stockSymbols" de type Fichier avec
les valeurs voulues :
Créer le fichier stockQuotes.csv
symbol;description IBM;IBM MSFT;Microsoft AAPL;Apple ORCL;Oracle JAVA;Sun GOOG;Google
Procédure 16.2. Créer la variable "stockSymbols"
Utiliser le menu "Edition /
Variables".
Cliquer le bouton "Créer une
variable".
Sélectionner le type "Fichier".
Nommer la variable "stockSymbols".
Utiliser le fichier précédemment créé.
Sélectionner l'option "Utiliser la première ligne comme entête".
Laisser les politiques de changements de valeur par défaut : chaque ligne du fichier correspond ainsi à une instance d'Utilisateur Virtuel.
Cliquer sur "Ok".
Créer un nouvel Utilisateur Virtuel dans le projet courant. Nous allons créer une action par appel RMI car cela nous permet d'obtenir des statistiques de temps d'accès pour chaque appel :
Placer trois actions logiques "JavaScript" dans l'Utilisateur
Virtuel. Nommons les "connect"
,"getStockQuoteUSD" et
"getStockQuoteEur".
Placer une action "Délai" entre chaque action JavaScript.
Editer la durée de chaque délai. Elle doit correspondre au délai entre les deux appels dans l'application à simuler.
Remplacer le code par défaut de chaque action par le code qui suit.

Le code Javascript des trois actions est le suivant :
connect
var sampleClient = Packages.com.neotys.test.rmi.client.SampleClient();
sampleClient.connect();
context.currentVU.put("sampleClient", sampleClient);
logger.debug("sampleClient connected");Le script crée une instance de la classe SampleClient
précédemment décrite et établit la connexion avec le serveur. L'instance
sampleClient est stockée au sein de l'instance de
l'Utilisateur Virtuel pour être utilisé par les requêtes suivantes. On a
ainsi une instance de SampleClient par instance
d'Utilisateur Virtuel durant le test.
getStockQuoteUSD
var sampleClient = context.currentVU.get("sampleClient");
var stockSymbol = context.variableManager.getValue("stockSymbols.symbol");
logger.debug("stockSymbol=" + stockSymbol);
sampleClient.getStockQuoteUSD(stockSymbol);
Le script récupère l'instance sampleClient
stockée par le script précédent, puis interprète la variable
"stockSymbols" précédemment créée. La méthode
getStockQuoteUSD effectue l'appel RMI permettant
d'obtenir la valeur de l'action dont le symbole provient du fichier CSV.
La valeur en dollars est stockée au sein du
SampleClient, elle servira d'argument au prochain
appel.getStockQuoteEuro
var sampleClient = context.currentVU.get("sampleClient");
var stockValueEuro = sampleClient.getStockQuoteEUR();
logger.debug("Stock price €" + stockValueEuro);
context.variableManager.setValue("stockPriceEUR", stockValueEuro);Le script récupère l'instance sampleClient
stockée par le premier script, puis effectue l'appel à la méthode RMI
permettant de convertir en Euro la valeur en dollars précédemment stockée.
L'appel au VariableManager permet d'injecter la valeur
retournée par RMI dans une variable NeoLoad. Il devient possible
d'utiliser cette valeur dans NeoLoad, par exemple comme paramètre d'une
requête HTTP classique. Ceci sort du cadre de l'exemple.
Comme pour un Utilisateur Virtuel classique, il est nécessaire de lancer la validation de l'Utilisateur Virtuel afin de s'assurer qu'il s'exécute correctement.
Utiliser le menu "Lancer / Démarrer la validation"
pour ouvrir le panneau de validation.
Sélectionner l'utilisateur approprié dans la liste déroulante
("RMIUser").
Cliquer sur le bouton "Lancer la validation".

Gestion des erreurs
Le code retour JS-OK signifie que le code Javascript a été
correctement exécuté. En cas d'erreur Javascript ou si le code Java lève
une exception, l'action "Javascript" est marquée en erreur, avec un code
d'erreur JS-ERROR-EVAL ou JS-FAIL.
La méthode logger.debug() permet de logger les
informations utiles permettant de s'assurer du bon déroulement du scénario
lors de la validation. Dans notre exemple, nous affichons le résultat du
dernier appel RMI. Par défaut, Les logs de niveau DEBUG ne sont affichés
que lors de la validation. Se reporter au guide de référence pour plus d'informations les
logs.
Une fois l'Utilisateur Virtuel créé et validé, créer une population et configurer votre scénario comme pour un test classique.
L'action logique "JavaScript" n'est pas considérée dans NeoLoad comme une requête. Ainsi, la plupart des statistiques NeoLoad comme Pages/s moyen, Hits/s moyen, Temps de réponse moyen de requête, ... sont égales à zéro. C'est valable au niveau de la surveillance durant le test, dans la synthèse du test et pour les rapports générés.
Ainsi, les seuls endroits où trouver les statistiques concernant le
Javascript sont les onglets "Valeurs" et
"Graphiques" de NeoLoad. Les informations accessibles
dans ces onglets sont les mêmes que pour une requête HTTP.
Pour plus d'information sur le Javascript dans NeoLoad, voir la section intitulée « Javascript ».
Voir L'API Javascript de NeoLoad.