專利名稱:在單元測試中實現(xiàn)通用樁函數(shù)的裝置及其實現(xiàn)方法
技術領域:
本發(fā)明涉及軟件測試技術,尤其涉及一種在單元測試中實現(xiàn)通用樁函數(shù)的 裝置及其實現(xiàn)方法。
背景技術:
所謂樁函數(shù)就是指對某個存在或者不存在的函數(shù)的模擬,它在某些輸入輸 出特性上與真實函數(shù)一致,但是函數(shù)內(nèi)部邏輯簡單。樁函數(shù)的價值在于函數(shù)的 外部特性盡量和被替換的函數(shù)相似,而實現(xiàn)的工作量盡量減少,否則如果工作 量很大,則不如直接使用真是的函數(shù)。
樁函數(shù)主要在以下場景中使用
1. 被測函數(shù)調(diào)用了一個未編寫的函數(shù),可以編寫樁函數(shù)來代替被調(diào)用的 函數(shù);
2. 樁函數(shù)也用于實現(xiàn)測試距離,由于被測函數(shù)的運行需要調(diào)用其他被調(diào) 用函數(shù)(以下簡稱called函數(shù)),而這些called函數(shù)依賴于網(wǎng)絡、數(shù)據(jù)庫、硬 件等復雜環(huán)境,所以為了使單元測試更容易進行,需要模擬這些called函數(shù), 隔離開復雜環(huán)境的依賴;
3. 需要控制called函數(shù)的某些行為,如可以自由改變這些called函數(shù)的 返回值、出參、全局變量,或者縮短called函數(shù)的執(zhí)行時間。
只有采用自底向上的測試順序才會不需要用到樁函數(shù),但帶來的問題也是 嚴重的,比如需要所有的called函數(shù)都已實現(xiàn),不能并行進行單元測試,不能 對called函數(shù)進行控制等。在實踐中,單元測試的有效策略是選取重要模塊, 盡早測試。這一策略決定了測試一個函數(shù)時由于需要隔離上層調(diào)用函數(shù)(以下 簡稱calling函數(shù))和下層called函數(shù),calling函數(shù)用驅(qū)動函數(shù)來實現(xiàn),called 函數(shù)要用樁函數(shù)來代替,以實現(xiàn)對called函數(shù)的控制和隔離。
單元測試中樁函數(shù)的編寫工作量是比較大的,每個被測函數(shù)所調(diào)用的函數(shù) 都有可能要編寫一個或者多個樁函數(shù)以便進行對called函數(shù)進行控制。但是每
增加、減少或者改動一次樁函數(shù)都需要對源程序重新編譯,影響測試效率。目 前對這一問題基本上基于兩個思路1、手工用腳本編寫,優(yōu)點是不用重復編 譯,適用于被測代碼變化少,而樁函數(shù)變動多的場景,缺點是編寫工作量沒有 減少,而且使用者需要學習一種新的腳本語言,學習曲線長;2、自動生成樁 函數(shù),優(yōu)點是減少了樁函數(shù)編寫的工作量,缺點是增加了測試工具的復雜性, 如果需要在各種編譯環(huán)境下都能自動生成樁函數(shù),對測試工具要求極高。
發(fā)明內(nèi)容
本發(fā)明旨在解決現(xiàn)有技術中手工編寫樁函數(shù)時工作量大、自動生成樁函數(shù) 時對測試工具要求高的問題,提供了一種在單元測試中實現(xiàn)通用樁函數(shù)的裝置 及其實現(xiàn)方法,減少了單元測試過程中樁函數(shù)的編寫工作量,而且實現(xiàn)難度小, 能夠在各種操作系統(tǒng)、編譯環(huán)境下實現(xiàn)。
為了實現(xiàn)上述目的,本發(fā)明提供了一種在單元測試中實現(xiàn)通用樁函數(shù)的裝 置,其特征在于,包括
被測模塊,用于存儲被測函數(shù);
提取模塊,用于對所述被測模塊存儲的被測函數(shù)進行分析,獲取所述被測
函數(shù)的函數(shù)信息;
符號表模塊,用于存儲所述提取模塊獲取的所述被測函數(shù)的函數(shù)信息; 緩沖區(qū)模塊,用于存儲實現(xiàn)樁函數(shù)所需的參數(shù)信息;
通用樁函數(shù)模塊,用于從所述緩沖區(qū)模塊獲取實現(xiàn)樁函數(shù)所需的參數(shù)信 息,設置對應的堆棧以及寄存器,并實現(xiàn)樁函數(shù);
驅(qū)動函數(shù)模塊,用于驅(qū)動所述被測模塊中的被測函數(shù),并使所述被測函數(shù) 在調(diào)用被調(diào)用函數(shù)時跳轉(zhuǎn)到所述通用樁函數(shù)模塊。
上述的裝置,其特征在于,所述緩沖區(qū)模塊還用于存儲所述樁函數(shù)執(zhí)行后 的參數(shù)信息。
上述的裝置,其特征在于,
所述函數(shù)信息包括數(shù)據(jù)結構、函數(shù)參數(shù)、返回值、全局變量和函數(shù)調(diào)用關
系;
所述參數(shù)信息包括出參值、全局變量值和返回值。
為了更好地實現(xiàn)上述目的,本發(fā)明還提供了一種在單元測試中實現(xiàn)通用樁
函數(shù)的實現(xiàn)方法,其特征在于,包括
被測函數(shù)存儲步驟,用于存儲被測函數(shù);
提取步驟,用于對存儲的被測函數(shù)進行分析,獲取所述被測函數(shù)的函數(shù)信
息;
符號表存儲步驟,用于存儲所述獲取的所述被測函數(shù)的函數(shù)信息; 緩沖區(qū)存儲步驟,用于存儲實現(xiàn)樁函數(shù)所需的參數(shù)信息;
通用樁函數(shù)實現(xiàn)步驟,用于獲取實現(xiàn)樁函數(shù)所需的參數(shù)信息,設置對應的
堆棧以及寄存器,并實現(xiàn)樁函數(shù);
驅(qū)動步驟,用于驅(qū)動所述被測函數(shù),并使所述被測函數(shù)在調(diào)用被調(diào)用函數(shù) 時跳轉(zhuǎn)到所述通用樁函數(shù)實現(xiàn)步驟。
上述的實現(xiàn)方法,其特征在于,所述緩沖區(qū)存儲步驟還用于存儲所述樁函 數(shù)執(zhí)行后的參數(shù)信息。
上述的實現(xiàn)方法,其特征在于,
所述函數(shù)信息包括數(shù)據(jù)結構、函數(shù)參數(shù)、返回值、全局變量和函數(shù)調(diào)用關
系;
所述參數(shù)信息包括出參值、全局變量值和返回值。 上述的實現(xiàn)方法,其特征在于,所述驅(qū)動步驟進一步包括 Fl,根據(jù)參數(shù)樁函數(shù)索引,獲取樁函數(shù)名稱; F2,獲取所述樁函數(shù)的出參值、全局變量值和返回值; F3,設置被調(diào)用函數(shù)的出參值、全局變量值和返回值; F4,正確調(diào)整堆棧指針,返回控制權給調(diào)用函數(shù)。
上述的實現(xiàn)方法,其特征在于,所述Fl之后進一步包括Fl 1 ,調(diào)用UserStub 函數(shù),執(zhí)行用戶自定義代碼。
為了更好地實現(xiàn)上述目的,本發(fā)明還提供了一種實現(xiàn)上述方法的測試系 統(tǒng),包括一種在單元測試中實現(xiàn)通用樁函數(shù)的裝置,其特征在于,所述裝置包 括
被測模塊,用于存儲被測函數(shù);
提取模塊,用于對所述被測模塊存儲的被測函數(shù)進行分析,獲取所述被測 函數(shù)的函數(shù)信息;
符號表模塊,用于存儲所述提取模塊獲取的所述被測函數(shù)的函數(shù)信息;
緩沖區(qū)模塊,用于存儲實現(xiàn)樁函數(shù)所需的參數(shù)信息;
通用樁函數(shù)模塊,用于從所述緩沖區(qū)模塊獲取實現(xiàn)樁函數(shù)所需的參數(shù)信 息,設置對應的堆棧以及寄存器,并實現(xiàn)樁函數(shù);
驅(qū)動函數(shù)模塊,用于驅(qū)動所述被測模塊中的被測函數(shù),并使所述被測函數(shù) 在調(diào)用被調(diào)用函數(shù)時跳轉(zhuǎn)到所述通用樁函數(shù)模塊。
上述的系統(tǒng),其特征在于,所述緩沖區(qū)模塊還用于存儲所述樁函數(shù)執(zhí)行后 的參數(shù)信息。
本發(fā)明提供的裝置及其實現(xiàn)方法,通過對源程序的掃描提取結構信息,使 用戶不需要關心程序的結構,同時用戶只需要提供樁函數(shù)所需要的輸入輸出數(shù) 據(jù),其他都由樁函數(shù)處理,有利于實現(xiàn)數(shù)據(jù)驅(qū)動的單元測試,可復用性和靈活 性大大提高,并且被測程序一次編譯后,可靈活創(chuàng)建多個測試用例,減少了系 統(tǒng)的編譯次數(shù),被測程序可以在目標機上,也可以在PC機上,能夠靈活適應 多種測試環(huán)境。
圖1是本發(fā)明中測試系統(tǒng)結構框圖2是本發(fā)明中在單元測試中實現(xiàn)通用樁函數(shù)的裝置的結構框圖; 圖3是本發(fā)明中實現(xiàn)方法流程圖4是本發(fā)明具體實施例中跳轉(zhuǎn)指定被調(diào)用函數(shù)流程圖; 圖5是本發(fā)明具體實施例中通用樁函數(shù)執(zhí)行流程圖。
具體實施例方式
圖1所示為本發(fā)明中測試系統(tǒng)結構框圖,系統(tǒng)100包括提取模塊110、符 號表模塊120、驅(qū)動函數(shù)模塊130、被測模塊140、通用樁函數(shù)模塊150、緩沖 區(qū)模塊160和用戶端170,其中用戶通過用戶端170將測試用例(包含called 函數(shù)執(zhí)行后的參數(shù)、全局變量、返回值)輸入緩沖區(qū)模塊160,通用樁函數(shù)模 塊150是本發(fā)明的主要部分,通過與緩沖區(qū)模塊160進行交互,獲得樁函數(shù)的 出參值、全局變量值以及返回值,并設置對應的堆棧以及寄存器;緩沖區(qū)模塊 160是用于存儲樁函數(shù)的出參值、全局變量值和返回值的緩沖區(qū),以及訪問該 緩沖區(qū)的應用程序接口 (API),該緩沖區(qū)模塊結構中主要包括了如下字段
Index—參數(shù)的索引,VarName —全局變量的名稱,size —所占字節(jié)的大小, pointerflag—是否為指針(數(shù)組和指針同樣處理),data—存放數(shù)值的數(shù)據(jù)塊; 提取模塊110以被測模塊140為輸入,通過對被測模塊140進行分析(如對被 測模塊140源文件進行靜態(tài)分析,但本發(fā)明也可以適用于其他形式的分析過 程),獲取被測模塊140的數(shù)據(jù)結構、函數(shù)參數(shù)、返回值、全局變量、函數(shù)調(diào) 用關系等信息,并通過符號表模塊120存儲這些信息,這些信息是通用樁函數(shù) 模塊150運行的基礎;符號表模塊120封裝了提取模塊110獲取的信息,并通 過對外接口,以供其他模塊獲取被測函數(shù)和called函數(shù)的參數(shù)、返回值、全局 變量的類型、大小等信息;被測模塊140存儲被測試的函數(shù),在編譯之前是包 含了一組被測函數(shù)的源文件,在編譯之后是一組由被測函數(shù)源文件生成的二進 制代碼;驅(qū)動函數(shù)模塊130用于存儲驅(qū)動函數(shù),通過該驅(qū)動函數(shù)運行被測函數(shù)。 本發(fā)明中在單元測試中實現(xiàn)通用樁函數(shù)的裝置200包括提取模塊110、符號表 模塊120、驅(qū)動函數(shù)模塊130、被測模塊140、通用樁函數(shù)模塊150和緩沖區(qū) 模塊160,如圖2所示。
圖3所示為利用圖2所示的裝置再單元測試中實現(xiàn)通用樁函數(shù)的流程圖, 包括
步驟S310,在被測函數(shù)模塊中存儲被測函數(shù);
步驟S320,提取模塊對存儲的被測函數(shù)進行分析,獲取所述被測函數(shù)的 函數(shù)信息,該函數(shù)信息包括數(shù)據(jù)結構、函數(shù)參數(shù)、返回值、全局變量和函數(shù)調(diào) 用關系;
步驟S330,在符號表模塊中存儲獲取的所述被測函數(shù)的函數(shù)信息;
步驟S340,在緩沖區(qū)模塊中存儲實現(xiàn)樁函數(shù)所需的參數(shù)信息,包括出參 值、全局變量值和返回值;
步驟S350,通用樁函數(shù)模塊從緩沖區(qū)模塊中獲取實現(xiàn)樁函數(shù)所需的參數(shù) 信息,設置對應的堆棧以及寄存器,并實現(xiàn)樁函數(shù);
步驟S360,驅(qū)動驅(qū)動所述被測函數(shù),并使所述被測函數(shù)在調(diào)用被調(diào)用函 數(shù)時跳轉(zhuǎn)到所述通用樁函數(shù)實現(xiàn)步驟,具體包括
Fl,根據(jù)參數(shù)樁函數(shù)索引,獲取樁函數(shù)名稱;
F2,調(diào)用UserStub函數(shù),執(zhí)行用戶自定義代碼F3,獲取所述樁函數(shù)的出參值、全局變量值和返回值; F4,設置被調(diào)用函數(shù)的出參值、全局變量值和返回值; F5,正確調(diào)整堆棧指針,返回控制權給調(diào)用函數(shù)。
圖4是本發(fā)明實施例中跳轉(zhuǎn)指定被調(diào)用函數(shù)流程圖,將指定被調(diào)用函數(shù)跳 轉(zhuǎn)到通用樁函數(shù),也就是對被調(diào)用函數(shù)打樁,包括如下步驟
步驟S410,從函數(shù)名稱獲取called函數(shù)的地址OldAddr和通用樁函數(shù)的 地址NewAddr,根據(jù)不同的操作系統(tǒng)、不同語言、不同編譯器實現(xiàn)該步驟有 不同的方法,有些操作系統(tǒng)如vxworks本身就提供這樣的API,有些操作系統(tǒng) 如windows不直接提供API,但是可以通過分析編譯器生成.exe或者.map文件 來獲得函數(shù)地址;
步驟S420,獲取called函數(shù)的索引index,在通用樁函數(shù)中,只有一個樁 函數(shù)對應了所有的called函數(shù),需要在通用樁函數(shù)中區(qū)分該次樁函數(shù)是對哪個 called函數(shù)打樁,本發(fā)明中采用了函數(shù)索引表的機制,建立函數(shù)索引表是為了 提供兩個API:根據(jù)函數(shù)索引獲取函數(shù)名和根據(jù)函數(shù)名獲取函數(shù)索引,函數(shù)索 引表的建立方法很多,可以分析源文件,也可以通過分析編譯器生成.exe或 者.map文件來建立,只要能夠獲取當前被測模塊中所有函數(shù)的列表,都可以 建立函數(shù)索引表,本發(fā)明中根據(jù)函數(shù)名稱來獲取函數(shù)索引index;
步驟S430,計算指定called函數(shù)和通用樁函數(shù)地址偏移量offset,該偏移 量用于從called函數(shù)的入口跳轉(zhuǎn)到通用樁函數(shù)的入口, offset的計算方法如下
offset=(DWORD32)((DWORD32)newAddr-((DWORD32)oldAddrfCODE— LEN》
這里的CODE—LEN是要替換的指令的長度,由于jmp指令位于要替換的 指令的最后,這樣在計算相對偏移offset時需要考慮CODE—LEN,本發(fā)明中 需要替換的指令為push和jmp,在32位系統(tǒng)里, 一條push指令的長度是2 個字節(jié), 一條jmp指令的長度是5個字節(jié),所以這里定義CODE—LEN為7;
步驟S440,以push index和jmp offset兩條指令替換指定called函數(shù)的入 口處指令,push index指令將函數(shù)索引壓入函數(shù)堆棧中,這樣在跳轉(zhuǎn)至通用樁 函數(shù)的入口后,取出堆棧中存儲的該索引值,即可得知該次執(zhí)行中,通用樁函 數(shù)對應的called函數(shù),以從緩沖區(qū)中獲取預置的該called函數(shù)的出參、全局變 量以及返回值,以完成樁函數(shù)的作用,其中jmp offset指令用于使called函數(shù)
的入口從原入口強制跳轉(zhuǎn)至通用樁函數(shù)的入口,而且函數(shù)堆棧則保持called函 數(shù)的堆棧狀態(tài),替換的偽代碼如下
char (:0^[10];//用于緩存替換指令。
cCode
=(char)0x6a; 〃push指令機器碼
*((DWORD32*)&cCode[l])= index;〃index是步驟202中獲得的 cCode[2] = (char)0xe9;〃jmp指令機器碼 *((DWORD32*)&cCode[3]) = offset; 〃offset是步驟203中獲得的 #ifdef WIN32
VirtualProtect(oldAddr,CODE—LEN,PAGE—EXECUTE一READWRITE,&dw
);
〃oWAddr是指定called函數(shù)的入口地址,VirtualProtect用于把指定代碼段 變?yōu)榭蓪?,這只在windows下需要,因為windows下代碼段缺省不可寫,在 vxworks、 Linux等操作系統(tǒng)下不需要作這樣的處理,代碼段缺省是可寫的。
#endif
memcpy(oldAddr,cCode,CODE—LEN);〃覆蓋called函數(shù)入口的前7個字節(jié) 為push index; jmp offset對應的機器碼。
每次被測函數(shù)調(diào)用指定called函數(shù)時,由于指定called函數(shù)的入口處指令 已被替換為push index、 jmp offset兩條指令,就會直接跳轉(zhuǎn)到通用樁函數(shù)的 入口地址。
圖5所示為本發(fā)明實施例中通用樁函數(shù)執(zhí)行流程圖,包括.-
步驟S510,調(diào)整堆棧,并根據(jù)函數(shù)索引獲取函數(shù)名,本發(fā)明由于使用了 打樁技術,直接從called函數(shù)入口通過jmp offset指令跳轉(zhuǎn)到通用樁函數(shù)入口 代碼,在進入通用樁函數(shù)入口后,首先保存寄存器ebp,并在寄存器ebp內(nèi)保 存棧頂指針esp的值,然后獲取棧頂存儲的函數(shù)索引,并根據(jù)函數(shù)索引表獲取 called函數(shù)名,偽代碼如下
int* oldespj
int承newespj
int stubidj
#ifdef _M—1X86 〃 X86 Only! —asm {
mov oldesp,esp
add esp,4 〃跳過堆桟中的index,這個index是步驟240中push index指令壓入堆棧的。
mov newesp,esp 〃newesp用于訪問called函數(shù)的堆棧,此時 newesp指向called函數(shù)堆棧的第一個參數(shù)地址(以單字節(jié)對齊、—cdecl調(diào)用方 式為例,是最左邊的參數(shù))。
stubid=* 0ldesp;〃取出棧頂?shù)暮瘮?shù)索弓l。 —asm {
push ebp mov ebp, esp sub esp, —LOCAL—SIZE } 〃保存called函數(shù)堆棧的ebp和esp,并建立通用樁函數(shù)的本地變量堆棧。
#endif
ATE—GetFuncN畫Bylndex(stubid,ftmcname);〃從函數(shù)索引獲取函數(shù)名稱。
步驟S520,調(diào)用UserStub,執(zhí)行用戶自定義代碼,該步驟為可選步驟, 本發(fā)明中提供了 UserStub函數(shù),用戶可在該函數(shù)中寫入自定義的代碼,以設 置called函數(shù)的緩沖區(qū),達到修改called函數(shù)出參和全局變量的目的;
步驟S530,査找緩沖區(qū),獲取called函數(shù)的出參值、全局變量值和返回 值,該步驟中,根據(jù)步驟S510中獲取的called函數(shù)名,査找緩沖區(qū)獲取預設 的called函數(shù)的出參值、全局變量值和返回值,其中緩沖區(qū)提供了下列API 以進行對緩沖區(qū)的設置和讀取
讀取緩沖區(qū)中的函數(shù)參數(shù)值;
設置緩沖區(qū)中的函數(shù)參數(shù)值;
讀取緩沖區(qū)中的全局變量值; 設置緩沖區(qū)中的全局變量值;
步驟S540,設置called函數(shù)出參值、全局變量值和返回值,由于使用了 打樁技術,替換了 called函數(shù)入口地址的指令,所以直接從called函數(shù)入口通過jmp offset指令跳轉(zhuǎn)到通用樁函數(shù)入口,因此此時堆棧中應該保留了 called 函數(shù)的堆棧,需要通過一定的計算來取得堆棧中的called函數(shù)的參數(shù)地址。
全局變量和函數(shù)一樣作為全局符號,在編譯時分配有地址(獲取地址方法 同步驟S410),從緩沖區(qū)中讀取其預設值,設置該全局變量的值為預設值, 設置called函數(shù)的出參需要訪問該函數(shù)的堆棧,以設置其值,訪問堆棧通過棧 頂指針newesp訪問,按照called函數(shù)的調(diào)用約定順序反向計算參數(shù)在堆棧中 的地址,該步驟的具體細節(jié)與編譯器緊密相關,隨字節(jié)對齊和函數(shù)調(diào)用預定不 同而變化,下面以單字節(jié)對齊、—cdecl調(diào)用方式為例詳細說明
1、 對于called函數(shù)的n個參數(shù),從第一個參數(shù)到第n個參數(shù),依次做如 下操作
(1) 獲取該參數(shù)的緩沖區(qū)pambuffer,獲取該參數(shù)所占字節(jié)數(shù)size;
(2) 如果參數(shù)大小不是4的整數(shù)倍,則補齊至4的整數(shù)倍size= size+(4-size%4);
(3) 如果該參數(shù)為指針,則代表此參數(shù)可以作為出參,可以修改此參數(shù)的 值,則以pambuffer的data數(shù)據(jù)塊替換該參數(shù)指向的數(shù)據(jù)塊,偽代碼是 memcpy(*newesp,parabuffer->data,size);〃*newesp代表該參數(shù)指向的內(nèi)存地址;
(4) 如果該參數(shù)不是指針,則代表此參數(shù)不可以作為出參,不需要改變其
值;
(5) 執(zhí)行指令addnewesp,size,執(zhí)行后newesp指向堆棧中的下一個參數(shù)的 地址;
2、 對于被測函數(shù)中的每個全局變量,依次作如下操作
(1) 獲取該全局變量的緩沖區(qū),記為pGlovar;
(2) 獲取該全局變量的地址,記為GlovarAdd;
(3) 如果該全局變量為指針,則將緩沖區(qū)數(shù)據(jù)塊的地址拷貝至GlovarAdd 中,否則將緩沖區(qū)數(shù)據(jù)塊的值拷貝至GlovarAdd中.
3、 設置called函數(shù)返回值,called函數(shù)的返回值存放在寄存器eax中,設 置方式如下
(1) 如果called函數(shù)的返回值為指針,則將返回值的地址放入寄存器eax
中;
(2) 如果called函數(shù)的返回值所占字節(jié)數(shù)大于4字節(jié),將返回值的地址放入
寄存器eax中;
P)否則,將返回值的值直接放入寄存器eax中。
步驟S550,調(diào)整函數(shù)堆棧,返回控制權給調(diào)用者,返回函數(shù)流程至called 函數(shù)的調(diào)用者,繼續(xù)執(zhí)行后續(xù)代碼,在進入通用樁函數(shù)時,保存寄存器ebp, 并在寄存器ebp內(nèi)保存棧頂指針esp的值,在退出通用樁函數(shù)時,esp的值還 原為保存在ebp內(nèi)的值,并恢復寄存器ebp,這樣就回復了函數(shù)的堆棧,該步
驟的偽代碼如下
<formula>formula see original document page 13</formula>上述示例均以INTEL處理器和C語言為例,并不表示對本發(fā)明應用范圍 的限制。
當然,本發(fā)明還可有其它多種實施例,在不背離本發(fā)明精神及其實質(zhì)的情 況下,熟悉本領域的普通技術人員當可根據(jù)本發(fā)明做出各種相應的改變和變 形,但這些相應的改變和變形都應屬于本發(fā)明所附的權利要求的保護范圍。
權利要求
1、一種在單元測試中實現(xiàn)通用樁函數(shù)的裝置,其特征在于,包括被測模塊,用于存儲被測函數(shù);提取模塊,用于對所述被測模塊存儲的被測函數(shù)進行分析,獲取所述被測函數(shù)的函數(shù)信息;符號表模塊,用于存儲所述提取模塊獲取的所述被測函數(shù)的函數(shù)信息;緩沖區(qū)模塊,用于存儲實現(xiàn)樁函數(shù)所需的參數(shù)信息;通用樁函數(shù)模塊,用于從所述緩沖區(qū)模塊獲取實現(xiàn)樁函數(shù)所需的參數(shù)信息,設置對應的堆棧以及寄存器,并實現(xiàn)樁函數(shù);驅(qū)動函數(shù)模塊,用于驅(qū)動所述被測模塊中的被測函數(shù),并使所述被測函數(shù)在調(diào)用被調(diào)用函數(shù)時跳轉(zhuǎn)到所述通用樁函數(shù)模塊。
2、 根據(jù)權利要求1所述的裝置,其特征在于,所述緩沖區(qū)模塊還用于存 儲所述樁函數(shù)執(zhí)行后的參數(shù)信息。
3、 根據(jù)權利要求2所述的裝置,其特征在于,所述函數(shù)信息包括數(shù)據(jù)結構、函數(shù)參數(shù)、返回值、全局變量和函數(shù)調(diào)用關系;所述參數(shù)信息包括出參值、全局變量值和返回值。
4、 一種利用權利要求1所述的裝置在單元測試中實現(xiàn)通用樁函數(shù)的實現(xiàn)方法,其特征在于,包括被測函數(shù)存儲步驟,用于存儲被測函數(shù);提取步驟,用于對存儲的被測函數(shù)進行分析,獲取所述被測函數(shù)的函數(shù)信息;符號表存儲步驟,用于存儲所述獲取的所述被測函數(shù)的函數(shù)信息; 緩沖區(qū)存儲步驟,用于存儲實現(xiàn)樁函數(shù)所需的參數(shù)信息; 通用樁函數(shù)實現(xiàn)步驟,用于獲取實現(xiàn)樁函數(shù)所需的參數(shù)信息,設置對應的堆棧以及寄存器,并實現(xiàn)樁函數(shù);驅(qū)動步驟,用于驅(qū)動所述被測函數(shù),并使所述被測函數(shù)在調(diào)用被調(diào)用函數(shù)時跳轉(zhuǎn)到所述通用樁函數(shù)實現(xiàn)步驟。
5、 根據(jù)權利要求4所述的實現(xiàn)方法,其特征在于,所述緩沖區(qū)存儲步驟 還用于存儲所述樁函數(shù)執(zhí)行后的參數(shù)信息。
6、 根據(jù)權利要求5所述的實現(xiàn)方法,其特征在于,所述函數(shù)信息包括數(shù)據(jù)結構、函數(shù)參數(shù)、返回值、全局變量和函數(shù)調(diào)用關系;所述參數(shù)信息包括出參值、全局變量值和返回值。
7、 根據(jù)權利要求4所述的實現(xiàn)方法,其特征在于,所述驅(qū)動步驟進一步 包括Fl,根據(jù)參數(shù)樁函數(shù)索引,獲取樁函數(shù)名稱; F2,獲取所述樁函數(shù)的出參值、全局變量值和返回值; F3,設置被調(diào)用函數(shù)的出參值、全局變量值和返回值; F4,正確調(diào)整堆棧指針,返回控制權給調(diào)用函數(shù)。
8、 根據(jù)權利要求7所述的實現(xiàn)方法,其特征在于,所述F1之后進一步包 括Fll,調(diào)用UserStub函數(shù),執(zhí)行用戶自定義代碼。
9、 一種實現(xiàn)權利要求4、 5、 6、 7或8所述實現(xiàn)方法的測試系統(tǒng),包括一 種在單元測試中實現(xiàn)通用樁函數(shù)的裝置,其特征在于,所述裝置包括被測模塊,用于存儲被測函數(shù);提取模塊,用于對所述被測模塊存儲的被測函數(shù)進行分析,獲取所述被測 函數(shù)的函數(shù){言息;符號表模塊,用于存儲所述提取模塊獲取的所述被測函數(shù)的函數(shù)信息; 緩沖區(qū)模塊,用于存儲實現(xiàn)樁函數(shù)所需的參數(shù)信息;通用樁函數(shù)模塊,用于從所述緩沖區(qū)模塊獲取實現(xiàn)樁函數(shù)所需的參數(shù)信 息,設置對應的堆棧以及寄存器,并實現(xiàn)樁函數(shù);驅(qū)動函數(shù)模塊,用于驅(qū)動所述被測模塊中的被測函數(shù),并使所述被測函數(shù) 在調(diào)用被調(diào)用函數(shù)時跳轉(zhuǎn)到所述通用樁函數(shù)模塊。
10、 根據(jù)權利要求9所述的系統(tǒng),其特征在于,所述緩沖區(qū)模塊還用于存 儲所述樁函數(shù)執(zhí)行后的參數(shù)信息。
全文摘要
一種在單元測試中實現(xiàn)通用樁函數(shù)的裝置及其實現(xiàn)方法,該裝置包括被測模塊,用于存儲被測函數(shù);提取模塊,用于對所述被測模塊存儲的被測函數(shù)進行分析,獲取所述被測函數(shù)的函數(shù)信息;符號表模塊,用于存儲所述提取模塊獲取的所述被測函數(shù)的函數(shù)信息;緩沖區(qū)模塊,用于存儲實現(xiàn)樁函數(shù)所需的參數(shù)信息;通用樁函數(shù)模塊,用于從所述緩沖區(qū)模塊獲取實現(xiàn)樁函數(shù)所需的參數(shù)信息,設置對應的堆棧以及寄存器,并實現(xiàn)樁函數(shù);驅(qū)動函數(shù)模塊,用于驅(qū)動所述被測模塊中的被測函數(shù),并使所述被測函數(shù)在調(diào)用被調(diào)用函數(shù)時跳轉(zhuǎn)到所述通用樁函數(shù)模塊。該裝置減少了單元測試過程中樁函數(shù)的編寫工作量,而且實現(xiàn)難度小,能夠在各種操作系統(tǒng)、編譯環(huán)境下實現(xiàn)。
文檔編號G06F11/36GK101110055SQ20071012123
公開日2008年1月23日 申請日期2007年8月31日 優(yōu)先權日2007年8月31日
發(fā)明者亮 馬, 軍 馬 申請人:中興通訊股份有限公司