一種使用腳本補丁的白盒測試系統及其測試方法
2023-04-23 17:20:41
專利名稱:一種使用腳本補丁的白盒測試系統及其測試方法
技術領域:
本發明涉及通信領域的測試技術,尤其涉及通信領域使用腳本補的白盒測試系統及其測試方法。
在現有技術中,白盒測試系統是常用的測試工具。在白盒測試系統中,需要用具體的程式語言編寫測試所需要的眾多驅動函數、樁函數,這些眾多的驅動函數和樁函數構成測試代碼。這些測試代碼與被測代碼一起經過編譯、連接後生成可執行文件,然後通過該可執行文件的運行進行測試。測試過程中一旦需要修改測試代碼,就需要再次進行將修改後的測試代碼與被測代碼一起重複編譯、連結等過程。這種重複的編譯、連結等過程會導致測試效率低下;且隨著被測系統的不斷增大、複雜度的不斷提高,這樣的重複操作就會越多,最終導致測試的效率就會越低。
如
圖1所示是現有技術中直接用程式語言構造測試樁函數進行軟體測試的過程示意圖,首先用具體的程式語言構造測試樁函數、編寫成測試原始碼,然後將該測試原始碼編譯、與被測原始碼連結,生成可執行系統進行測試。可見,在測試過程中要進行根據需要修改測試樁函數,重新編寫成測試原始碼,重複編譯、連結等過程,直至完成測試,顯然,測試效率不高。
如圖2所示是用格式化語言描述樁函數進行軟體測試的過程示意圖,該系統與圖1所示系統的不同之處在於能提供一種格式化的樁描述方法,用戶只需要按照一定的格式對樁函數進行描述,由系統根據用戶的描述轉換為具體的C語言函數,然後編譯、與被測試系統連結,生成可執行系統。這樣的系統雖然提供腳本化的樁函數描述手段,但最終還是將腳本描述轉化為具體的C語言函數,還是存在重複編譯、連結的問題,從而決定這樣的操作方法的效率還是比較低。
上述兩種測試系統的缺點在於測試過程中無法避免重複的編譯、連結過程,導致測試效率比較低;對異常測試用例構造將更加困難。另外,如圖1所示的系統中還存在眾多測試代碼,這些測試代碼的維護需要一定的成本。隨著測試技術的發展,迫切需要提高測試效率。
一種使用腳本補丁的白盒測試系統,包括測試控制系統和被測試系統,其特徵在於,還包括通訊模塊、腳本模塊和測試模塊;所述測試模塊包括補丁處理中心、啞巴補丁函數群和地址信息表;所述地址信息表用於記錄動態獲得的所述被測試系統中的函數的地址信息;所述啞巴補丁函數群是一系列的啞巴函數;所述通訊模塊通過socket或串口通訊聯接所述測試控制系統;所述腳本模塊通過通訊模塊接收測試控制系統發出的測試指令和腳本樁函數,解釋執行測試指令;所述補丁處理中心調用所述腳本模塊的相應接口,根據所述測試指令實現所述腳本樁函數的執行;所述被測試系統與所述通訊模塊、所述腳本模塊、所述測試模塊一起編譯、連結成為可執行系統用於運行。
所述通訊模塊、所述腳本模塊和所述測試模塊不隨被測試系統的不同而改變;當所述測試控制模塊與系統脫離時,所述被測試系統能夠獨立運行,所述通訊模塊、所述腳本模塊和所述測試模塊處於不影響所述被測試系統運行的休眠狀態。
一種使用腳本補丁的白盒測試方法,包括如下步驟①根據被測試系統的需要動態增加腳本樁函數;②增加所述腳本樁函數與所述被測試系統中函數的對應關係;③採用補丁技術激活所述腳本樁函數,修改代碼段的指令,實現執行過程從所述被測試系統到所述腳本樁函數的遷轉,覆蓋運行所述腳本樁函數或者插入運行所述腳本樁函數。
上述使用腳本補丁的白盒測試方法,在所述步驟③中覆蓋運行腳本樁函數的過程包括如下步驟
a1、當所述被測試系統中的A函數調用處於補丁狀態的B函數時,不執行所述B函數,直接跳轉到與所述B函數對應的啞巴補丁函數;a2、所述啞巴補丁函數調用所述腳本模塊的對應接口,執行對應的腳本樁函數,並將所述腳本樁函數的返回值傳遞給所述啞巴補丁函數;a3、所述啞巴補丁函數將所述腳本樁函數的返回值返回給A函數。
上述使用腳本補丁的白盒測試方法,其步驟③中插入運行腳本樁的過程包括如下步驟b1、當所述被測試系統中的A函數調用處於補丁狀態的B函數時,不執行所述B函數,直接跳轉到與所述B函數對應的啞巴補丁函數;b2、所述啞巴補丁函數調用所述腳本模塊的對應接口,執行對應的腳本樁函數,並將腳本樁函數的返回值傳遞給所述啞巴補丁函數;b3、恢復所述B函數為未補丁狀態;b4、在所述啞巴補丁函數中直接調用所述B函數,獲得並保存所述B函數的返回值;b5、設置B函數為補丁狀態;b6、將所述B函數的返回值返回給所述A函數。
所述步驟a2或步驟b2是通過對類ESP寄存器的訪問,將調用函數時的輸入值影射為腳本實體,使所述腳本樁函數能夠訪問、修改所述A函數調用所述B函數時傳入的參數來實現的。
本發明採用了上述技術方案後,由於採用了補丁技術、腳本語言技術,通過腳本函數來構造測試過程中需要的各種類型的樁函數,而腳本語言技術具備直接編寫、直接起作用的特點,避免了反覆的編譯、連結過程,從而提高測試效率。與現有技術相比,通過該技術能夠靈活用腳本語言構造樁函數,保證不修改被測試系統的情況下動態修改樁函數,靈活決定樁函數的返回值,同時實現測試腳本與被測試系統的相對獨立,減少了測試代碼維護的成本。本發明還可以用於市場已經運行系統的錯誤診斷和緊急修補。本發明經過仿真、模擬,並且在鏡像測試工具中使用,經實踐證明可靠可行。
圖2是用格式化語言描述樁函數進行軟體測試的過程示意圖;圖3是本發明的白盒測試系統的結構示意框圖;圖4是本發明的白盒測試系統的測試流程圖;圖5是本發明的白盒測試系統採用插入方式使用腳本補丁的詳細流程圖;圖6是本發明的白盒測試系統運行流程示意圖。
本發明採用補丁技術、腳本語言技術,通過腳本函數來構造測試過程中需要的各種類型的樁函數,測試控制系統10簡單地說就是用戶操作界面,用戶可以在此編寫腳本樁函數,然後發送到通訊模塊20,同時接收通訊模塊20的消息,並將該消息顯示給用戶。測試控制系統10向通訊模塊20發起連接請求,連接成功後,測試控制系統10和通訊模塊20就進入交互狀態。通訊模塊20和腳本模塊30是兩個獨立的任務,通過消息隊列進行通訊,通訊模塊20收到測試控制系統10的測試指令後就通過消息隊列將指令傳送給腳本模塊30,腳本模塊30負責解釋執行該測試指令;腳本樁函數的傳送方式也可以與指令的傳送方式相同,腳本樁函數由通訊模塊20從測試控制模塊10中導入,存在腳本模塊30中。
測試模塊40包括補丁處理中心模塊41;啞巴補丁函數群42;地址信息表43。
啞巴補丁函數群42包括一系列的啞巴函數,當一個打補丁後被測函數被調用時,首先跳轉到對應的啞巴補丁函數中,然後該啞巴補丁函數直接調用補丁處理中心模塊41接口,告訴補丁中心41一個函數進入補丁,需要執行對應的腳本函數。
所謂啞巴補丁函數,主要用於充當被補丁函數與腳本處理中心41之間的橋梁,通過修改被補丁函數的代碼指令,直接跳轉(JMP)到對應的啞巴補丁函數,啞巴補丁函數根據被補丁函數的返回值類型,決定調用腳本處理中心的不同接口,將補丁號和ESP寄存器的地址告訴補丁處理中心,補丁處理中心41通過補丁號可以正確調用對應的腳本補丁函數;通過訪問類ESP寄存器的適當地址可以將調用被補丁函數時傳入的參數解析出來,從而保證傳入的參數可以被腳本補丁函數所使用。
地址信息表43用於記錄被測試系統50中函數的地址信息,該地址信息是在編譯、連結後的測試過程中動態獲得的。具體獲得辦法包括如下步驟Extern**函數1(***);Extern**函數2(***);......
Extern**函數n(***);Addressinf[]={(unsigned long)函數1,(unsigned long)函數2,...,unsigned long}函數n}上述代碼中Extern是引用被測試系統50中的每個函數,是地址信息表43構造的基礎,Addressinf[]是地址信息表43。
補丁處理中心模塊41調腳本模塊30的相應接口,實現腳本樁函數的執行。補丁處理中心模塊41主要包含兩個函數unsigned long mirrorProcssPatchUlong(unsigned long patchId,unsigned longespAddr)double mirrorProcssPatch Double(unsigned long patchId,unsigned longespAddr)。
上述C語言函數中的參數patchId表示當前的腳本補丁序列號(ID)。參數espAddr表示當前的類esp寄存器的值。這兩個函數的功能是在該函數中調用的第ID個腳本補丁對應的腳本樁函數,並獲得腳本樁函數的返回值。
單純用一個腳本函數代替被測系統50中具體C語言函數的運行,該腳本函數稱之為腳本補丁。如果一個函數本身不存在,而用一個腳本函數代替之完成一定的功能,則該腳本函數稱之為腳本樁。腳本補丁與腳本樁的關聯在於,腳本樁的實現依賴腳本補丁技術,通過腳本樁可以靈活構造各種類型的返回值,主要用於測試;腳本補丁可以廣泛應用於BUG修改、錯誤診斷。其實腳本樁、腳本函數補丁是同樣一個內容,只是應用的場合不同,習慣名稱的不同,腳本樁的概念主要應用在測試領域,腳本函數補丁的概念主要應用在BUG的定位。
本發明的技術同樣可以用於市場已經運行系統的錯誤診斷和緊急修補。本發明的白盒測試系統代碼量其實很小,大約只有2萬行C代碼,完全可以駐留到市場產品中。當市場產品發現問題時,再將測試控制模塊10於該系統連接,通過腳本補丁診斷BUG原因,然後用一個腳本函數,替代錯誤函數的運行,從而避免錯誤。沒有和測試控制模塊10連接時,系統的所有模塊都可以處於休眠狀態,不對產品系統構成任何影響。
圖4是本發明的白盒測試系統的測試流程圖,圖中A函數、B函數均為被測試系統50中的C語言函數,具體關係為B函數被A函數調用。測試過程中,需要用腳本函數替換B函數的運行,從而在腳本函數中靈活構造返回值給A函數。
圖4中步驟1.2.表示在控制系統10中增加腳本樁函數,並通過通訊模塊20傳遞給腳本模塊30;圖4中步驟3.4.5.表示通過控制系統10和通訊模塊20在測試模塊40的補丁處理中心模塊41中增加腳本樁函數與被測試系統對應函數的對應關係;圖4中步驟6.7.表示採用通用的補丁技術,由控制系統10通過測試模塊40激活腳本樁,修改代碼段的指令,實現執行過程的遷轉;圖4中步驟8.表示當被測系統中的A函數調用B函數時,由於B函數被打補丁,直接JMP到啞巴補丁函數群42中對應的啞巴補丁函數;圖4中步驟9.10.表示啞巴補丁函數調用補丁處理中心模塊41對應接口,告訴補丁處理中心模塊41,B函數補丁已經被觸發;圖4中步驟11.12.表示補丁處理中心模塊41調用腳本模塊30對應接口,執行對應的腳本樁函數,同時獲得腳本樁函數的返回值;圖4中步驟13.14.表示補丁處理中心模塊41將腳本樁的返回值傳遞給啞巴補丁函數,然後啞巴補丁函數直接將該值返回給A函數,從而實現了用腳本樁函數代替B函數的運行。
上述步驟描述了腳本補丁即覆蓋運行腳本樁的運行過程,通過在圖4中步驟13.14.中間添加其他操作,可以實現插入腳本樁或腳本補丁的測試運行過程,所謂插入腳本樁就是在運行B函數前,執行腳本函數,然後再繼續運行B函數,插入腳本補丁廣泛應用於對函數輸入參數的合法性判斷。
圖5是採用插入方式使用腳本補丁的詳細流程圖,其具體步驟1.--13.和圖4相同,下面詳細介紹步驟14.--17.圖5中步驟14.表示恢復函數B為未補丁狀態;圖5中步驟15.表示調用B函數,獲得並保存B函數的返回值,(調用B函數時,要對ESP寄存器做適當處理,以保證B函數能夠正確獲得A函數調用時傳入的參數)。
圖5中步驟16.表示恢復函數B為補丁狀態圖5中步驟17.表示將圖5中步驟15.得到的B函數的返回值,直接返回給A函數。
上述步驟14-17的操作過程簡單、明了,實現該操作過程可能有多種操作技巧,例如怎麼調整ESP寄存器,怎麼保證B函數能夠正確獲得A函數調用時傳入的參數,怎麼保存B函數的返回值等。插入方式使用腳本補丁時,這些參數的傳入與返回值的獲得方法的不同,都屬於本發明的保護範圍。
圖6是本發明的白盒測試系統運行流程示意圖,更加形象地描述了本發明的思路。在測試過程中,B函數被打補丁;當被測試系統中的A函數調用B函數時,直接跳轉到對應的啞巴函數,該啞巴函數調用啞巴補丁中心41對應接口,通過該接口調用腳本系統30對應接口,執行對應的腳本樁函數C,同時獲得腳本樁函數C的返回值,補丁中心41將腳本樁的返回值傳遞給啞巴函數,然後啞巴補丁函數直接將該值返回給A函數,從而實現了用腳本樁函數C代替B函數的運行。
配合鏡像測試技術(主要思想是將被測試系統實體(變量、函數)影射為腳本實體,從而通過對腳本實體的操作,達到對被測試系統實體操作的目的),通過對ESP寄存器的訪問,可以將調用函數時的輸入值影射為腳本實體,從而在腳本樁(腳本補丁)中同樣可以訪問、修改調用這些參數,例如圖6腳本樁函數C同樣能訪問A函數調用B函數時傳入的參數。
本發明可應用於各種被測試系統。
在以上描述中以C語言舉例說明,並不表示對本發明應用範圍的限制。
為了進一步幫助理解本發明,作為本發明的一個實施例,下面以C語言為例給出一個啞巴補丁函數dummyPatchFunc0 PROC的代碼和描述 dummyPatchFunc0 PROC push 0 call mpGetPatchedFuncType;獲得被補丁函數的返回值的類型 add esp,4 push eax pop functype0 push esp;將ESP寄存器,通過該值可以獲得A調用B時,壓入堆dp/ 棧的參數push 0;補丁ID號.if functype0==0 call mirrorProcssPatchDouble.else call mirrorProcssPatchUlong.endifadd esp,8pushadpush 0call mpGetPatchType;獲得補丁的類型add esp,4push eaxpop patchtype0popad.if patchtype0==0;覆蓋補丁直接返回 ret.else;插入補丁 .if functype0==0 fstp qword ptr[dummy0] .endif push 0 call mpResumeUnPatchState;將被補丁函數恢復為未補丁狀態 add esp,4 mov funcaddr0,eax pop oldeip0 call funcaddr0;調用被補丁的函數 push oldeip0dp/ pushad push 0 call mpResumePatchState;恢復被補丁函數為補丁狀態 add esp,4 popad .endif retdummyPatchFunc0 endpdummyPatchFunc1 PROC push 1 call mpGetPatchedFuncType add esp,4 push eax pop functype1 push esp push 1 .if functype1==0 call mirrorProcssPatchDouble .else call mirrorProcssPatchUlong .endif add esp,8 pushad push 1 call mpGetPatchType add esp,4 push eaxdp/pop patchtype 1popad.if patchtype1==0 ret.else .if functype1==0 fstp qword ptr[dummy1] .endif push 1 call mpResumeUnPatchState add esp,4 mov funcaddr1,eax pop oldeip1 call funcaddr1 push oldeip1 pushad push 1 call mpResumePatchState add esp,4 popad .endif retdummyPatchFunc1 endpdummyPatchFunc2 PROC push 2 call mpGetPatchedFuncType add esp,4dp/push eaxpop functype2push esppush 2.if functype2==0 call mirrorProcssPatchDouble.else call mirrorProcssPatchUlong.endifadd esp,8pushadpush 2call mpGetPatchTypeadd esp,4push eaxpop patchtype2popad.ifpatchtype2==0 ret .else .if functype2==0 fstp qword ptr[dummy2].endifpush 2call mpResumeUnPatchStateadd esp,4mov funcaddr2,eaxpop oldeip2dp/ call funcaddr2 push oldeip2 pushad push 2 call mpResumePatchState add esp,4 popad .endif retdummyPatchFunc2 endpdummyPatchFunc3 PROC push 3 call mpGetPatchedFuncType add esp,4 push eax pop functype3 push esp push 3 .if functype3==0 call mirrorProcssPatchDouble .else call mirrorProcssPatchUlong .endif add esp,8 pushad push 3 call mpGetPatchTypedp/ add esp,4 push eax pop patchtype3 popad.if patchtype3==0 ret .else .if functype3==0 fstp qword ptr[dummy3] .endif push 3 call mpResumeUnPatchState add esp,4 mov funcaddr3,eax pop oldeip3 call funcaddr3 push oldeip3 pushad push 3 call mpResumePatchState add esp,4 popad .endif retdummyPatchFunc3 endp
權利要求
1.一種使用腳本補丁的白盒測試系統,包括測試控制系統(10)和被測試系統(50),其特徵在於,還包括通訊模塊(20)、腳本模塊(30)和測試模塊(40);所述測試模塊(40)包括補丁處理中心模塊(41)、啞巴補丁函數群(42)和地址信息表(43);所述地址信息表(43)用於記錄動態獲得的所述被測試系統(50)中的函數的地址信息;所述啞巴補丁函數群(42)是一系列的用於充當被補丁函數與補丁處理中心模塊(41)之間的橋梁的啞巴函數;所述通訊模塊(20)通過socket或串口通訊聯接所述測試控制系統(10);所述腳本模塊(30)通過通訊模塊(20)接收測試控制系統(10)發出的測試指令和腳本樁函數,解釋執行測試指令;所述補丁處理中心模塊(41)調用所述腳本模塊(30)的相應接口,根據所述測試指令實現所述腳本樁函數的執行;所述被測試系統(50)與所述通訊模塊(20)、所述腳本模塊(30)、所述測試模塊(40)一起編譯、連結成為可執行系統用於運行。
2.根據權利要求1所述的使用腳本補丁的白盒測試系統,其特徵在於,所述通訊模塊(20)、所述腳本模塊(30)和所述測試模塊(40)不隨被測試系統(50)的不同而改變。
3.根據權利要求1或2所述的使用腳本補丁的白盒測試系統,其特徵在於,當所述測試控制模塊(10)與系統脫離時,所述被測試系統(50)能夠獨立運行,所述通訊模塊(20)、所述腳本模塊(30)和所述測試模塊(40)處於不影響所述被測試系統(50)運行的休眠狀態。
4.一種使用腳本補丁的白盒測試方法,其特徵在於包括如下步驟①根據被測試系統的需要動態增加腳本樁函數;②增加所述腳本樁函數與所述被測試系統中函數的對應關係;③採用補丁技術激活所述腳本樁函數,修改代碼段的指令,實現執行過程從所述被測試系統到所述腳本樁函數的遷轉,覆蓋運行所述腳本樁函數或者插入運行所述腳本樁函數。
5.根據權利要求4所述的使用腳本補丁的白盒測試方法,其特徵在於所述步驟③中覆蓋運行腳本樁函數的過程包括如下步驟a1.當所述被測試系統中的A函數調用處於補丁狀態的B函數時,不執行所述B函數,直接跳轉到與所述B函數對應的啞巴補丁函數;a2.所述啞巴補丁函數調用所述腳本模塊(30)的對應接口,執行對應的腳本樁函數,並將所述腳本樁函數的返回值傳遞給所述啞巴補丁函數;a3.所述啞巴補丁函數將所述腳本樁函數的返回值返回給A函數。
6.根據權利要求4所述的使用腳本補丁的白盒測試方法,其特徵在於所述步驟③中插入運行腳本樁的過程包括如下步驟b1.當所述被測試系統中的A函數調用處於補丁狀態的B函數時,不執行所述B函數,直接跳轉到與所述B函數對應的啞巴補丁函數;b2.所述啞巴補丁函數調用所述腳本模塊(30)的對應接口,執行對應的腳本樁函數,並將腳本樁函數的返回值傳遞給所述啞巴補丁函數;b3.恢復所述B函數為未補丁狀態;b4.在所述啞巴補丁函數中直接調用所述B函數,獲得並保存所述B函數的返回值;b5.設置B函數為補丁狀態;b6.將所述B函數的返回值返回給所述A函數。
7.根據權利要求5或6所述的使用腳本補丁的白盒測試方法,其特徵在於所述步驟a2或步驟b2是通過對類ESP寄存器的訪問,將調用函數時的輸入值影射為腳本實體,使所述腳本樁函數能夠訪問、修改所述A函數調用所述B函數時傳入的參數來實現的。
全文摘要
本發明公開了一種使用腳本補丁的白盒測試系統及方法,利用腳本函數和補丁技術動態構造測試樁函數,實現測試樁函數的腳本化構造、腳本化執行,避免重複的編譯、連結過程,提高測試效率。測試系統包括測試控制系統(10)和被測試系統(50);還包括通訊模塊(20)、腳本模塊(30)和測試模塊(40);測試模塊(40)包括補丁處理中心模塊(41)、啞巴補丁函數群(42)和地址信息表(43);測試方法包括根據被測試系統的需要動態增加腳本樁函數;增加腳本樁函數與被測試系統中函數的對應關係;採用補丁技術激活腳本樁函數,修改代碼段的指令,實現執行過程從被測試系統到腳本樁函數的遷轉,覆蓋運行腳本樁函數或插入運行腳本樁函數。
文檔編號H04B17/00GK1471249SQ0212679
公開日2004年1月28日 申請日期2002年7月23日 優先權日2002年7月23日
發明者董奎, 程強, 董 奎 申請人:華為技術有限公司