Exécuter du code Java

Introduction

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.

Fonctionnement et syntaxe

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);

Ecrire le code Java

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.

Configurer NeoLoad

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.

Préparer les données

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"

  1. Utiliser le menu "Edition / Variables".

  2. Cliquer le bouton "Créer une variable".

  3. Sélectionner le type "Fichier".

  4. Nommer la variable "stockSymbols".

  5. Utiliser le fichier précédemment créé.

  6. Sélectionner l'option "Utiliser la première ligne comme entête".

  7. Laisser les politiques de changements de valeur par défaut : chaque ligne du fichier correspond ainsi à une instance d'Utilisateur Virtuel.

  8. Cliquer sur "Ok".

Concevoir l'Utilisateur Virtuel

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 :

  1. Placer trois actions logiques "JavaScript" dans l'Utilisateur Virtuel. Nommons les "connect" ,"getStockQuoteUSD" et "getStockQuoteEur".

  2. Placer une action "Délai" entre chaque action JavaScript.

  3. Editer la durée de chaque délai. Elle doit correspondre au délai entre les deux appels dans l'application à simuler.

  4. 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.

Valider l'Utilisateur Virtuel

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.

  1. Utiliser le menu "Lancer / Démarrer la validation" pour ouvrir le panneau de validation.

  2. Sélectionner l'utilisateur approprié dans la liste déroulante ("RMIUser").

  3. 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.

Test et résultats

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.

Liens connexes

Pour plus d'information sur le Javascript dans NeoLoad, voir la section intitulée « Javascript ».

Voir L'API Javascript de NeoLoad.