Este ejemplo utiliza el registro de una transacción de compra de acciones mediante la aplicación Trade de IBM. Los conceptos aquí mostrados se pueden utilizar en pruebas de otras aplicaciones.
La prueba comienza con el registro de una transacción de compra de acciones, utilizando la sustitución de agrupación de datos para los ID de inicio de sesión.
Las páginas se ajustan en un bucle de cinco iteraciones, tal como aparece en la siguiente figura.
Observe que entre las diversas páginas de la prueba, existen tres elementos de código personalizado (indicados por los círculos verdes con "C" en ellos). En este ejemplo se exploran estos elementos del código personalizado.
El primer trozo de código personalizado, InitializeBuyTest, contiene lo siguiente:
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; }
Este código personalizado se encuentra en el método exec().
En primer lugar, el área de datos de la prueba se adquiere para almacenar un valor de distintivo, en este caso una serie de texto, que se utilizará posteriormente para detener el bucle de prueba al descubrir un error. Los datos almacenados de esta forma pueden continuar en las pruebas.
A continuación se crea una serie de acciones generadas de forma aleatoria. El valor se almacena como acción variable y se vuelve a pasar como valor de retorno del método. Este valor de retorno se utiliza como sustituto en una solicitud posterior, tal como aparece en la siguiente figura.
El elemento resaltado utiliza una sustitución (s%3A716), que es el valor devuelto por el elemento de código personalizado InitializeBuyTest. Utilizamos código personalizado para llevar la dirección de nuestra prueba.
Las siguientes líneas de código en InitializeBuyTest utilizan el área de datos del usuario virtual para almacenar el nombre de la acción para futuras consultas. De nuevo, los datos almacenados de esta forma pueden continuar en las pruebas.
La segunda parte del código personalizado se llama CheckStock. Su contenido es el siguiente (esta vez sólo se muestra el método 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; }
Este código empieza extrayendo dos argumentos que se han pasado al código. Parte de la respuesta del registro original se resalta y se utiliza como referencia, tal como se muestra en la figura siguiente.
Es necesaria cierta manipulación de la serie para adquirir el texto que interesa; en este caso, el nombre de la acción que realmente se ha comprado. Esta referencia recién creada pasa a continuación a CheckStock como argumento, tal como muestra la siguiente figura:
Observe que el valor de retorno de InitializeBuyTest pasa como argumento también.
El elemento de código personalizado CheckStock utiliza estos valores para verificar que la acción elegida de forma aleatoria generada por InitializeBuyTest se compró realmente durante la ejecución de la prueba.
CheckStock establece luego el nivel de registro de la prueba, informa de la compra de acción real y solicitada y formula un veredicto de FALLO si no coinciden. CheckStock también almacena un valor true asociado con la etiqueta failedYet del área de datos de la prueba.
La tercera parte del código personalizado (sólo método exec()) contiene lo siguiente:
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; }
Este código utiliza el área de datos de la prueba para determinar el valor definido por el usuario asociado con la etiqueta failedYet. Si failedYet es true, StopLoopCheck escapa del bucle de la prueba.