Este exemplo utiliza a gravação de uma transação de compra de ações utilizando o aplicativo Trade da IBM. Os conceitos mostrados aqui podem ser utilizados nos testes de outros aplicativos.
O teste é iniciado com uma gravação de uma datapool de compra de ações, utilizando a substituição de datapool para os IDs de login.
As páginas são agrupadas em um loop de cinco iterações, conforme mostrado na figura a seguir:
Observe que existem três itens de códigos personalizados (indicados pelos círculos verdes com "C"s), entre as várias páginas do teste. Esse exemplo explora esses itens de código customizado.
A primeira parte do código personalizado InitializeBuyTest, contém o seguinte:
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; }
Esse código personalizado está localizado no método exec().
Primeiro, a área de dados do teste é adquirida para armazenar um valor de sinalizador, nesse caso, uma cadeia de texto a ser utilizada posteriormente para parar o loop do teste quando um erro for descoberto. Os dados armazenados dessa maneira podem ser persistentes nos testes.
Em seguida, uma cadeia de ações gerada aleatoriamente é criada. O valor é armazenado como a variável stock e é transmitido de volta como o valor de retorno do método. Esse valor de retorno será utilizado posteriormente como substituto em um pedido, conforme mostrado na figura a seguir:
O item realçado usa uma substituição (s%3A716), que é o valor retornado pelo item de código customizado InitializeBuyTest. Estamos utilizando o código personalizado para direcionar o nosso teste.
As próximas linhas de código no InitializeBuyTest usam a área de dados do Usuário Virtual para armazenar o nome do stock para referência posterior. Novamente, os dados armazenados dessa maneira podem continuar nos testes.
A segunda parte do código customizado é chamada de CheckStock. Ela contém o seguinte (listando somente o método exec() desta vez):
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; }
Esse código começa extraindo dois argumentos que foram transmitidos ao código. Uma parte da resposta na gravação original é realçada e utilizada como referência, conforme mostrado na figura a seguir.
É necessário alguma manipulação de cadeia para adquirir o texto de interesse; nesse caso, o nome da ação que foi realmente comprada. Em seguida, essa referência recém-criada é transmitida para CheckStock como um argumento, conforme mostrado na figura a seguir.
Observe que o valor de retorno de InitializeBuyTest também é transmitido como um argumento.
Esses valores são utilizados pelo item de código personalizado CheckStock para verificar que a ação escolhida aleatoriamente gerada pelo InitializeBuyTest, foi realmente comprada durante a execução do teste.
Em seguida, CheckStock configura o nível de log do teste, reporta a compra de ação real e pedida, e cria um parecer FALHA (FAIL) se elas não corresponderem. CheckStock também armazena um valor verdadeiro associado à tag Com Falha (failedYet) na área de dados do teste.
A terceira parte do código personalizado (somente método exec()) contém o seguinte:
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; }
Esse código utiliza a área de dados do teste para determinar o valor definido pelo usuário associado à tag failedYet. Se failedYet for true, StopLoopCheck sairá do loop de teste.