http://www.cjsdn.net/post/view?bid=46&id=176496&tpg=1&ppg=1&sty=1&age=30#176496
前幾年書寫了一個技術SWING的界面測試的有些JAVA技術還比較有意思給大家分享一下。
SWING界面自動測試關鍵技術:
1, 如何替換掉系統的消息隊列
2, 如何識別事件
3, 如何記錄
4, 如何回放
第1個技術
使用 ActiveEvent
import java.awt.AWTEvent;
import java.awt.ActiveEvent;
import java.awt.Component;
import java.awt.Dialog;
import java.awt.Event;
import java.awt.EventQueue;
import java.awt.MenuComponent;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JDialog;
import nc.web.AWTAutoShutdown;
public class EventDispatch extends AWTEvent implements ActiveEvent {
public static EventQueue theQueue;
static{
if (theQueue == null) {
java.awt.Toolkit t = java.awt.Toolkit.getDefaultToolkit();
theQueue = t.getSystemEventQueue();
}
}
public static void replaceSysteEventDispatch() {
try {
//System.out.println("new frame");
if (theQueue == null) {
java.awt.Toolkit t = java.awt.Toolkit.getDefaultToolkit();
theQueue = t.getSystemEventQueue();
}
theQueue.postEvent(new EventDispatch(null));
} catch (Exception e) {
e.printStackTrace();
/** 可以是安全權限不能訪問*/
}
}
/** 虛禮一個對象 */
private static JButton jb=new JButton();
public EventDispatch(Event event) {
super(new MouseEvent(jb,1,1,1,1,1,1,false),1);
}
public void dispatch() {
while (true) {
try {
AWTEvent event = theQueue.getNextEvent();
/** 發送事件,可以在 Dialog.setModal(true) show ,接管事件 */
EventDispatch ed=new EventDispatch(null);
theQueue.postEvent(ed);
if(event.getClass() == EventDispatch.class )
continue;
Object src=event.getSource();
if (event instanceof ActiveEvent) {
((ActiveEvent)event).dispatch();
} else if (src instanceof Component) {
((Component)src).dispatchEvent(event);
} else if (src instanceof MenuComponent) {
((MenuComponent)src).dispatchEvent(event);
} else {
System.err.println("unable to dispatch event: " + event);
}
} catch (ThreadDeath death) {
break;
} catch (Throwable e) {
System.err.println("Exception occurred during event dispatching:");
e.printStackTrace();
}
}
}
}
鼠標事件是最難記錄的,由於鼠標事件前後界面會改變,或者有的需要MousePressed事件 ,有的需要MouseRelease 所以
在鼠標事件發送前後都需要進行處理
在事件隊列拿到的事件,是發送到Window上的底板的。
所以需要根據代碼取道它真正的控件對象
public static Component getMouseEventTarget(Object org,MouseEvent me)
{
Component targComponent=null;
if(org instanceof Component)
{
targComponent = (Component) org;
if(org instanceof Container)
{
Component temp=getMouseEventTarget((Container)org,me.getX(),me.getY());
if(temp!=null)
targComponent = temp;
}
}
return targComponent;
}
鼠標事件究竟發送給誰的需要在不同的點進行識別:
在鼠標 beforeMousePressed 需要識別:
JTree,JTable,javax.swing.plaf.metal.MetalComboBoxButton
需要識別單點雙點
beforeMouseRleased
需要識別:JList
afterMouseReleased
需要識別:JList,JSlider,JToggleButton,JScrollBar
其他事件簡單的介紹一下:
鍵盤事件處理:比較簡單。
記錄發送給具有焦點的對象就可以了。
itemEvent需要處理:javax.swing.JComboBox
TextEvent :需要處理文字錄入。
WINDOW_CLOSING:處理節點關閉
mouseMove:比較麻煩,大多數時候是無限的。
正確識別事件記錄比較簡單:
主要記錄的是 COMPONENT的相對位置。
比如:他在 XX控件上的YY位置上。
最簡單的辦法是。
將界面控件全部大列表,按照順序,得到他在什麼位置。
什麼控件類型上。
建議大家記錄後以JAVA 代碼的形式記錄,可以編輯重放。
4, 如何回放
回放就是模擬記錄的腳本:
創建事件對象就可以了。
關鍵技術是:
需要等待任務隊列中沒有任務然後再發送下一個模擬事件。
有 興趣的 可以回帖交流一下

沒有留言:
發佈留言