《軟件測試-5模擬對象課件》由會員分享,可在線閱讀,更多相關(guān)《軟件測試-5模擬對象課件(44頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、單擊此處編輯母版標(biāo)題樣式,單擊此處編輯母版文本樣式,第二級,第三級,第四級,第五級,計算機科學(xué)與技術(shù)學(xué)院,模擬,對象,模擬對象,1,議程,基于狀態(tài)的測試和交互,測試,模擬,對象與樁對象的,區(qū)別,模擬對象的例子,同時使用模擬對象和樁對象,樁鏈,手寫,模擬對象與樁對象的問題,議程基于狀態(tài)的測試和交互測試,場景,被測代碼的復(fù)雜邏輯需要基于對其他對象的調(diào)用,被調(diào)用對象,可能,不返回結(jié)果,不保存狀態(tài),如何,測試對象間的,調(diào)用,模擬對象,場景被測代碼的復(fù)雜邏輯需要基于對其他對象的調(diào)用,什么是交互測試,交互測試用來測試一個對象如何向另一個對象傳遞消息,或者如何從其他對象接收消息,即測試對象如何與其他對象進行
2、交互,什么是交互測試交互測試用來測試一個對象如何向另一個對象傳遞消,兩種測試的區(qū)分,交互測試,=,動作驅(qū)動測試,測試對象的某個特定動作,基于狀態(tài)的測試,=,結(jié)果驅(qū)動測試,測試某些最終結(jié)果是否,成立,通常,傾向于測試對象的最終結(jié)果,有時,對象間的交互就是最終結(jié)果,此時需要測試交互本身,如:調(diào)用一個,web,服務(wù),兩種測試的區(qū)分交互測試=動作驅(qū)動測試,示例比較,假設(shè):一個灌溉系統(tǒng),事先設(shè)定好時間讓它給院子里的樹木澆水,一天澆幾次,每次多少水,基于狀態(tài)的測試,在指定的一段時間內(nèi)(如:,24,小時)讓系統(tǒng)持續(xù)運行,結(jié)束后檢查樹木狀態(tài),土地的濕度夠不夠?樹的狀態(tài)好不好?,葉子夠不夠綠?等等,測試很難操作
3、,示例比較假設(shè):一個灌溉系統(tǒng),事先設(shè)定好時間讓它給院子里的樹木,交互測試,在水龍頭末端安裝一個設(shè)備,記錄灌溉的開始時間與結(jié)束時間,以及每次灌溉的用水量,系統(tǒng)運行結(jié)束后,不必檢查樹木,只需檢查該設(shè)備調(diào)用次數(shù)是否正確,每次用水量是否正確,交互測試,實際上,無需真正的樹木以測試系統(tǒng),可改變灌溉單元的時鐘,讓它認(rèn)為澆水時間到了,這樣它就會在你指定的任何時間澆水,而不必等很長時間才能確定系統(tǒng)是否正常工作,實際上,無需真正的樹木以測試系統(tǒng),模擬對象,用來記錄灌溉信息的是什么設(shè)備?,可以說它是一個偽水龍頭,或樁對象,比樁對象更智能,記錄其每次調(diào)用的樁對象,模擬對象的職責(zé),模擬對象,系統(tǒng)中的一個偽對象,用來決
4、定一個單元測試是通過還是失敗,通過驗證被測對象和偽對象之間是否進行預(yù)期的交互來判斷,模擬對象用來記錄灌溉信息的是什么設(shè)備?,模擬對象的用法與樁對象很相似,模擬對象比樁對象做的事情更多,保存通信歷史信息,驗證這些記錄,模擬對象的用法與樁對象很相似,區(qū)別,基本區(qū)別,樁對象不會使測試失敗,模擬對象可以導(dǎo)致測試失敗,樁,對象用來替換依賴項,確保測試順利運行,斷言是針對被測類的,測試?yán)媚M對象來驗證測試是否失敗,斷言是針對模擬對象的,區(qū)別基本區(qū)別,使用樁對象的交互圖,使用樁對象的交互圖,使用模擬對象的交互圖,使用模擬對象的交互圖,業(yè)務(wù)背景,增加,LogAnalyzer,需求,當(dāng)接收到一個長度太短的文件
5、名,就發(fā)送一條錯誤信息給某個外部的,web,服務(wù),測試遇到的問題,Web,服務(wù)未實現(xiàn),直接調(diào)用該服務(wù)會導(dǎo)致測試時間過長,業(yè)務(wù)背景增加LogAnalyzer需求,重構(gòu)設(shè)計,新建接口,包含調(diào)用,web,服務(wù)所需的方法,便于新建模擬對象,測試中使用該接口而不是直接調(diào)用,web,服務(wù),重構(gòu)設(shè)計新建接口,接口,接口,模擬對象,模擬對象,被測類,被測類,測試代碼,測試代碼,測試策略,沒有在模擬對象代碼內(nèi)部編寫測試,原因,希望重用該模擬對象,以便于對消息做不同的斷言,若在模擬對象內(nèi)部放置斷言,那么閱讀的人無法理解在斷言什么,隱藏測試代碼的重要信息,會導(dǎo)致測試的可讀性和可維護性下降,測試策略沒有在模擬對象代碼
6、內(nèi)部編寫測試,原因,業(yè)務(wù)背景,LogAnalyzer,調(diào)用,web,服務(wù),如果,Web,服務(wù)拋出錯誤,,LogAnalyzer,必須記錄該錯誤,發(fā)送郵件給管理員,業(yè)務(wù)背景LogAnalyzer調(diào)用web服務(wù),兩個外部依賴的交互圖,兩個外部依賴的交互圖,被測類,被測類,面對的問題,如何測試,LogAnalyzer,在,web,服務(wù)拋出異常時正確調(diào)用電子郵件服務(wù)?,如何替換,web,服務(wù)?,如何模擬,web,服務(wù)拋出的異常?,如何知道電子郵件是否正確調(diào)用?,面對的問題如何測試LogAnalyzer在web服務(wù)拋出異常,解決思路,使用樁對象,替換,web,服務(wù),模擬,web,服務(wù)拋出異常,使用模擬對
7、象,替換郵件服務(wù),解決思路使用樁對象,分析,樁對象,模擬,web,服務(wù)拋出異常,用來保證測試正確運行,模擬對象,驗證是否向電子郵件服務(wù)傳入正確的參數(shù),針對它做斷言,驗證它是否被正確調(diào)用,分析樁對象,測試交互圖,測試交互圖,接口,接口,樁對象,web,服務(wù),樁對象web服務(wù),模擬對象,模擬對象,被測類,被測類,測試代碼,測試代碼,問題,為什么要在一個測試中做多次斷言?,將測試拆分為,3,個測試,每個測試一個斷言,會更簡單?可以把,3,個斷言組合成一個邏輯測試嗎?,為每個測試或測試類手工新建模擬對象和樁對象很枯燥乏味,如何克服?,更,重要的是:在一個測試中可以使用多少個樁對象和模擬對象?,問題為什
8、么要在一個測試中做多次斷言?,原則,一個測試只測一件事,每個測試只能有一個模擬對象,每個測試可以有多個樁對象,一,個測試中存在多個模擬對象意味著正在測試多件事,這會導(dǎo)致測試變得復(fù)雜或脆弱,在遇到更復(fù)雜的測試時,首先找到模擬對象,其他的就是樁對象,前者影響斷言,原則一個測試只測一件事,樁鏈,有時,我們希望從一個偽組件中返回另外一個偽組件,從而在測試中形成了一個小小的樁鏈,示例代碼,IServiceFactory factory=GetServiceFactory(),Iservice service=factory.GetService(),String conn=GlobalUtil.Conf
9、iguration.DBConfiguration.ConnectionString,樁鏈有時,我們希望從一個偽組件中返回另外一個偽組件,從而在測,弊端,假設(shè)你想在測試時替換連接字符串,你可以將,Configuration,屬性設(shè)計為一個樁對象,然后測試時替換它,這個技術(shù)很強大,但是否不利于重構(gòu)?,弊端假設(shè)你想在測試時替換連接字符串,你可以將Configur,虛方法,String,conn=GetConnString(),Proteced virtual string GetConnString(),return GlobalUtil.Configuration.DBConfiguration
10、.ConnectionString,虛方法String conn=GetConnString,測試時,重寫該方法,這種方式,能增強代碼的可讀性和可維護性,不用為插樁,新增接口,測試時,重寫該方法,手寫模擬對象和樁對象的問題,編寫模擬對象和樁對象很費時,如果類和接口有很多方法、屬性和事件,將很難為它們編寫模擬對象和樁對象,如果模擬的方法被多次調(diào)用,一旦涉及狀態(tài)保存問題,就需要寫很多代碼(方法內(nèi)部),手寫模擬對象和樁對象的問題編寫模擬對象和樁對象很費時,如果要驗證一個方法的所有參數(shù),就需要寫多個斷言,第一,個斷言失敗時,程序拋出異常,從而導(dǎo)致后續(xù)斷言無法執(zhí)行,很難在其他測試中重用模擬對象和樁對象,如果要驗證一個方法的所有參數(shù),就需要寫多個斷言,解決方案,采用隔離框架,下,一講介紹,隔離框架,Rhino Mock,解決方案采用隔離框架,小結(jié),基于狀態(tài)的測試和交互測試,前者,=,結(jié)果驅(qū)動測試,后者,=,動作驅(qū)動測試,模擬對象與樁對象的區(qū)別,模擬對象測試依賴項的交互,樁對象返回狀態(tài),模擬對象會導(dǎo)致斷言失敗,樁對象則不會,小結(jié)基于狀態(tài)的測試和交互測試,測試交互圖,測試交互圖,使用,同時使用樁對象與模擬對象,每個測試最多只能有一個模擬對象,每個測試可有多個樁對象,采用樁鏈時,優(yōu)先考慮采用虛方法注入樁對象,提高代碼可讀性與可維護性,避免過度使用模擬對象,使用同時使用樁對象與模擬對象,