專利名稱:自動(dòng)化軟件調(diào)測(cè)方法及系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及軟件調(diào)測(cè)技術(shù),尤其涉及一種能夠自動(dòng)生成測(cè)試用例并通過(guò)模 擬器自動(dòng)恢復(fù)執(zhí)行現(xiàn)場(chǎng)進(jìn)行軟件調(diào)測(cè)的方法及系統(tǒng)。
背景技術(shù):
當(dāng)開(kāi)發(fā)人員需要對(duì)初步完成的軟件進(jìn)行自測(cè)的時(shí)候,往往會(huì)根據(jù)用戶使用 系統(tǒng)的步驟, 一步一步地驗(yàn)證系統(tǒng)是否按預(yù)計(jì)的方式運(yùn)行,但這種測(cè)試方式比 較繁瑣,特別對(duì)于較大的、環(huán)節(jié)步驟較多的軟件系統(tǒng)來(lái)說(shuō),要發(fā)現(xiàn)和解決一個(gè)
缺陷(BUG)往往需要模擬很多次,在時(shí)間和精力上造成很大的浪費(fèi)。
一些比較高級(jí)的自測(cè)方法可以對(duì)函數(shù)構(gòu)建測(cè)試用例,然后通過(guò)測(cè)試用例對(duì) 函數(shù)進(jìn)行單元測(cè)試,然而,這種測(cè)試方法往往會(huì)因?yàn)轭惓蓡T函數(shù)涉及了多個(gè)其 他對(duì)象的數(shù)據(jù)而導(dǎo)致構(gòu)建測(cè)試用例十分困難。例如,對(duì)于一個(gè)在函數(shù)體內(nèi)部使 用了成員變量以及依賴其他運(yùn)行對(duì)象的函數(shù)來(lái)說(shuō),在構(gòu)建該函數(shù)的測(cè)試用例時(shí), 不僅僅需要構(gòu)建輸入?yún)?shù),而且還需要對(duì)其中的成員變量、所依賴的運(yùn)行對(duì)象 進(jìn)行初始化。 一個(gè)函數(shù)涉及的變量越多,構(gòu)建起來(lái)會(huì)越復(fù)雜,需要花費(fèi)很多時(shí) 間和精力。
不僅如此,有時(shí)設(shè)計(jì)測(cè)試用例時(shí)往往會(huì)忽略一些比較隱晦的問(wèn)題,例如忽 略了某些邊界值、忽略了其他模塊的數(shù)據(jù)對(duì)當(dāng)前測(cè)試模塊的影響、忽略了某些 特珠值導(dǎo)致的問(wèn)題、忽略了網(wǎng)絡(luò)狀態(tài)不好的情況等,而當(dāng)這些問(wèn)題發(fā)生后使軟 件產(chǎn)生BUG時(shí),開(kāi)發(fā)人員卻不能即時(shí)的將產(chǎn)生BUG的現(xiàn)場(chǎng)保存下來(lái)形成一個(gè) 測(cè)試用例,用于以后對(duì)該BUG進(jìn)行測(cè)試,如果要復(fù)現(xiàn)這個(gè)BUG又非常困難, 給軟件日后的使用造成隱患。此外,當(dāng)測(cè)試用例很多的時(shí)候,測(cè)試人員對(duì)每個(gè) 測(cè)試用例手工進(jìn)行測(cè)試的效率很低,非常浪費(fèi)時(shí)間的精力。發(fā)明內(nèi)容有鑒于此,本發(fā)明的目的之一在于提供一種自動(dòng)化軟件調(diào)測(cè)方法及系統(tǒng), 以解決人工構(gòu)建測(cè)試用例、人工模擬驗(yàn)證所帶來(lái)的效率低下,自動(dòng)化程度不高 等技術(shù)問(wèn)題。為實(shí)現(xiàn)上述發(fā)明目的,本發(fā)明的主要技術(shù)方案為一種自動(dòng)化軟件調(diào)測(cè)系統(tǒng),該系統(tǒng)包括程序模塊以及如下模塊消息接口模塊,用于記錄所述程序模塊所執(zhí)行的系統(tǒng)消息及測(cè)試數(shù)據(jù),并生成測(cè)試用例;用例存儲(chǔ)單元,用于存儲(chǔ)測(cè)試用例;模擬器,用于根據(jù)測(cè)試用例模擬被調(diào)測(cè)程序模塊的運(yùn)行過(guò)程并恢復(fù)程序的 執(zhí)行現(xiàn)場(chǎng);所述消息接口模塊將獲取的所述程序模塊所執(zhí)行的系統(tǒng)消息及測(cè)試數(shù)據(jù)形 成測(cè)試用例后存儲(chǔ)于所述用例存儲(chǔ)單元,所述模擬器讀取存儲(chǔ)在所述用例存儲(chǔ) 單元中的測(cè)試用例,自動(dòng)恢復(fù)執(zhí)行現(xiàn)場(chǎng),并配合調(diào)試器對(duì)所述程序模塊進(jìn)行調(diào)基于上述方案,當(dāng)系統(tǒng)包括多個(gè)程序模塊時(shí),則所述消息接口模塊置于兩 個(gè)程序模塊之間,用于記錄驅(qū)動(dòng)所述程序模塊的系統(tǒng)消息,以及所述程序模塊 之間的交互消息,并生成測(cè)試用例存儲(chǔ)于所述用例存儲(chǔ)單元;所述模擬器讀取 存儲(chǔ)在所述用例存儲(chǔ)單元中的測(cè)試用例,可分別對(duì)所述兩個(gè)程序模塊進(jìn)行執(zhí)行 現(xiàn)場(chǎng)的恢復(fù),并配合調(diào)試器所述程序模塊進(jìn)行調(diào)測(cè)。基于上述方案,為了了解系統(tǒng)產(chǎn)生的斷言信息,所述系統(tǒng)還進(jìn)一步包括斷 言統(tǒng)計(jì)接口,用于獲取所述程序模塊產(chǎn)生的斷言的位置及個(gè)數(shù)信息。本發(fā)明針對(duì)客戶服務(wù)器結(jié)構(gòu)的軟件系統(tǒng),提出了如下技術(shù)方案所述程序模塊包括客戶端子程序模塊和服務(wù)端子程序模塊,分別位于客戶 端和服務(wù)端;所述消息接口模塊包括客戶端消息接口模塊及服務(wù)端消息接口模 塊,分別位于客戶端和服務(wù)端;所述用例存儲(chǔ)單元包括客戶端用例存儲(chǔ)單元及服務(wù)端用例存儲(chǔ)單元,分別位于客戶端和服務(wù)端;所述模擬器包括客戶端模擬
器及服務(wù)端模擬器,分別位于客戶端和服務(wù)端;
客戶端網(wǎng)絡(luò)接口模塊,用于為所述客戶端子程序模塊提供與服務(wù)端進(jìn)行網(wǎng)
絡(luò)消息交互的通訊接口;服務(wù)端網(wǎng)絡(luò)接口模塊,用于為所述服務(wù)端子子程序模 塊提供與客戶端進(jìn)行網(wǎng)絡(luò)消息交互的通訊接口 ;所述客戶端消息接口模塊連接 所述客戶端子程序模塊及所述客戶端網(wǎng)絡(luò)接口模塊,獲取與服務(wù)端的交互消息 并形成測(cè)試用例,存儲(chǔ)在客戶端用例存儲(chǔ)單元中;所述服務(wù)端消息接口模塊連 接所述服務(wù)端子程序模塊及所述服務(wù)端網(wǎng)絡(luò)接口模塊,獲取與客戶端的交互消 息并形成測(cè)試用例,存儲(chǔ)在服務(wù)端用例存儲(chǔ)單元中。
本發(fā)明的另一目的在于提供一種自動(dòng)化軟件調(diào)測(cè)方法,為實(shí)現(xiàn)該目的,本 發(fā)明釆用了如下的技術(shù)方案
一種自動(dòng)化軟件調(diào)測(cè)方法,該方法包括以下步驟
A、 記錄驅(qū)動(dòng)程序運(yùn)行的消息,并將其形成測(cè)試用例存儲(chǔ);
B、 通過(guò)調(diào)用接口啟動(dòng)待調(diào)測(cè)的程序;
C、 讀取所述測(cè)試用例,并根據(jù)用戶所選待調(diào)測(cè)消息位置通過(guò)調(diào)用接口自 動(dòng)恢復(fù)執(zhí)行現(xiàn)場(chǎng);
D、 對(duì)所述待調(diào)測(cè)程序進(jìn)行調(diào)測(cè)。
基于上述方案,若是對(duì)單程序進(jìn)行測(cè)試,則所述消息包括系統(tǒng)消息及測(cè)試 數(shù)據(jù);若是對(duì)存在消息交互的多個(gè)程序中的程序進(jìn)行測(cè)試,則所述消息包括系 統(tǒng)消息及程序之間的交互消息。
基于上述方案,步驟B和步驟C中,所述接口為組件對(duì)象模型COM接 口、或普通函數(shù)接口,所述接口由所述程序或所述程序之間附加的消息接口提 供。
基于上述方案,步驟C中所述自動(dòng)恢復(fù)執(zhí)行現(xiàn)場(chǎng)具體包括 Cl、選擇待調(diào)測(cè)消息位置;
C2、按照所述交互消息及系統(tǒng)消息產(chǎn)生的時(shí)間順序,通過(guò)模擬接口控制所 述待調(diào)測(cè)程序自動(dòng)運(yùn)行到所述待調(diào)測(cè)消息位置?;谏鲜龇桨福襟EA中還包括使用系統(tǒng)鉤子獲取所述程序產(chǎn)生斷言的 位置及個(gè)數(shù)信息。步驟C和步驟D中,還進(jìn)一步包括獲取所述待調(diào)測(cè)程序所 產(chǎn)生的斷言的位置及個(gè)數(shù)信息,在運(yùn)行完測(cè)試用例后與在步驟A中所獲得的所 述斷言的位置及個(gè)數(shù)信息進(jìn)行比對(duì),判斷對(duì)所述待調(diào)測(cè)程序的修改是否正確?;谏鲜龇桨福襟EA中,通過(guò)系統(tǒng)鉤子獲取在執(zhí)行所述程序某函數(shù)之前 的所有交互消息及系統(tǒng)消息,從而形成所述函數(shù)的測(cè)試用例。由于本發(fā)明通過(guò)接口自動(dòng)將程序模塊間的交互消息、程序模塊響應(yīng)用戶的 系統(tǒng)消息記錄下來(lái)形成測(cè)試用例,然后通過(guò)模擬器讀取測(cè)試用例,根據(jù)測(cè)試用 例中存儲(chǔ)的交互消息、系統(tǒng)消息模擬程序模塊的運(yùn)行,執(zhí)行自動(dòng)的現(xiàn)場(chǎng)恢復(fù), 從而使得開(kāi)發(fā)測(cè)試人員在對(duì)測(cè)試用例進(jìn)行重復(fù)驗(yàn)證時(shí)省去了手工的重復(fù)勞動(dòng), 提高了調(diào)測(cè)的效率。本發(fā)明通過(guò)系統(tǒng)鉤子對(duì)特定函數(shù)構(gòu)建測(cè)試用例,能夠在自動(dòng)化的基礎(chǔ)上更 精確的定位程序BUG的位置,縮小調(diào)試范圍。本發(fā)明通過(guò)系統(tǒng)鉤子在構(gòu)建測(cè) 試用例時(shí)和調(diào)測(cè)時(shí)獲取斷言的位置和數(shù)量,從而可以為調(diào)測(cè)人員提供一個(gè)簡(jiǎn)單 而直觀的判斷依據(jù)來(lái)判別對(duì)程序BUG修改的效果。
圖1A為本發(fā)明所述系統(tǒng)的第一具體實(shí)施例的系統(tǒng)結(jié)構(gòu)圖;圖1B為本發(fā)明第一具體實(shí)施例在調(diào)試狀態(tài)下的系統(tǒng)結(jié)構(gòu)圖;圖1C為本發(fā)明第一具體實(shí)施例在調(diào)測(cè)狀態(tài)下另一種系統(tǒng)結(jié)構(gòu)圖;圖2A為本發(fā)明所述系統(tǒng)的第二具體實(shí)施例的系統(tǒng)結(jié)構(gòu)圖;圖2B為本發(fā)明第二具體實(shí)施例在調(diào)試狀態(tài)下的系統(tǒng)結(jié)構(gòu)圖;圖3A為本發(fā)明所述系統(tǒng)的第三具體實(shí)施例的系統(tǒng)結(jié)構(gòu)圖;圖3B為本發(fā)明第三具體實(shí)施例分別對(duì)客戶端子程序模塊及服務(wù)端子程序模塊進(jìn)行調(diào)試時(shí)系統(tǒng)結(jié)構(gòu)圖;圖3C為本發(fā)明第三具體實(shí)施例通過(guò)服務(wù)端模擬器對(duì)客戶端子程序模塊進(jìn)行調(diào)試的系統(tǒng)結(jié)構(gòu)圖;圖4為本發(fā)明所述方法的流程圖。
具體實(shí)施方式
下面通過(guò)具體實(shí)施例和附圖對(duì)本發(fā)明做進(jìn)一步詳細(xì)說(shuō)明。圖1A為本發(fā)明所述系統(tǒng)的第一具體實(shí)施例的系統(tǒng)結(jié)構(gòu)圖。第一程序模塊 與第二程序模塊代表具有一定邏輯功能的程序模塊,第一程序模塊與第二程序 模塊在未添加實(shí)現(xiàn)自動(dòng)化調(diào)測(cè)系統(tǒng)模塊的情況下,直接通過(guò)組件對(duì)象模型(COM, Component Object Model)接口 、標(biāo)準(zhǔn)網(wǎng)絡(luò)通信協(xié)議接口等方式進(jìn)行 消息交互。為了實(shí)現(xiàn)對(duì)程序模塊的自動(dòng)化的調(diào)測(cè),本發(fā)明加入了消息接口模塊、用例 存儲(chǔ)單元、模擬器三個(gè)部分,其中消息接口模塊用于記錄所述程序模塊之間的 交互消息并生成測(cè)試用例;用例存儲(chǔ)單元,用于存儲(chǔ)測(cè)試用例數(shù)據(jù);模擬器, 用于調(diào)用所述測(cè)試用例對(duì)所述程序模塊進(jìn)行調(diào)測(cè)。在測(cè)試用例的構(gòu)建階段,不 需要模擬器的參與,但模擬器可分別對(duì)第一程序模塊與第二程序模塊進(jìn)行調(diào)測(cè)。圖IB為本發(fā)明第一具體實(shí)施例在調(diào)測(cè)狀態(tài)下的系統(tǒng)結(jié)構(gòu)圖,在調(diào)測(cè)狀態(tài)下,模擬器讀取存儲(chǔ)在用例存儲(chǔ)單元中的測(cè)試用例,并通過(guò)調(diào)用程序模塊提供的用于消息交互的COM接口或非COM的普通函數(shù)接口模擬與其它程序模塊間 的消息交互,以自動(dòng)進(jìn)行執(zhí)行現(xiàn)場(chǎng)的恢復(fù),并配合調(diào)試器對(duì)待測(cè)試程序模塊進(jìn) 行調(diào)測(cè)。圖1C為本發(fā)明第一具體實(shí)施例在調(diào)測(cè)狀態(tài)下另一種系統(tǒng)結(jié)構(gòu)圖,與 圖1B不同的是,此結(jié)構(gòu)下,模擬器直接調(diào)用消息接口模塊所提供的消息交互 接口來(lái)進(jìn)行模擬及進(jìn)行執(zhí)行現(xiàn)場(chǎng)的恢復(fù)。對(duì)于對(duì)實(shí)時(shí)性要求不高的單程序模塊,例如單機(jī)版棋牌類小游戲,來(lái)說(shuō), 沒(méi)有程序模塊間的消息交互,要實(shí)現(xiàn)自動(dòng)測(cè)試需通過(guò)消息接口模塊記錄驅(qū)動(dòng)該 程序模塊運(yùn)行的鼠標(biāo)、鍵盤(pán)等系統(tǒng)消息以及程序模擬時(shí)需要的一些測(cè)試數(shù)據(jù), 開(kāi)發(fā)人員需自己定義存儲(chǔ)測(cè)試數(shù)據(jù)的事件,消息接口模塊需提供測(cè)試數(shù)據(jù)存儲(chǔ) 接口供開(kāi)發(fā)人員在認(rèn)為需要測(cè)試的程序位置調(diào)用該接口函數(shù)以存儲(chǔ)相關(guān)測(cè)試數(shù) 據(jù)。開(kāi)發(fā)人員在程序模塊中需開(kāi)放一個(gè)公用模擬接口給模擬器。當(dāng)模擬器執(zhí)行測(cè)試用例時(shí),如果遇到存儲(chǔ)相關(guān)測(cè)試數(shù)據(jù),模擬器調(diào)用所述公用模擬接口,開(kāi) 發(fā)人員在公用模擬接口里根據(jù)存儲(chǔ)的測(cè)試數(shù)據(jù)執(zhí)行對(duì)應(yīng)的模擬操作。多程序模 塊的技術(shù)方案相對(duì)于單程序模塊技術(shù)方案而言,由于主要關(guān)注于程序模塊間的 消息交互接口,因此其實(shí)現(xiàn)復(fù)雜程度較低,實(shí)用性更強(qiáng)。圖2A為本發(fā)明所述系統(tǒng)的第二具體實(shí)施例的系統(tǒng)結(jié)構(gòu)圖,與所述系統(tǒng)的 第一具體實(shí)施例相比,其增加了斷言統(tǒng)計(jì)接口,用于捕獲所述程序模塊產(chǎn)生異 常時(shí)觸發(fā)的斷言,并獲取斷言的位置及個(gè)數(shù)信息,斷言統(tǒng)計(jì)接口可將斷言的位BUG修改的經(jīng)過(guò),也可以不存儲(chǔ),只是輸出顯示在屏幕上告知調(diào)測(cè)人員即可。圖2B為本發(fā)明所述系統(tǒng)的第二具體實(shí)施例在調(diào)試狀態(tài)下的系統(tǒng)結(jié)構(gòu)圖, 在測(cè)試用例的構(gòu)建狀態(tài)和調(diào)試狀態(tài)下分別通過(guò)斷言統(tǒng)計(jì)接口獲取被調(diào)測(cè)程序模 塊所產(chǎn)生斷言的位置及個(gè)數(shù)信息,其目的在于進(jìn)行前后比對(duì),以判斷對(duì)程序模 塊中BUG的修改的效果。圖3A為本發(fā)明所述系統(tǒng)第三具體實(shí)施例系統(tǒng)結(jié)構(gòu)圖,此具體實(shí)施例的特 點(diǎn)在于包括客戶端和服務(wù)端兩個(gè)部分,客戶端與服務(wù)端分別擁有自己的消息接 口模塊、用例存儲(chǔ)單元及模擬器,客戶端和服務(wù)端分別可包括多個(gè)實(shí)現(xiàn)不同功 能的子程序模塊,客戶端各子程序模塊通過(guò)客戶端消息接口模塊與客戶端網(wǎng)絡(luò) 接口模塊連接,客戶端網(wǎng)絡(luò)接口模塊負(fù)責(zé)所有客戶端子程序模塊與服務(wù)端之間 的消息交互;服務(wù)端各子程序模塊通過(guò)服務(wù)端消息接口模塊與服務(wù)端網(wǎng)絡(luò)接口 模塊連接,服務(wù)端網(wǎng)絡(luò)接口模塊負(fù)責(zé)所有服務(wù)端子程序模塊與客戶端之間的消 息交互,服務(wù)端各子程序模塊通過(guò)服務(wù)端網(wǎng)絡(luò)接口模塊與客戶端進(jìn)行消息交互。圖3B為分別對(duì)客戶端子程序模塊及服務(wù)端子程序模塊進(jìn)行本端調(diào)試的系 統(tǒng)結(jié)構(gòu)圖,服務(wù)端與客戶端進(jìn)行本端調(diào)測(cè)只需要從本端的用例存儲(chǔ)單元中調(diào)用 本端的測(cè)試用例即可。圖3C為進(jìn)行遠(yuǎn)端調(diào)測(cè)的系統(tǒng)結(jié)構(gòu)圖,利用服務(wù)端模擬器調(diào)用服務(wù)端的測(cè) 試用例對(duì)客戶端子程序模塊進(jìn)行調(diào)測(cè),同樣地,也可以利用客戶端模擬器調(diào)用 客戶端的測(cè)試用例來(lái)對(duì)服務(wù)端子程序進(jìn)行調(diào)測(cè)。以服務(wù)端為例,服務(wù)端模擬器可通過(guò)遠(yuǎn)程COM接口啟動(dòng)客戶端子程序模塊,在分布式環(huán)境下,當(dāng)測(cè)試用例 包含多個(gè)客戶端的交互消息時(shí),服務(wù)端模擬器還可同時(shí)啟動(dòng)多個(gè)客戶端上的多個(gè)子程序模塊。圖4為本發(fā)明所述方法的具體實(shí)施例的流程圖,以下結(jié)合附圖對(duì)本發(fā)明所 述方法的各步驟進(jìn)行詳細(xì)描述步驟A、在程序模塊運(yùn)行過(guò)程中,由消息接口模塊記錄驅(qū)動(dòng)程序運(yùn)行的消 息,并將其存儲(chǔ)形成測(cè)試用例;此步驟為測(cè)試用例的構(gòu)建步驟,為了構(gòu)造一個(gè)測(cè)試用例,需要在原有系統(tǒng) 的上附加一個(gè)或多個(gè)中間的調(diào)用接口,當(dāng)用戶在使用原有系統(tǒng)的過(guò)程中,通過(guò) 中間接口記錄程序模塊間的網(wǎng)絡(luò)消息及系統(tǒng)消息,對(duì)于單程序模塊情況下,需 記錄用于模擬的測(cè)試數(shù)據(jù)及系統(tǒng)消息,從而創(chuàng)建相應(yīng)的測(cè)試用例。例如要?jiǎng)?chuàng)建 用戶登錄和退出的測(cè)試用例,則只需要使用帶有消息接口模塊客戶端和服務(wù)端 執(zhí)行一下登錄和退出的操作,即可生成相應(yīng)的測(cè)試用例。以圖1A系統(tǒng)結(jié)構(gòu)為例,程序模塊之間通過(guò)COM接口相互通信, 一般用于通信的接口數(shù)量比較少,所以只需要在原有程序模塊的基礎(chǔ)上做少量的修改, 附加上消息接口模塊的調(diào)用即可將程序模塊之間的網(wǎng)絡(luò)消息及系統(tǒng)消息保存為 測(cè)試用例。以圖3A系統(tǒng)結(jié)構(gòu)為例,對(duì)于客戶服務(wù)器結(jié)構(gòu),測(cè)試用例的構(gòu)建主要分為 兩部分 一個(gè)是基于客戶端用例構(gòu)建;另一個(gè)是基于服務(wù)端的用例構(gòu)建。通常 客戶端子程序模塊主要是通過(guò)網(wǎng)絡(luò)消息及鼠標(biāo)、鍵盤(pán)等輸入設(shè)備產(chǎn)生的系統(tǒng)消 息驅(qū)動(dòng)的;服務(wù)端子程序模塊主要通過(guò)網(wǎng)絡(luò)消息驅(qū)動(dòng),因此,在進(jìn)行系統(tǒng)使用 的時(shí)候,可以在客戶端子程序模塊與客戶端網(wǎng)絡(luò)接口模塊之間附加的消息接口 模塊中將網(wǎng)絡(luò)消息及系統(tǒng)消息的觸發(fā)時(shí)間和觸發(fā)內(nèi)容存儲(chǔ)下來(lái),形成 一個(gè)事件 驅(qū)動(dòng)的客戶端測(cè)試用例。也可以在服務(wù)端子程序模塊與服務(wù)端網(wǎng)絡(luò)接口模塊之 間附加的消息接口模塊中將網(wǎng)絡(luò)消息存儲(chǔ)下來(lái),形成 一個(gè)服務(wù)端的測(cè)試用例。 這樣做的好處是通過(guò)保存事件的測(cè)試用例就可以保存開(kāi)發(fā)人員進(jìn)行自測(cè)時(shí)所執(zhí) 行過(guò)的所有函數(shù)的測(cè)試用例,以便以后隨時(shí)對(duì)某個(gè)函數(shù)進(jìn)行測(cè)試。更重要的是當(dāng)開(kāi)發(fā)人員在自測(cè)的時(shí)候遇到一個(gè)比較隱晦的問(wèn)題時(shí),實(shí)際上他已經(jīng)保存了這 個(gè)很難重現(xiàn)的必現(xiàn)用例,方便以后的調(diào)試和驗(yàn)證。由于服務(wù)端是與各個(gè)客戶端通訊的中心,保存服務(wù)端的網(wǎng)絡(luò)消息作為測(cè)試 用例時(shí),實(shí)際上是保存了所有客戶端的測(cè)試用例??蛻舳伺c其他客戶端通訊的 時(shí)候通常都需要經(jīng)過(guò)服務(wù)端的驗(yàn)證和處理然后通過(guò)網(wǎng)絡(luò)消息轉(zhuǎn)發(fā)給其它客戶 端,當(dāng)其它客戶端收到該網(wǎng)絡(luò)消息的時(shí)候才做相應(yīng)的處理。而服務(wù)端也只有在收到通過(guò)客戶端網(wǎng)絡(luò)接口模塊和服務(wù)端網(wǎng)絡(luò)接口模塊透明傳輸過(guò)來(lái)客戶端的網(wǎng) 絡(luò)消息后才做相應(yīng)的邏輯搡作,因此保存服務(wù)端網(wǎng)絡(luò)通信的用例可以恢復(fù)該用 例情況下所有客戶端和服務(wù)端的執(zhí)行現(xiàn)場(chǎng)。通??蛻舳俗映绦蚰K與客戶端網(wǎng)絡(luò)接口模塊之間的用于通信的COM接 口數(shù)量很少,因此只需要開(kāi)發(fā)少數(shù)中間接口就可以將客戶端子程序模塊通過(guò)客 戶端網(wǎng)絡(luò)接口模塊公布的通信接口所傳輸?shù)木W(wǎng)絡(luò)消息存儲(chǔ)下來(lái),而其它鼠標(biāo)、鍵盤(pán)的輸入設(shè)備產(chǎn)生的系統(tǒng)消息可通過(guò)另外的COM接口存儲(chǔ)。為了實(shí)現(xiàn)輸入 時(shí)間和輸入內(nèi)容相綁定,可以使用如下的數(shù)據(jù)結(jié)構(gòu)來(lái)儲(chǔ)存這些消息時(shí)間、模塊標(biāo)識(shí)、消息分類標(biāo)識(shí)符、長(zhǎng)度、內(nèi)容。其中模塊標(biāo)識(shí)用于標(biāo)識(shí)消息的發(fā)送者, 消息分類標(biāo)識(shí)符用于識(shí)別程序模塊間的消息類型以及識(shí)別系統(tǒng)消息的類型,如 鼠標(biāo)、鍵盤(pán)消息等。在服務(wù)器端,由于服務(wù)端子程序模塊與服務(wù)端網(wǎng)絡(luò)接口模 塊是通過(guò)接口進(jìn)行通訊的,而服務(wù)端子程序模塊端不需要直接與客戶端進(jìn)行消 息交互,因此基于服務(wù)端子程序模塊構(gòu)造測(cè)試用例只需要開(kāi)發(fā)相應(yīng)的接口來(lái)記 錄進(jìn)入過(guò)某個(gè)接口的網(wǎng)絡(luò)消息即可,消息記錄格式可借用客戶端的消息記錄數(shù) 據(jù)結(jié)構(gòu)進(jìn)行存儲(chǔ),只是消息分類標(biāo)識(shí)符的作用有區(qū)別,服務(wù)端的消息分類標(biāo)識(shí) 符只是用來(lái)識(shí)別服務(wù)端網(wǎng)絡(luò)接口模塊調(diào)用服務(wù)端子程序模塊的某一個(gè)接口。步驟B、由模擬器通過(guò)接口啟動(dòng)待調(diào)測(cè)的程序模塊;此步驟開(kāi)始進(jìn)入對(duì)程序模塊的調(diào)測(cè)狀態(tài),在調(diào)測(cè)開(kāi)始之前需啟動(dòng)模擬器, 由模擬器通過(guò)調(diào)用接口啟動(dòng)待調(diào)測(cè)的程序模塊。步驟C、由所述模擬器讀取所述測(cè)試用例并根據(jù)用戶所選的待調(diào)測(cè)消息位 置自動(dòng)恢復(fù)執(zhí)行現(xiàn)場(chǎng);以圖3A的系統(tǒng)結(jié)構(gòu)為例,實(shí)際上,將客戶端子程序模塊接收到的網(wǎng)絡(luò)消 息、鼠標(biāo)和鍵盤(pán)事件的觸發(fā)時(shí)間和內(nèi)容保存下來(lái),形成測(cè)試用例,這個(gè)測(cè)試用 例就已經(jīng)保存了客戶端子程序模塊運(yùn)行后所有函數(shù)的執(zhí)行現(xiàn)場(chǎng)。通過(guò)執(zhí)行測(cè)試 用例,就可以恢復(fù)每個(gè)函數(shù)的執(zhí)行現(xiàn)場(chǎng),實(shí)現(xiàn)對(duì)某個(gè)函數(shù)的調(diào)試和驗(yàn)證。由于 客戶端已經(jīng)保存了某輪測(cè)試中所有的網(wǎng)絡(luò)消息,相當(dāng)于模擬了客戶端網(wǎng)絡(luò)接口 模塊、服務(wù)端網(wǎng)絡(luò)接口模塊和服務(wù)端子程序模塊的處理。因此,僅僅使用客戶 端的測(cè)試用例就可以完成對(duì)客戶端的測(cè)試。同理,在進(jìn)行服務(wù)端子程序模塊的 測(cè)試用例時(shí),實(shí)際上已經(jīng)模擬了所有客戶端子程序模塊、客戶端網(wǎng)絡(luò)接口模塊 和服務(wù)端網(wǎng)絡(luò)接口模塊的處理。因此,僅僅使用服務(wù)端子程序模塊的測(cè)試用例 也可以單獨(dú)對(duì)服務(wù)端子程序模塊進(jìn)行測(cè)試。通常所有客戶端的網(wǎng)絡(luò)消息都通過(guò)服務(wù)端子程序模塊處理再轉(zhuǎn)發(fā),相當(dāng)于 服務(wù)端子程序模塊是所有客戶端的中心,客戶端之間的數(shù)據(jù)通訊都需要通過(guò)服 務(wù)端子程序模塊。因此,在使用服務(wù)端子程序模塊測(cè)試用例對(duì)服務(wù)端子程序模 塊進(jìn)行測(cè)試的同時(shí),也可以對(duì)客戶端進(jìn)行測(cè)試。當(dāng)保存了服務(wù)端子程序模塊的測(cè)試用例后,服務(wù)端模擬器通過(guò)COM的方 式將開(kāi)發(fā)人員所關(guān)心的一個(gè)或多個(gè)客戶端啟動(dòng)起來(lái),將測(cè)試用例記錄下來(lái)的數(shù) 據(jù)形成一個(gè)向所有客戶端或某個(gè)客戶端發(fā)送的網(wǎng)絡(luò)消息的列表,開(kāi)發(fā)人員可通 過(guò)選擇窗口隨機(jī)選擇某條網(wǎng)絡(luò)消息進(jìn)行測(cè)試。在擁有多個(gè)客戶端的情況下,開(kāi) 發(fā)人員可以先對(duì)客戶端的進(jìn)行選擇,然后開(kāi)發(fā)人員根據(jù)自己的需要選擇某個(gè)網(wǎng) 絡(luò)事件,例如,是希望對(duì)服務(wù)端子程序模塊還是對(duì)客戶端的某個(gè)消息觸發(fā)后進(jìn) 行測(cè)試,服務(wù)端模擬器會(huì)通過(guò)接口控制服務(wù)端子程序模塊自動(dòng)恢復(fù)到發(fā)生這個(gè)網(wǎng)絡(luò)消息時(shí)的現(xiàn)場(chǎng)。這時(shí),開(kāi)發(fā)人員就可以直接使用集成開(kāi)發(fā)調(diào)試環(huán)境,如vc或WinDBG等直接跟蹤和測(cè)試。自動(dòng)恢復(fù)執(zhí)行現(xiàn)場(chǎng)的步驟主要是,模擬器通過(guò)模擬接口將記錄的網(wǎng)絡(luò)消息 順序的執(zhí)行到需要調(diào)試的某個(gè)網(wǎng)絡(luò)消息或某個(gè)函數(shù)位置,這時(shí)發(fā)生某個(gè)網(wǎng)絡(luò)消 息或某個(gè)函數(shù)被調(diào)用的現(xiàn)場(chǎng)即被恢復(fù)。對(duì)于客戶端或如圖1A的簡(jiǎn)單系統(tǒng)結(jié)構(gòu) 來(lái)說(shuō)還包括系統(tǒng)消息的按時(shí)間順序的執(zhí)行。通過(guò)模擬器自動(dòng)恢復(fù)執(zhí)行現(xiàn)場(chǎng)可以大大節(jié)省開(kāi)發(fā)人員復(fù)現(xiàn)BUG的操作時(shí)間,提高調(diào)測(cè)效率。步驟D、在調(diào)試器的配合下對(duì)所述待調(diào)測(cè)程序模塊進(jìn)行調(diào)測(cè)。 為了對(duì)程序模塊中的BUG進(jìn)行調(diào)試,需使用集成開(kāi)發(fā)調(diào)試環(huán)境來(lái)配合進(jìn) 行,開(kāi)發(fā)人員可將程序模塊的源程序與其執(zhí)行程序綁定,在所述程序模塊的執(zhí) 行程序被啟動(dòng)之后,即可在集成開(kāi)發(fā)調(diào)試環(huán)境中為程序設(shè)置端點(diǎn)。以VC( Visual Studio C++)為例,在編譯的時(shí)候可生成pdb文件,然后可以用Windbg或VC 將該pdb文件關(guān)聯(lián)到該程序模塊的執(zhí)行程序上,這樣就可以在代碼中設(shè)置斷點(diǎn)。 為了進(jìn)一步縮小調(diào)試范圍,本發(fā)明還可以使用系統(tǒng)鉤子技術(shù)(APIHook) 來(lái)記錄測(cè)試用例執(zhí)行過(guò)的函數(shù)。還可以將多個(gè)測(cè)試用例中相同的函數(shù)用例提取 出來(lái),形成函數(shù)的單元測(cè)試用例。即可以通過(guò)API函數(shù)枚舉某個(gè)EXE或某個(gè) DLL的所有函數(shù),使用鉤子鉤取開(kāi)發(fā)人員關(guān)心的函數(shù),記錄當(dāng)時(shí)已執(zhí)行過(guò)的網(wǎng) 絡(luò)消息、系統(tǒng)消息,形成某個(gè)函數(shù)的測(cè)試用例。然后根據(jù)這個(gè)方法獲取該函數(shù) 的其他測(cè)試用例。當(dāng)開(kāi)發(fā)人員選擇對(duì)某個(gè)函數(shù)進(jìn)行測(cè)試的時(shí)候,該函數(shù)發(fā)生之 前的所有的絡(luò)消息、系統(tǒng)消息會(huì)被模擬器自動(dòng)觸發(fā),從而恢復(fù)了進(jìn)入該函數(shù)前 的現(xiàn)場(chǎng),使真實(shí)的環(huán)境得到模擬,最終形成了自動(dòng)化的測(cè)試用例。為了能夠?qū)υ诔绦蛐薷那昂驜UG的位置和數(shù)量進(jìn)行比對(duì),從而直觀的獲 得修改效果,本發(fā)明還使用API Hook的技術(shù),在測(cè)試用例的構(gòu)建狀態(tài)和調(diào)測(cè)狀 態(tài)下捕獲軟件系統(tǒng)運(yùn)行時(shí)產(chǎn)生的斷言。還可以作為以后對(duì)軟件系統(tǒng)是否正常運(yùn) 行的驗(yàn)證用例。本系統(tǒng)主要統(tǒng)計(jì)了某個(gè)測(cè)試用例斷言的個(gè)數(shù)和斷言發(fā)生在程序 的位置,在開(kāi)發(fā)人對(duì)系統(tǒng)進(jìn)行自測(cè)的時(shí)候,本系統(tǒng)就收集了系統(tǒng)發(fā)生斷言的數(shù) 據(jù),并將其附加在測(cè)試用例里,當(dāng)開(kāi)發(fā)人員根據(jù)這些修改好BUG以后,就可 以再運(yùn)行一次已經(jīng)記錄好的測(cè)試用例來(lái)檢查斷言還有沒(méi)有發(fā)生。甚至,當(dāng)開(kāi)發(fā) 人員對(duì)系統(tǒng)做了某些方面的修改后,可能會(huì)產(chǎn)生新的錯(cuò)誤,導(dǎo)致原有的測(cè)試用 例發(fā)生斷言,這時(shí),只需要重新運(yùn)行一次所有的測(cè)試用例就可以判斷當(dāng)前的修 改有沒(méi)有生成新的問(wèn)題。以上所述,僅為本發(fā)明較佳的具體實(shí)施方式
,但本發(fā)明的保護(hù)范圍并不局 限于此,任何熟悉該技術(shù)的人在本發(fā)明所揭露的技術(shù)范圍內(nèi),可輕易想到的變化或替換,都應(yīng)涵蓋在本發(fā)明的保護(hù)范圍之內(nèi),
權(quán)利要求
1、一種自動(dòng)化軟件調(diào)測(cè)系統(tǒng),包括程序模塊,其特征在于,該系統(tǒng)還包括消息接口模塊,用于記錄所述程序模塊所執(zhí)行的系統(tǒng)消息及測(cè)試數(shù)據(jù),并生成測(cè)試用例;用例存儲(chǔ)單元,用于存儲(chǔ)測(cè)試用例;模擬器,用于根據(jù)測(cè)試用例模擬被調(diào)測(cè)程序模塊的運(yùn)行過(guò)程并恢復(fù)程序的執(zhí)行現(xiàn)場(chǎng);所述消息接口模塊將獲取的所述程序模塊所執(zhí)行的系統(tǒng)消息及測(cè)試數(shù)據(jù)形成測(cè)試用例后存儲(chǔ)于所述用例存儲(chǔ)單元,所述模擬器讀取存儲(chǔ)在所述用例存儲(chǔ)單元中的測(cè)試用例,自動(dòng)恢復(fù)執(zhí)行現(xiàn)場(chǎng),并配合調(diào)試器對(duì)所述程序模塊進(jìn)行調(diào)測(cè)。
2、 根據(jù)權(quán)利要求l所述的系統(tǒng),其特征在于,包括多個(gè)程序模塊,所述消 息接口模塊位于兩個(gè)程序模塊之間,用于記錄驅(qū)動(dòng)所述程序模塊的系統(tǒng)消息, 以及所述程序模塊之間的交互消息,并生成測(cè)試用例存儲(chǔ)于所述用例存儲(chǔ)單元; 所述模擬器讀取存儲(chǔ)在所述用例存儲(chǔ)單元中的測(cè)試用例,可分別對(duì)所述兩個(gè)程 序模塊進(jìn)行執(zhí)行現(xiàn)場(chǎng)的恢復(fù),并配合調(diào)試器所述程序模塊進(jìn)行調(diào)測(cè)。
3、 根據(jù)權(quán)利要求2所述的系統(tǒng),其特征在于,所述系統(tǒng)還進(jìn)一步包括斷言 統(tǒng)計(jì)接口,用于獲取所述程序模塊產(chǎn)生的斷言的位置及個(gè)數(shù)信息。
4、 根據(jù)權(quán)利要求3所述系統(tǒng),其特征在于,所述系統(tǒng)釆用客戶服務(wù)器結(jié)構(gòu),所述程序模塊包括客戶端子程序模塊和服務(wù)端子程序模塊,分別位于客戶端和服務(wù)端;所述消息接口模塊包括客戶端消息接口模塊及服務(wù)端消息接口模塊,分別 位于客戶端和服務(wù)端;所述用例存儲(chǔ)單元包括客戶端用例存儲(chǔ)單元及服務(wù)端用例存儲(chǔ)單元,分別 位于客戶端和服務(wù)端;所述模擬器包括客戶端模擬器及服務(wù)端模擬器,分別位于客戶端和服務(wù)端;該系統(tǒng)還包括客戶端網(wǎng)絡(luò)接口模塊,用于為所述客戶端子程序模塊提供與服務(wù)端進(jìn)行網(wǎng) 絡(luò)消息交互的通訊接口;服務(wù)端網(wǎng)絡(luò)接口模塊,用于為所述服務(wù)端子子程序模塊提供與客戶端進(jìn)行 網(wǎng)絡(luò)消息交互的通訊接口;所述客戶端消息接口模塊連接所述客戶端子程序模塊及所述客戶端網(wǎng)絡(luò)接 口模塊,獲取與服務(wù)端的交互消息并形成測(cè)試用例,存儲(chǔ)在客戶端用例存儲(chǔ)單 元中;所述服務(wù)端消息接口模塊連接所述服務(wù)端子程序模塊及所述服務(wù)端網(wǎng)絡(luò) 接口模塊,獲取與客戶端的交互消息并形成測(cè)試用例,存儲(chǔ)在服務(wù)端用例存儲(chǔ) 單元中。
5、 一種自動(dòng)化軟件調(diào)測(cè)方法,其特征在于,該方法包括以下步驟A、 記錄驅(qū)動(dòng)程序運(yùn)行的消息,并將其形成測(cè)試用例存儲(chǔ);B、 通過(guò)調(diào)用接口啟動(dòng)待調(diào)測(cè)的程序;C、 讀取所述測(cè)試用例,并根據(jù)用戶所選待調(diào)測(cè)消息位置通過(guò)調(diào)用接口自 動(dòng)恢復(fù)執(zhí)行現(xiàn)場(chǎng);D、 對(duì)所述待調(diào)測(cè)程序進(jìn)行調(diào)測(cè)。
6、 根據(jù)權(quán)利要求5所述的方法,其特征在于,步驟A中,若是對(duì)單程序 進(jìn)行測(cè)試,則所述消息包括系統(tǒng)消息及測(cè)試數(shù)據(jù)。
7、 根據(jù)權(quán)利要求5所述的方法,其特征在于,步驟A中,若是對(duì)存在消 息交互的多個(gè)程序中的程序進(jìn)行測(cè)試,則所述消息包括系統(tǒng)消息及程序之間的 交互消息。
8、 根據(jù)權(quán)利要求5所述的方法,其特征在于,步驟B和步驟C中,所述 接口為組件對(duì)象模型COM接口、或普通函數(shù)接口,所述接口由所述程序或 所述程序之間附加的消息接口提供。
9、 根據(jù)權(quán)利要求7所述的方法,其特征在于,步驟C中所述自動(dòng)恢復(fù)執(zhí) 行現(xiàn)場(chǎng)具體包括Cl、選擇待調(diào)測(cè)消息位置;C2、按照所述交互消息及系統(tǒng)消息產(chǎn)生的時(shí)間順序,通過(guò)模擬接口控制所 述待調(diào)測(cè)程序自動(dòng)運(yùn)行到所述待調(diào)測(cè)消息位置。
10、 根據(jù)權(quán)利要求5所述的方法,其特征在于,步驟A中還包括使用系統(tǒng)鉤子獲取所述程序產(chǎn)生斷言的位置及個(gè)數(shù)信息。
11、 根據(jù)權(quán)利要求IO所述的方法,其特征在于,步驟C和步驟D中,還進(jìn)一步包括獲取所述待調(diào)測(cè)程序所產(chǎn)生的斷言的位置及個(gè)數(shù)信息,在運(yùn)行完 測(cè)試用例后與在步驟A中所獲得的所述斷言的位置及個(gè)數(shù)信息進(jìn)行比對(duì),判斷對(duì)所述待調(diào)測(cè)程序的修改是否正確。
12、 根據(jù)權(quán)利要求7所述的方法,其特征在于,步驟A中,所述測(cè)試用例為函數(shù)的測(cè)試用例,通過(guò)系統(tǒng)鉤子獲取在執(zhí)行所述程序某函數(shù)之前的所有交互 消息及系統(tǒng)消息,形成所述函數(shù)的測(cè)試用例。
全文摘要
本發(fā)明涉及一種自動(dòng)化軟件調(diào)測(cè)的方法和系統(tǒng),尤其涉及一種能夠自動(dòng)生成測(cè)試用例并通過(guò)模擬器進(jìn)行軟件調(diào)測(cè)的方法和系統(tǒng),本發(fā)明通過(guò)在進(jìn)行消息交互的程序模塊之間附加消息記錄接口記錄交互消息及系統(tǒng)消息,從而在程序運(yùn)行過(guò)程中自動(dòng)化形成測(cè)試用例,并通過(guò)模擬器讀取并執(zhí)行所存儲(chǔ)的測(cè)試用例以進(jìn)行自動(dòng)化的現(xiàn)場(chǎng)恢復(fù),從而很大程度上提高了程序調(diào)測(cè)的效率。
文檔編號(hào)G06F11/36GK101295280SQ20081011519
公開(kāi)日2008年10月29日 申請(qǐng)日期2008年6月18日 優(yōu)先權(quán)日2008年6月18日
發(fā)明者陳亮鋒 申請(qǐng)人:騰訊科技(深圳)有限公司