3 回答

TA貢獻2065條經驗 獲得超14個贊
一般的測試,尤其是邏輯處理代碼的測試,JUnit就足夠了。但是一些特殊的測試,譬如需要連接數據庫, 使用瀏覽器,這些測試單單使用JUnit還不能夠很好地完成任務,于是會偷懶的牛人又發明了DbUnit、HTTPUnit這些測試框架,使得重復勞動大大減少。
但是對于界面測試,到現在為止還沒有一個框架能夠使得界面測試完全地自動化起來。
根據馬克思主義哲學原理,這是由事物的內因來決定的。由于界面的復雜性以及界面元素的不確定性,界面的測試只有在它實實在在地呈現在測試人員的眼里時,測試才能得出結果,接著測試才能繼續下去。即使現在已經有了不少界面測試的框架,但是這些所謂的框架還是不能夠稱之為框架,只能稱之為工具,因為使用這些工具仍然得做很多重復的工作,而且能夠自動化測試的程度有限。
下文介紹的是進行界面測試的一種技術,或者說是一種方法,也或者說是一種思想。雖然我在前言部分聲明不談方法和思想,只談技術,但在這里還是得談一下方法和思想,實際上,在界面測試中,技術、思想、方法的概念是挺模糊的。相信不久的將來,當出現一個很牛的框架來進行界面測試時,這幾個概念就會越來越清晰。
先來把被測界面代碼寫出來:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 | /************************************************************ * 項目名稱:lhjTest * 文件名稱:CoolUiClass.java * 文件描述:CoolUiClass.java * 作者:Administrator * 創建日期:2007-3-24 * 修改記錄: ***********************************************************/ package org.lhj.cool.uiunit; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; /** * @author Administrator */ public class CoolUiClass extends JPanel { private JTextArea msgTxt = new JTextArea( 400 , 320 ); private JButton coolBtn = new JButton( "Cool" ); public CoolUiClass() { this .setLayout( new GridBagLayout()); this .setMinimumSize( new Dimension( 400 , 350 )); this .setPreferredSize( new Dimension( 400 , 350 )); coolBtn.setMinimumSize( new Dimension( 80 , 21 )); coolBtn.setPreferredSize( new Dimension( 80 , 21 )); JScrollPane scrollPane = new JScrollPane(msgTxt); scrollPane.setMinimumSize( new Dimension( 400 , 320 )); scrollPane.setPreferredSize( new Dimension( 400 , 320 )); this .add(scrollPane, new GridBagConstraints( 0 , 0 , 1 , 1 , 0.0 , 0.0 , GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets( 5 , 5 , 5 , 5 ), 0 , 0 )); this .add(coolBtn, new GridBagConstraints( 0 , 1 , 1 , 1 , 0.0 , 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets( 5 , 5 , 5 , 5 ), 0 , 0 )); coolBtn.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent arg0) { appendText(); } }); } protected void appendText() { msgTxt.append( "cool " ); } /** * test the calss in main,use your eye to test. * @param args */ public static void main(String[] args) { JFrame frm = new JFrame( "CoolUiClass" ); frm.getContentPane().add( new CoolUiClass()); frm.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frm.pack(); frm.setVisible( true ); } } |
簡單地運行以下main方法,界面如下:
這其實已經在測試界面了,我在main函數里頭寫的就是測試代碼,對于界面顯示的測試,就這幾行代碼就足夠了。你這時候是不是覺得:這也忒容易了,沒什么難度。但我得告訴你,這才是剛剛開始。
界面除了顯示,更復雜的是要進行事件處理,每一個界面控件都有可能是事件源,一個事件得引起一系列的操作,而且是對于界面的操作。這就跟一般的函數的測試相差甚大了,一般來說,函數的測試就是輸入一個參數,然后判斷輸出參數,輸出參數無非就那幾種情況,要么拋異常、要么返回空、要么返回具體值。而界面的事件處理一般會改變很多個控件的顯示,而且控件處于不同的狀態時改變的情況也不一定是一樣的,所以要測試處理是否正確,得判斷多個值,而且得根據控件之前的狀態來判斷當前顯示是否正確??吹竭@,你似乎感覺無從下手了是吧。幸虧,界面測試有其方便性,我們可以直接拿眼睛判斷界面上顯示是否正確了,雖然這樣的測試方法無法保證完全正確,但是卻很高效。在界面測試中,拿眼睛進行判斷比拿機器進行判斷肯定效率要高的多。
如果緊緊是界面邏輯的測試,用眼睛來測(我稱之為目測法)已經足夠了,可以很高效地發現問題。但是如果界面上用到的數據是來自于其它地方(譬如說是后臺),那么在main方法里還不能夠寫出完整的測試代碼。這時候我們就需要一種方法來滿足這種需求,其實下面的方法才是目測法的精髓:將與界面處理邏輯無關的代碼抽出來,例如上面appendText(這里僅僅舉個例子,appendText實際上包含了界面處理邏輯,實際上只需要把非界面處理邏輯代碼抽出來,例如文件操作,訪問后臺,數據庫操作這些情況就應該這樣做)的形式,然后使用繼承的方式,將非界面處理邏輯代碼給替換成自己需要的數據(俗稱假數據),這樣一來,界面處理邏輯代碼就可以得到很好的測試。見以下代碼:
1234567891011121314151617181920212223242526272829303132333435363738394041 | /************************************************************ * Project Name: lhjTest * File Name : CoolUiClassETest.java * File Desc : CoolUiClassETest.java * Author : Administrator * Create : 2007-3-24 * Modify: ***********************************************************/ package org.lhj.cool.uiunit; import javax.swing.JFrame; import org.lhj.cool.uiunit.CoolUiClass; /** * @author Administrator */ public class CoolUiClassETest extends CoolUiClass { /* (non-Javadoc) * @see org.lhj.cool.uiunit.CoolUiClass#appendText() */ @Override protected void appendText() { // call the super method twice super.appendText(); super.appendText(); } /** * test the calss in main,use your eye to test.So this method calls Eye Test. * the eyt test method's idea is extends the test calss and overrride somemethod so * that you can expect what you need. * @param args */ public static void main(String[] args) { JFrame frm = new JFrame( "CoolUiClassETest" ); frm.getContentPane().add( new CoolUiClassETest()); frm.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frm.pack(); frm.setVisible( true ); } } |
添加回答
舉報