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 customizados (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 customizado InitializeBuyTest, contém o seguinte:
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 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 customizado 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 customizado 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 customizado 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 customizado (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.