Das Beispiel demonstriert die Aufzeichnung einer Wareneinkaufstransaktion mit der Anwendung IBM Trade. Die hier aufgezeigten Verfahren können für die Tests anderer Anwendungen eingesetzt werden.
Der Test beginnt mit der Aufzeichnung einer Wareneinkaufstransaktion, bei der die Anmelde-IDs jeweils aus einem Datenpool ersetzt werden.
Die Seiten sind in eine Schleife mit fünf Iterationen eingeschlossen, wie es in der folgenden Abbildung dargestellt ist.
Wie Sie sehen, enthalten die verschiedenen Seiten des Tests drei Elemente mit angepasstem Code (zu erkennen an den grünen Kreisen mit einem "C" darin). In diesem Beispiel werden die folgenden Elemente des angepassten Codes untersucht.
Das erste angepasste Codeelement, InitializeBuyTest, hat folgenden Inhalt:
package test; 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 unknown */ public class InitializeBuyTest implements com.ibm.rational.test.lt.kernel.custom.ICustomCode2 { /** * Instances of this will be created using the no-arg constructor. */ public InitializeBuyTest() { } /** * For description of ICustomCode2 and ITestExecutionServices interfaces, * 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; }
Dieser angepasste Code ist in die Methode exec() integriert.
Zunächst wird der Datenbereich für den Test angefordert, in dem ein Attributwert (in diesem Fall eine Textzeichenfolge) gespeichert wird. Dieser Wert dient später dazu, die Testschleife zu stoppen, wenn ein Fehler gefunden wird. Die so gespeicherten Daten können für weitere Tests bestehen bleiben.
Danach wird zufallsgesteuert die Zeichenfolge einer Ware ausgewählt. Der Wert wird als Variable stock gespeichert und als Rückgabewert für die Methode übergeben. Dieser Rückgabewert wird später als Substitutionswert in einer Anforderung verwendet, wie es in der folgenden Abbildung dargestellt ist.
Im hervorgehobenen Element wird eine Substitution (s%3A716) verwendet, nämlich der Wert, der durch das angepasste Codeelement InitializeBuyTest zurückgegeben wird. Mithilfe des angepassten Codes wird die Richtung des Tests vorgegeben.
Mit den nächsten Codezeilen in InitializeBuyTest wird der Name der Ware im Datenbereich des virtuellen Benutzers zur späteren Referenz gespeichert. Die so gespeicherten Daten können ebenfalls für weitere Tests bestehen bleiben.
Der zweite Teil des angepassten Codes trägt die Bezeichnung CheckStock. Er hat folgenden Inhalt (wobei hier nur die Methode exec() aufgeführt wird):
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; }
Der Code beginnt mit dem Auslesen von zwei Argumenten, die an den Code übergeben wurden. Ein Teil der Antwort in der ursprünglichen Aufzeichnung wird hervorgehoben und dient als Referenz, wie in der folgenden Abbildung gezeigt wird.
Die Zeichenfolge muss eventuell bearbeitet werden, um den Text zu erhalten, der relevant ist – in diesem Fall der Name der Ware, die tatsächlich eingekauft wurde. Diese neu erstellte Referenz wird nun an CheckStock als Argument übergeben, wie es in der folgenden Abbildung dargestellt ist.
Beachten Sie, dass der Rückgabewert von InitializeBuyTest ebenfalls als Argument übergeben wird.
Anhand dieser Werte wird vom angepassten Codeelement CheckStock geprüft, ob die durch InitializeBuyTest zufallsgesteuert ausgewählte Ware bei Ausführung des Tests tatsächlich eingekauft wird.
CheckStock legt dann die Ebene des Testprotokolls fest, meldet den tatsächlichen und den angeforderten Wareneinkauf und gibt die Beurteilung FEHLGESCHLAGEN zurück, wenn diese nicht übereinstimmen. Darüber hinaus speichert CheckStock einen true- Wert bei der Markierung failedYet im Datenbereich des Tests.
Der dritte Teil des angepassten Codes (nur Methode exec()) enthält Folgendes:
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; }
Mit diesem Code wird anhand des Datenbereichs des Tests ermittelt, welcher benutzerspezifische Wert der Markierung failedYet zugeordnet ist. Falls failedYet den Wert true aufweist, löst StopLoopCheck den Ausstieg aus der Testschleife aus.