JUnit 單元測試學深入人心的同時,也發現它對用戶交互測試無能為力:
TestCase 允許測試人員作動態的修改
可以在Test Case 中實現一個測試參數輸入功能(UI 或參數配置文件)來解決這個問題,但實現這些功能的代價與重復工作量會很大。
TestCase 可以方便地重復使用、組合、保存
不是所有所有測試環境下,都容許打開一個重量級的 Java IDE 編寫有嚴格規范的 Java 代碼。這就是腳本語言受歡迎的原因。
BeanShell 可以較好解決以上問題。
1.BeanShell基本:
bsh.Interpreter 是beanShell 的主要接口。
以下可以實現一個簡單的Java Shell:
public class TestInt {
public static void main(String[] args) {
bsh.Interpreter.main(args);
}
}
結果:
BeanShell 2.0b4 - by Pat Niemeyer ([email protected])
bsh % System.out.println("Hello BeanShell");
Hello BeanShell
bsh %
你也可以用以下代碼實現同樣的功能,代碼中可以比較明顯地看出其結構:
public static void main(String[] args) {
Reader in = new InputStreamReader( System.in );
PrintStream out = System.out;
PrintStream err = System.err;
boolean interactive = true;;
bsh.Interpreter i = new Interpreter( in, out, err, interactive );
i.run();//線程在這裡阻塞讀System.in
}
1.1.BeanShell上下文(Context/Namespace):
public static void main(String[] args) throws Throwable {
Reader in = new InputStreamReader( System.in );
PrintStream out = System.out;
PrintStream err = System.err;
boolean interactive = true;;
bsh.Interpreter i = new Interpreter( in, out, err, interactive );
Collection theObjectReadyForShellUser = new ArrayList();
theObjectReadyForShellUser.add("Str1");
i.set("myObject", theObjectReadyForShellUser);
i.run();
}
用戶的UI:
BeanShell 2.0b4 - by Pat Niemeyer ([email protected])
bsh % System.out.println( myObject.get(0) );
Str1
bsh %
Shell的上下文在測試中特別有用。想一下,如果將上面的“theObjectReadyForShellUser”換成一個預先為測試用戶生成的RMI本地接口存根,由測試用戶調用相應的存根方法。這可應用於動態測試,也可以應用於系統的遠程管理。
1.2.靜態Java代碼與動態Java代碼的組合使用。
public static void main(String[] args) throws Throwable {
Reader in = new InputStreamReader( System.in );
PrintStream out = System.out;
PrintStream err = System.err;
boolean interactive = true;;
bsh.Interpreter i = new Interpreter( in, out, err, interactive );
//show a dialog for user to input command.
String command = JOptionPane.showInputDialog( "Input Command(s)" );
i.eval( command );//Run the command
}