Controlando Loops

Este exemplo demonstra a extensão da execução de teste utilizando o código customizado para controlar os loops. Ele fornece código de amostra que mostra como você pode manipular o comportamento dos loops em um teste para melhor analisar e verificar os resultados do teste.

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.


Feedback