Sterowanie pętlami

W tej sekcji przedstawiono sposób rozszerzania wykonania testu przy użyciu niestandardowego kodu w celu sterowania pętlami. Zawiera ona przykładowy kod umożliwiający zmianę zachowania pętli w teście w celu dokładniejszego analizowania i oceniania wyników testu.

W poniższym przykładzie przedstawiono zapis transakcji zakupu akcji przy użyciu aplikacji handlowej IBM. Pojęcia wyświetlane w tym miejscu mają zastosowanie do testów w innych aplikacjach.

Test rozpoczyna się zapisem transakcji zakupu akcji poprzez operacje podstawienia puli danych dla identyfikatorów logowania.

Strony są umieszczane w pętli składającej się z pięciu iteracji, co widać na poniższym rysunku:

Należy zauważyć, że na różnych stronach testu istnieją trzy elementy kodu niestandardowego (oznaczone zielonymi kołami z literą C). Poniższy przykład dotyczy tych elementów kodu niestandardowego.

Pierwszy fragment kodu niestandardowego, InitializeBuyTest, został przedstawiony poniżej:

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 {

	/**
	 * Instancje tej klasy zostaną utworzone za pomocą konstruktora bez argumentów.
	 */
	public InitializeBuyTest() {
	}

	/**
	 * Opis interfejsów ICustomCode2 i ITestExecutionServices
	 * jest dostępny w dokumentacji Javadoc. */
	public String exec(ITestExecutionServices tes, String[] args) {
		// Pobiera obszar danych testu i ustawia flagę wskazującą, że żadna operacja
		// nie została jeszcze zakończona niepowodzeniem. Ta flaga zostanie później użyta do przerwania
		// pętli harmonogramu natychmiast po napotkaniu błędu.
		IDataArea dataArea = tes.findDataArea(IDataArea.TEST);
		dataArea.put("failedYet", "false");

		// Pobiera obszar danych użytkowników wirtualnych
		IDataArea vda = tes.findDataArea(IDataArea.VIRTUALUSER);
		
		// Losowo wybiera akcje do kupienia z zakresu od s:0 do s:499.
	    IVirtualUserInfo vuInfo = (IVirtualUserInfo) vda.get(IVirtualUserInfo.KEY);
	    Random rand = vuInfo.getRandom();
		String stock = "s:" + Integer.toString(rand.nextInt(499));

		// Utrwala nazwę akcji w obszarze danych użytkownika wirtualnego.
		vda.put("myStock", stock);

		return stock;
	}

Ten kod niestandardowy znajduje się w metodzie exec().

W pierwszej kolejności uzyskiwany jest obszar danych dla testu do przechowywania wartości flagi (w tym przypadku łańcuch tekstu), która zostanie użyta później do zatrzymania pętli testu, jeśli zostanie wykryty błąd. Dane przechowywane w ten sposób mogą zostać utrwalone w testach.

Następnie utworzony zostaje wygenerowany losowo łańcuch akcji. Wartość zostaje zapisana jako zmienna stock i następnie przekazana z powrotem jako wartość zwracana metody. Ta wartość pełni funkcję zastępczą w późniejszym żądaniu, tak jak pokazano to na poniższym rysunku:

Wyróżniony element korzysta z podstawienia (s%3A716), które jest wartością zwróconą przez element kodu niestandardowego InitializeBuyTest. W przykładzie kod niestandardowy używany jest do wyznaczania kierunku testów.

Kolejne wiersze kodu w elemencie InitializeBuyTest zapisują nazwę akcji w obszarze danych użytkownika wirtualnego na potrzeby późniejszych odwołań. Dane przechowywane w ten sposób mogą zostać utrwalone w testach.

Drugi fragment kodu niestandardowego nosi nazwę CheckStock. Poniżej przedstawiono jego zawartość (tym razem wyświetlona jest tylko metoda exec()):

public String exec(ITestExecutionServices tes, String[] args) {

		// Pobieranie rzeczywistych i żądanych zakupów akcji.
		String actualStock = args[0].replaceAll("<B>", "");
 		actualStock = actualStock.substring(0, actualStock.indexOf("<"));
		String requestedStock = args[1];

  		// Ustawianie poziomu rejestrowania na wartość ALL (wszystkie).
 		IDataArea dataArea = tes.findDataArea(IDataArea.TEST);
 		ITestInfo testInfo = (ITestInfo)dataArea.get(ITestInfo.KEY);
 		testInfo.setTestLogLevel(ITestLogManager.ALL);

 		// Jeśli poziom rejestrowania jest ustawiony na wartość ALL, zgłasza rzeczywiste i żądane zakupy
		// akcji.
 		ITestLogManager testLogManager = tes.getTestLogManager();
		if (testLogManager.wouldReport(ITestLogManager.ALL)) {
 			testLogManager.reportMessage("Actual stock purchased: "
 					+ actualStock + ". Requested stock: " + requestedStock
					+ ".");
 		}  		

		// Jeśli rzeczywiste i żądane zakupy akcji nie są zgodne, wysyła ocenę FAIL (niepowodzenie).
 		if (testLogManager.wouldReport(ITestLogManager.ALL)) { 
			if (!actualStock.equalsIgnoreCase(requestedStock)) {
 				testLogManager.reportVerdict(
						"Rzeczywiste i żądane zakupy akcji nie są zgodne.",
 						VerdictEvent.VERDICT_FAIL);

 				// Używa obszaru danych testu do rejestrowania faktu wystąpienia 			
				// błędu.
 				dataArea.put("failedYet", "true");
 			} 		
		}
  		return null;
	}

Ten kod rozpoczyna się od wyodrębnienia dwóch argumentów przekazanych do kodu. Fragment odpowiedzi w oryginalnym zapisie zostaje wyróżniony i użyty jako odwołanie, tak jak pokazano to na poniższym rysunku.

Konieczna jest zmiana niektórych łańcuchów, aby uzyskać wymagany tekst. W tym przypadku jest to nazwa akcji, która została rzeczywiście zakupiona. Nowo utworzone odwołanie zostaje przekazane do elementu CheckStock jako argument, tak jak pokazano to na poniższym rysunku:

Należy zauważyć, że wartość zwracana elementu InitializeBuyTest jest również przekazywana jako argument.

Element kodu niestandardowego CheckStock używa tych wartości do sprawdzenia, czy losowo wybrana akcja wygenerowana przez element InitializeBuyTest została rzeczywiście zakupiona podczas wykonywania testu.

Element CheckStock następnie ustawia poziom rejestrowania testu, zgłasza rzeczywiste i żądane zakupy akcji i wysyła ocenę FAIL, jeśli te wartości nie są zgodne. Element CheckStock przechowuje również wartość true powiązaną ze znacznikiem failedYet w obszarze danych testu.

Trzeci fragment kodu niestandardowego (tylko metoda exec()) został przedstawiony poniżej:

public String exec(ITestExecutionServices tes, String[] args) {

		// Pobiera menedżera rejestrowania testu.
		ITestLogManager testLogManager = tes.getTestLogManager();
		
		// Pobiera obszar danych testu i ustawia flagę wskazującą, czy
		// którakolwiek operacja została zakończona niepowodzeniem. Jeśli tak, zatrzymuje pętlę.
		IDataArea dataArea = tes.findDataArea(IDataArea.TEST);
		String failedYet = (String) dataArea.get("failedYet");

		// Przerywa pętlę, jeśli napotkano błąd.
		if (failedYet.equalsIgnoreCase("true")) {
			tes.getLoopControl().breakLoop();

			if (testLogManager.wouldReport(ITestLogManager.ALL)) {
				testLogManager.reportMessage("Loop stopped.");
			}
		}

		return null;
	}

Ten kod korzysta z obszaru danych testu w celu określenia wartości zdefiniowanej przez użytkownika powiązanej ze znacznikiem failedYet. Jeśli znacznik failedYet ma wartość true, element StopLoopCheck powoduje przerwanie pętli testu.


Opinia