3 回答

TA貢獻(xiàn)2065條經(jīng)驗(yàn) 獲得超14個(gè)贊
一般的測(cè)試,尤其是邏輯處理代碼的測(cè)試,JUnit就足夠了。但是一些特殊的測(cè)試,譬如需要連接數(shù)據(jù)庫, 使用瀏覽器,這些測(cè)試單單使用JUnit還不能夠很好地完成任務(wù),于是會(huì)偷懶的牛人又發(fā)明了DbUnit、HTTPUnit這些測(cè)試框架,使得重復(fù)勞動(dòng)大大減少。
但是對(duì)于界面測(cè)試,到現(xiàn)在為止還沒有一個(gè)框架能夠使得界面測(cè)試完全地自動(dòng)化起來。
根據(jù)馬克思主義哲學(xué)原理,這是由事物的內(nèi)因來決定的。由于界面的復(fù)雜性以及界面元素的不確定性,界面的測(cè)試只有在它實(shí)實(shí)在在地呈現(xiàn)在測(cè)試人員的眼里時(shí),測(cè)試才能得出結(jié)果,接著測(cè)試才能繼續(xù)下去。即使現(xiàn)在已經(jīng)有了不少界面測(cè)試的框架,但是這些所謂的框架還是不能夠稱之為框架,只能稱之為工具,因?yàn)槭褂眠@些工具仍然得做很多重復(fù)的工作,而且能夠自動(dòng)化測(cè)試的程度有限。
下文介紹的是進(jìn)行界面測(cè)試的一種技術(shù),或者說是一種方法,也或者說是一種思想。雖然我在前言部分聲明不談方法和思想,只談技術(shù),但在這里還是得談一下方法和思想,實(shí)際上,在界面測(cè)試中,技術(shù)、思想、方法的概念是挺模糊的。相信不久的將來,當(dāng)出現(xiàn)一個(gè)很牛的框架來進(jìn)行界面測(cè)試時(shí),這幾個(gè)概念就會(huì)越來越清晰。
先來把被測(cè)界面代碼寫出來:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 | /************************************************************ * 項(xiàng)目名稱:lhjTest * 文件名稱:CoolUiClass.java * 文件描述:CoolUiClass.java * 作者:Administrator * 創(chuàng)建日期: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 ); } } |
簡(jiǎn)單地運(yùn)行以下main方法,界面如下:
這其實(shí)已經(jīng)在測(cè)試界面了,我在main函數(shù)里頭寫的就是測(cè)試代碼,對(duì)于界面顯示的測(cè)試,就這幾行代碼就足夠了。你這時(shí)候是不是覺得:這也忒容易了,沒什么難度。但我得告訴你,這才是剛剛開始。
界面除了顯示,更復(fù)雜的是要進(jìn)行事件處理,每一個(gè)界面控件都有可能是事件源,一個(gè)事件得引起一系列的操作,而且是對(duì)于界面的操作。這就跟一般的函數(shù)的測(cè)試相差甚大了,一般來說,函數(shù)的測(cè)試就是輸入一個(gè)參數(shù),然后判斷輸出參數(shù),輸出參數(shù)無非就那幾種情況,要么拋異常、要么返回空、要么返回具體值。而界面的事件處理一般會(huì)改變很多個(gè)控件的顯示,而且控件處于不同的狀態(tài)時(shí)改變的情況也不一定是一樣的,所以要測(cè)試處理是否正確,得判斷多個(gè)值,而且得根據(jù)控件之前的狀態(tài)來判斷當(dāng)前顯示是否正確??吹竭@,你似乎感覺無從下手了是吧。幸虧,界面測(cè)試有其方便性,我們可以直接拿眼睛判斷界面上顯示是否正確了,雖然這樣的測(cè)試方法無法保證完全正確,但是卻很高效。在界面測(cè)試中,拿眼睛進(jìn)行判斷比拿機(jī)器進(jìn)行判斷肯定效率要高的多。
如果緊緊是界面邏輯的測(cè)試,用眼睛來測(cè)(我稱之為目測(cè)法)已經(jīng)足夠了,可以很高效地發(fā)現(xiàn)問題。但是如果界面上用到的數(shù)據(jù)是來自于其它地方(譬如說是后臺(tái)),那么在main方法里還不能夠?qū)懗鐾暾臏y(cè)試代碼。這時(shí)候我們就需要一種方法來滿足這種需求,其實(shí)下面的方法才是目測(cè)法的精髓:將與界面處理邏輯無關(guān)的代碼抽出來,例如上面appendText(這里僅僅舉個(gè)例子,appendText實(shí)際上包含了界面處理邏輯,實(shí)際上只需要把非界面處理邏輯代碼抽出來,例如文件操作,訪問后臺(tái),數(shù)據(jù)庫操作這些情況就應(yīng)該這樣做)的形式,然后使用繼承的方式,將非界面處理邏輯代碼給替換成自己需要的數(shù)據(jù)(俗稱假數(shù)據(jù)),這樣一來,界面處理邏輯代碼就可以得到很好的測(cè)試。見以下代碼:
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 ); } } |
添加回答
舉報(bào)