JUnit 擅長自動化單元測試,但難以處理需人工互動的測試場景 (輸入參數、觀察 UI、遠程管理)。BeanShell 作為 Java 兼容的腳本語言,提供動態執行環境,完美補足此缺口。
單一 JAR (bsh.jar) 即可嵌入應用,提供完整 Java 語法支援 (含 closure、動態型別)。
// 最簡單啟動
public class TestInt {
public static void main(String[] args) {
bsh.Interpreter.main(args); // 直接進入 bsh % 提示符
}
}
或自訂 I/O 流:
public static void main(String[] args) throws Exception {
bsh.Interpreter i = new Interpreter(
new InputStreamReader(System.in), System.out, System.err, true);
i.run(); // 阻塞讀取標準輸入
}
將測試所需的複雜物件 (RMI Stub、Service 介面、資料集) 預先放入 Interpreter 命名空間,腳本直接使用變數名存取。
public static void main(String[] args) throws Exception {
bsh.Interpreter i = new Interpreter(new InputStreamReader(System.in), System.out, System.err, true);
List testData = Arrays.asList("Str1", "Str2");
i.set("myData", testData); // 關鍵:綁定變數至腳本上下文
i.run();
}
腳本端:
bsh % System.out.println(myData.get(0)); // 直接存取
Str1
應用延伸:將 myData 換為 RMI 本地 Stub、WebService Client、資料庫 DAO,測試人員即可在 Shell 中動態調用業務方法,實現「動態測試」與「遠程管理」。
彈出對話框輸入腳片段,即時執行:
public static void main(String[] args) throws Exception {
bsh.Interpreter i = new Interpreter(...);
String cmd = JOptionPane.showInputDialog("Input Command(s)");
i.eval(cmd); // 動態編譯執行
}
| 維度 | JUnit 靜態測試 | BeanShell 動態測試 |
|---|---|---|
| 參數修改 | 改代碼重編譯 | 腳本輸入/配置檔即時生效 |
| 互動性 | 無 | 完整 Java 語法互動、可呼叫 GUI |
| 部署需求 | 需 JDK + 編譯環境 | 僅需 JRE + bsh.jar |
| 遠程管理 | 困難 | 自然支援 (RMI Stub 注入) |
| 學習曲線 | Java 開發者零成本 | Java 語法兼容,零學習成本 |
BeanShell 以輕量級、Java 語法兼容、動態執行三大特性,成為「人工測試自動化輔助」與「生產環境遠程診斷管理」的利器。嵌入式 Interpreter + 預載上下文物件 是核心應用模式。