Cet exemple utilise un enregistrement d'une transaction boursière à l'aide de l'application Trade d'IBM. Les concepts présentés ici peuvent être utilisés dans des tests d'autres applications.
Le test commence par un enregistrement d'une transaction boursière, à l'aide de la substitution de pool de données pour les ID connexion.
Les pages sont envoyées dans une boucle comportant cinq itérations, comme illustré dans la figure suivante.
Parmi les différentes pages du test, il existe trois éléments de code personnalisé (indiqués par des cercles verts dans lesquels se trouvent des caractères "C"). Cet exemple explore ces éléments de code personnalisé.
La première partie du code personnalisé, InitializeBuyTest, est mentionnée ici :
package customcode;
import java.util.Random;
import com.ibm.rational.test.lt.kernel.IDataArea;
import com.ibm.rational.test.lt.kernel.services.ITestExecutionServices;
import com.ibm.rational.test.lt.kernel.services.IVirtualUserInfo;
/**
* @author inconnu
*/
public class InitializeBuyTest implements
com.ibm.rational.test.lt.kernel.custom.ICustomCode2 {
/**
* Les instances de cette classe seront créées avec le constructeur sans argument.
*/
public InitializeBuyTest() {
}
/**
* Pour une description des interfaces ICustomCode2 et ITestExecutionServices,
* see the Javadoc information. */
public String exec(ITestExecutionServices tes, String[] args) {
// Get the test's data area and set a flag indicating that nothing
// has failed yet. This flag will be used later to break out
// of the schedule loop as soon as a failure is encountered.
IDataArea dataArea = tes.findDataArea(IDataArea.TEST);
dataArea.put("failedYet", "false");
// Get the virtual users's data area
IDataArea vda = tes.findDataArea(IDataArea.VIRTUALUSER);
// Randomly select a stock to purchase from the set of s:0 to s:499.
IVirtualUserInfo vuInfo = (IVirtualUserInfo) vda.get(IVirtualUserInfo.KEY);
Random rand = vuInfo.getRandom();
String stock = "s:" + Integer.toString(rand.nextInt(499));
// Persist the name of the stock in the virtual user's data area.
vda.put("myStock", stock);
return stock;
}
Ce code personnalisé se trouve dans la méthode exec().
Tout d'abord la zone de données du test est acquise pour stocker une valeur d'option, dans ce cas une chaîne de texte, à utiliser pour arrêter la boucle de test lorsqu'une erreur est découverte. Les données stockées de cette manière peuvent être conservées dans les différents tests.
Une chaîne d'action boursière générée de manière aléatoire est alors créée. La valeur est stockée en tant que variable stock et est transmise en tant que valeur de retour pour la méthode. Cette valeur de retour est utilisée ultérieurement en tant que valeur de remplacement dans une demande, comme il est présenté dans la figure suivante :
L'élément mis en évidence utilise une substitution (s%3A716), qui est la valeur renvoyée par l'élément de code personnalisé InitializeBuyTest. Nous utilisons le code personnalisé pour diriger le test.
Les lignes de code suivantes dans InitializeBuyTest utilisent la zone de données de l'utilisateur virtuel pour stocker le nom de l'action pour référence ultérieure. Les données stockées de cette manière peuvent également être conservées dans les différents tests.
La deuxième partie du code personnalisé est appelée CheckStock. Son contenu est présenté ci-dessous (méthode exec()) :
public String exec(ITestExecutionServices tes, String[] args) {
// Get the actual and requested stock purchased.
String actualStock = args[0].replaceAll("<B>", "");
actualStock = actualStock.substring(0, actualStock.indexOf("<"));
String requestedStock = args[1];
// Set the log level to ALL.
IDataArea dataArea = tes.findDataArea(IDataArea.TEST);
ITestInfo testInfo = (ITestInfo)dataArea.get(ITestInfo.KEY);
testInfo.setTestLogLevel(ITestLogManager.ALL);
// If the log level is set to ALL, report the actual and requested stock
// purchased.
ITestLogManager testLogManager = tes.getTestLogManager();
if (testLogManager.wouldReport(ITestLogManager.ALL)) {
testLogManager.reportMessage("Actual stock purchased: "
+ actualStock + ". Requested stock: " + requestedStock
+ ".");
}
// If the actual and requested stock don't match, submit a FAIL verdict.
if (testLogManager.wouldReport(ITestLogManager.ALL)) {
if (!actualStock.equalsIgnoreCase(requestedStock)) {
testLogManager.reportVerdict(
"Actual and requested purchase stock do not match.",
VerdictEvent.VERDICT_FAIL);
// Use the test's data area to record the fact that an error has
// occurred.
dataArea.put("failedYet", "true");
}
}
return null;
}
Ce code commence par extraire deux arguments qui ont été transmis au code. Une partie de la réponse est mise en évidence dans l'enregistrement d'origine et utilisée en tant que référence, comme il est illustré dans la figure suivante.
Une manipulation de chaînes est requise pour l'acquisition du texte qui vous intéresse. Ici le nom de l'action achetée. Cette référence nouvellement créée est ensuite transmise dans CheckStock en tant qu'argument, comme il est présenté dans la figure suivante :
Prenez en compte le fait que la valeur de retour de InitializeBuyTest est également transmise en tant qu'argument.
L'élément de code personnalisé CheckStock utilise ces valeurs pour vérifier que l'action boursière choisie de manière aléatoire et générée par InitializeBuyTest a vraiment été achetée lors de l'exécution du test.
CheckStock définit alors le niveau de journalisation test, signale l'achat de l'action réel et demandé et émet un verdict FAIL si ces éléments ne correspondent pas. CheckStock stocke également une valeur true associée à la balise failedYet dans la zone de données du test.
La troisième partie du code personnalisé (méthode exec() uniquement) est mentionnée ici :
public String exec(ITestExecutionServices tes, String[] args) {
// Get the test log manager.
ITestLogManager testLogManager = tes.getTestLogManager();
// Get the test's data area and get a flag indicating to
// see if anything has failed yet. If so, stop the loop.
IDataArea dataArea = tes.findDataArea(IDataArea.TEST);
String failedYet = (String) dataArea.get("failedYet");
// Break out of the loop if an error has been encountered.
if (failedYet.equalsIgnoreCase("true")) {
tes.getLoopControl().breakLoop();
if (testLogManager.wouldReport(ITestLogManager.ALL)) {
testLogManager.reportMessage("Loop stopped.");
}
}
return null;
}
Ce code utilise la zone de données du test afin de déterminer la valeur définie par l'utilisateur associée à la balise failedYet. Si failedYet a la valeur true, StopLoopCheck interrompt la boucle de test.