新版 IBM Rational 測試工具著重讓非程式設計師也能輕鬆使用。本文從 Java 程式設計師視角,探討如何撰寫針對 Rational Performance Tester (RPT) 的客製化程式碼,善用 Java 物件導向特性與 Eclipse 基礎架構。基於 Eclipse 的 RPT 與 Rational Functional Tester (RFT) 擁有強大擴充能力,採用 Java 撰寫客製化程式碼,是開發複雜彈性測試程式的明智選擇。
SuperHelper 類別擴充 HelperSuperHelper 的內建擴充模型本文討論 RPT 兩大強力擴充點:透過超類別進行物件擴充、透過靜態方法使用可重用設施。範例實現測試間變數持久化,採無程式碼執行方式,非程式設計師也能輕鬆重用。
RPT 預設使用專案 src 資料夾下的 test 套件存放客製化程式碼,亦為動態生成程式碼(測試、排程)的位置。為結構化管理,建議採標準 Java 專案命名規範:
| 套件名稱 | 說明 |
|---|---|
com.ibm.rpt.template | 模板檔案 |
com.ibm.rpt.util | 彈性可重用 Java 類別 |
com.yourco.example.var | 本文範例相關套件 |
命名規範建議:yourSuffix.yourCompanyName.applicationName.var(var 表變數相關)。
下載 rpt_ext.zip 解壓至 src,結構如下:

測試中變數持久化通常包含動態生成值,需保留至最後測試階段。RPT 使用 IDataArea 類別保留值,實例化於虛擬使用者層級確保資料隔離。問題在於「Arguments」區域僅允許傳值,無名稱關聯。
VariablePersister.java 執行持久化功能
public class VariablePersister(ITestExecutionServices testExecutionServices,
String aVariableKey, String aVariableValue) {
variableKey = aVariableKey;
virtualUserDataArea = testExecutionServices.findDataArea(IDataArea.VIRTUALUSER);
if (aVariableValue != null) {
variableValue = aVariableValue;
virtualUserDataArea.put(variableKey, variableValue);
} else {
try {
variableValue = (String) virtualUserDataArea.get(variableKey);
} catch (NullPointerException e) {
variableValue = EMPTY_STRING;
virtualUserDataArea.put(variableKey, variableValue);
}
}
}
提供 getVariableValue()(字串)與 getVariableContent()(物件)避免 NullPointerException。值維護於虛擬使用者 IDataArea,無跨使用者污染風險。
com.ibm.rpt.template 複製 PersistentVariableStringTemplate.java 至 com.yourco.example.varSAMPLE_VAR1)


<span class="headword">debonair</span>)

com.yourco.example.var.SAMPLE_VAR1

SAMPLE_VAR1 現設為動態值。

com.yourco.example.var.SAMPLE_VAR1未來測試將使用新發現值替換原值。
範本類別 Javadoc 說明:
| 模板 | 說明 |
|---|---|
PersistentVariableStringTemplate | 簡單字串變數 |
PersistentVariableSequentialTemplate | String[] 循序返回,循環至測試結束 |
PersistentVariableRandomTemplate | String[] 隨機返回 |
皆使用 com.ibm.rpt.util.VariablePersister 類別,透過 IDataArea.put/get 實作。
public abstract class SuperObject implements ICustomCode2 {
public String variableKey;
public String[] variableValue = null;
public String pointerKey;
public Integer pointerValue = null;
public ITestExecutionServices virtualUserTestExecutionServices;
public IDataArea virtualUserDataArea;
public static final String POINTER_SUFFIX = "_POINTER";
public String exec(ITestExecutionServices arg0, String[] arg1) { return null; }
// 後續方法支援 VariablePersister 模板...
public void putMessage(String message) {
virtualUserTestExecutionServices.getTestLogManager().reportMessage(message);
}
}
VariablePersister 建立 _POINTER 後綴變數,每次存取呼叫 getNextPointerValue() 循環陣列getRandomValue(String[]),使用 NumericGenerator.getRandomInt() 準隨機產生器SAMPLE_VAR2(PersistentVariableSequentialTemplate)com.yourco.example.var.SAMPLE_VAR2

SAMPLE_VAR2

測試執行期間將循環陣列值。PersistentVariableRandomTemplate 同理實現隨機存取。
靜態方法雖非純物件導向,但在特定情境下最高效。
SAMPLE_VAR3 並修改程式碼
// 修改前
public class SAMPLE_VAR3 extends ICustomCode2 { ... }
// 修改後
public class SAMPLE_VAR3 extends SuperObject {
public String exec(ITestExecutionServices tes, String[] args) {
return NumericGenerator.getRandomCurrency("5000");
}
}

錯誤提示 NumericGenerator cannot be resolved,Quick Fix 導入 com.ibm.rpt.util.NumericGenerator。
於 www.xe.com/ucc/convert.cgi 請求資料中,Amount= 後的 1 替換為 SAMPLE_VAR3。每次測試將獲得 0-5000 間準隨機貨幣值。
public static String getRandomCurrency(String high) {
refreshRandom();
double randomDouble = Math.round(random.nextDouble() * Double.parseDouble(high));
return currencyDecimalFormat.format(randomDouble).toString();
}
private static void refreshRandom() {
random.setSeed(System.currentTimeMillis());
}
使用 java.util.Random 搭配 System.currentTimeMillis() 種子,DecimalFormat 格式化為貨幣格式。
範例雖簡單,展示透過 Java 操作擴充測試功能:降低冗餘程式碼、減少長期維護成本。RPT 簡單客製化模型易於擴充,善用 Java 超類別與可重用組件打造良好測試環境。
程式碼下載:developerWorks 頁面