Pisanie własnych testów: przykład 2
Poniższy kod źródłowy jest przykładem testu sprawdzającego nazwy kolejek względem zdefiniowanej konwencji nazewnictwa. Szczegółowe informacje o wszystkich odnalezionych kolejkach, których nazwy nie są zgodne ze zdefiniowaną konwencją nazewnictwa, są wyświetlane w widoku Wyniki testu.
/*
* Materiały licencjonowane - własność IBM
*
* 5724-H72, 5655-L82, 5724-L26, 5655R3600
*
* (c) Copyright IBM Corp. 2005, 2020
*
* Zastrzeżone prawa instytucji rządowych USA - Korzystanie, powielanie lub
* ujawnianie zastrzeżone kontraktem GSA ADP Schedule Contract z firmą IBM Corp.
*/
package com.ibm.mq.explorer.tests.sample;
/**
* Test przykładowy sprawdzający nazwy kolejek względem konwencji nazewnictwa. Sprawdzane są nazwy kolejek
* rozpoczynające się jednym z zestawów przedrostków zdefiniowanym w klasie. Wszystkie nazwy, które
* nie rozpoczynają się jednym z tych przedrostków, są kierowane na wyjście w postaci błędu.
*
* W przykładzie używane są klasy PCF udostępniane w pakiecie serwisowym MS0B. Pobierz pakiet serwisowy z
* serwisu WWW IBM, a następnie włącz do ścieżki budowy projektu plik jar.
*/
public class WMQQueueNames extends WMQTest {
/** Obsługa licznika menedżerów kolejek, od których oczekiwana jest odpowiedź. */
private static int numberOfQmgrs = 0;
/** Przechowanie zaakceptowanych przedrostków nazw kolejek. */
private static final String[] ACCEPTED_Q_PREFIXES = {"SALES_", "MARKETING_", "SHIPPING_", //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
"INCOMING_", "OUTGOING_"}; //$NON-NLS-1$//$NON-NLS-2$
/** Przechowanie preferencji użytkownika odnośnie włączania kolejek systemowych. */
boolean includeSystemObjs = false;
/**
* Uruchamia test.
*
*
* @param callback - uchwyt do mechanizmu testów wykonującego test
* @param guimonitor - uchwyt do obiektu monitorującego test, umożliwiającego testowi
* okresowe sprawdzanie, czy użytkownik próbował anulować działający test i udostępniający dodatkową opinię
* użytkownika
* @param contextObjects - kontekstowe obiekty MQExtObjects przekazane do mechanizmu testów
* @param treenodeId - id węzła drzewa używany do uruchamiania testów
*/
public void runTest(WMQTestEngine callback, IProgressMonitor guimonitor,
MQExtObject[] contextObjects, TreeNode treenodeId) {
// Zacznij od domyślnej implementacji. Spowoduje to zapisanie uchwytu
// do mechanizmu testów, który będzie potrzebny do wprowadzenia
// wszelkich wyników na końcu testu
super.runTest(callback, guimonitor, contextObjects, treenodeId);
// Przygotuj przestrzeń do przechowania wyników, które będą mogły zostać zwrócone
ArrayList testResults = new ArrayList();
// Pobierz z Preferencji informację o tym, czy włączyć kolejki systemowe
includeSystemObjs = PreferenceStoreManager.getIncludeSysObjsPreference();
// Pobierz listę menedżerów kolejek z programu Explorer
ArrayList allQmgrs = new ArrayList();
for (int k = 0; k < contextObjects.length; k++) {
if (contextObjects[k] instanceof MQQmgrExtObject) {
// Obiekt jest menedżerem kolejek; dodaj do listy
allQmgrs.add(contextObjects[k]);
}
}
// Ile menedżerów kolejek tam się znajduje?
numberOfQmgrs = allQmgrs.size();
// Użyj liczby menedżerów kolejek jako wskazówki do śledzenia postępu
guimonitor.beginTask(getTestName(), numberOfQmgrs);
// Wprowadź zapytanie dla poszczególnych menedżerów kolejek
for (int i = 0; i < numberOfQmgrs; i++) {
// Pobierz następnego menedżera kolejek
MQQmgrExtObject nextQueueManager = (MQQmgrExtObject) allQmgrs.get(i);
// Wprowadź zapytania jedynie dla podłączonych menedżerów kolejek
if (nextQueueManager.isConnected()) {
// Pobierz nazwę menedżera kolejek do użycia w interfejsie GUI
String qmgrName = nextQueueManager.getName();
// Pobierz uchwyt do obiektu Java reprezentującego menedżera kolejek
MQQueueManager qmgr = nextQueueManager.getMQQueueManager();
try {
// Pobierz agenta komunikatów PCF w celu obsługi wysyłania zapytania PCF do
PCFMessageAgent agent = new PCFMessageAgent(qmgr);
// Za pomocą PCF wprowadź zapytanie 'zapytanie o nazwy kolejek'
PCFMessage response = submitQueueNamesQuery(qmgrName, agent);
// Czy otrzymano odpowiedź na zapytanie?
if (response != null) {
// Pobierz nazwy kolejek spoza odpowiedzi
String[] qnames = (String[]) response.getParameterValue(CMQCFC.MQCACF_Q_NAMES);
// Sprawdź poszczególne nazwy
for (int j = 0; j < qnames.length; j++) {
boolean qnameOkay = checkQueueName(qnames[j]);
if (!qnameOkay) {
// jeśli wykryto problem z nazwą, jest generowany
// komunikat o błędzie i dodawany do kolekcji,
// która ma zostać zwrócona
testResults.add(generateTestResult(qnames[j], qmgrName));
}
}
}
}
catch (MQException e) {
// rejestrowanie szczegółów błędu
e.printStackTrace();
}
}
// Zakończono badanie menedżera kolejek
guimonitor.worked(1);
}
// Zwróć wyniki wygenerowane podczas wykonywania testu
WMQTestResult[] finalresults = (WMQTestResult[]) testResults
.toArray(new WMQTestResult[testResults.size()]);
testComplete(finalresults);
}
/**
* Używany wewnętrznie do wprowadzenia za pomocą PCF zapytania INQUIRE_Q_NAMES do danego menedżera kolejek.
*
*
* @param qmgrName - nazwa menedżera kolejek, do którego ma zostać wysłane zapytanie
* @param agent
* @return - odpowiedź PCF z menedżera kolejek
*/
private PCFMessage submitQueueNamesQuery(String qmgrName, PCFMessageAgent agent) {
// budowanie komunikatu pcf
PCFMessage inquireQNames = new PCFMessage(CMQCFC.MQCMD_INQUIRE_Q_NAMES);
inquireQNames.addParameter(CMQC.MQCA_Q_NAME, "*"); //$NON-NLS-1$
try {
// wyślij komunikat
PCFMessage[] responseMsgs = agent.send(inquireQNames);
// sprawdzanie, czy wyniki odebrano pomyślnie
if (responseMsgs[0].getCompCode() == 0) {
return responseMsgs[0];
}
}
catch (IOException e) {
// rejestrowanie szczegółów błędu
e.printStackTrace();
}
catch (MQException e) {
// rejestrowanie szczegółów błędu
e.printStackTrace();
}
// Z jakiegoś powodu nie otrzymano odpowiedzi, zatem należy zwrócić wartość null
return null;
}
/**
* Używany wewnętrznie do sprawdzania danej nazwy kolejki względem kolekcji akceptowalnych przedrostków.
*
*
* @param queueName - nazwa kolejki do sprawdzenia
* @return true, jeśli nazwa kolejki jest poprawna, w przeciwnym razie false
*/
private boolean checkQueueName(String queueName) {
// jeśli to jest obiekt systemowy (tzn. jego nazwa zaczyna się przedrostkiem
// "SYSTEM."), sprawdź
if ((queueName.startsWith("SYSTEM.")) || (queueName.startsWith("AMQ."))) { //$NON-NLS-1$//$NON-NLS-2$
if (!includeSystemObjs) {
// czy użytkownik zażądał wykluczenia obiektów
// systemowych z testu, dlatego zostanie zwrócona wartość true,
// aby uniknąć zgłaszania problemów dla tej kolejki
return true;
}
}
// Odpowiedź PCF spowoduje wymazanie nazwy kolejki, więc jest usuwana
queueName = queueName.trim();
// sprawdź nazwę kolejki względem poszczególnych akceptowalnych
przedrostków,
// zwracając wartość true, jeśli występuje zgodność
for (int i = 0; i < ACCEPTED_Q_PREFIXES.length; i++) {
if (queueName.startsWith(ACCEPTED_Q_PREFIXES[i]))
return true;
}
// Sprawdzono względem wszystkich akceptowalnych przedrostków,
// ale nie uzyskano zgodności
return false;
}
/**
* Używany wewnętrznie w celu wygenerowania wyniku testu dla danej nazwy kolejki.
*
*
* @param queueName - nazwa kolejki, która nie spełnia wymagań
* @param qmgrName - nazwa menedżera kolejek, który udostępnia kolejkę
* @return wygenerowany wynik testu
*/
private WMQTestResult generateTestResult(String queueName, String qmgrName) {
String res = "Queue (" + queueName.trim() + ") does not begin with a known prefix"; //$NON-NLS-1$//$NON-NLS-2$
return new WMQTestResult(IMarker.SEVERITY_ERROR, res, qmgrName, getTestSubCategory());
}
}