袁博文,張 威,皇甫睿帥,袁 聰
(1.陸軍裝甲兵學(xué)院 信息通信系,北京 100072;2.湖南省軍區(qū) 數(shù)據(jù)信息室,長沙 410000;3.中國人民解放軍95852部隊,海南 東方 572600)
軟件系統(tǒng)在社會各個領(lǐng)域的作用日益重要,人們對軟件系統(tǒng)的要求也日益增高,軟件質(zhì)量首當(dāng)其沖。盡管存在代碼審查、形式化驗證等輔助手段,但軟件測試依然是目前最主要的軟件質(zhì)量保障手段[1]。而軟件測試方法與測試數(shù)據(jù)是軟件測試過程中重要組成部分。為了提高測試工作效率,選擇合適的方法顯得十分重要。單錦輝等[2]提出一種由故障檢測、故障定位、故障排除、交付等組成的集成化的軟件故障診斷過程框架。同時,將智能算法運用到測試用例自動生成上已經(jīng)有了一些研究。劉龍霞等[3-4]將分類樹,貪心算法,遺傳-蟻群混合算法等運用到了測試數(shù)據(jù)自動生成中。
Windows Hook (即Windows鉤子)是Win32系統(tǒng)中用于監(jiān)視、截獲或重定向發(fā)往目標(biāo)窗口消息的特殊接口[5],該接口常常用于軟件錄制回放。Windows 系統(tǒng)的異常處理機制除了能夠幫助軟件開發(fā)人員發(fā)現(xiàn)和解決軟件中的錯誤外,被廣泛應(yīng)用于軟件保護技術(shù)、軟件漏洞利用等方面[6]。在經(jīng)過用戶同意的前提條件下,利用Hook接口記錄用戶軟件應(yīng)用數(shù)據(jù),同時利用Windows系統(tǒng)結(jié)構(gòu)化異常處理機制對軟件進行故障識別。并且生成相對應(yīng)的測試用例以實現(xiàn)相應(yīng)的故障重現(xiàn)。有針對性的測試用例能為軟件發(fā)布后期測試與維護提供有效的幫助,降低測試成本。所以,對于軟件運行過程中應(yīng)用數(shù)據(jù)的監(jiān)測處理研究具有相當(dāng)重要的現(xiàn)實意義。
本系統(tǒng)主要分為兩個功能模塊實現(xiàn):用戶操作監(jiān)測模塊;軟件故障識別模塊。系統(tǒng)功能框圖如圖1所示。用戶操作監(jiān)測模塊和軟件故障識別模塊分別監(jiān)測用戶操作和待測軟件狀態(tài),并將結(jié)果和軟件故障時錯誤報告一起記錄下來。根據(jù)記錄的結(jié)果生成測試用例。
圖1 系統(tǒng)功能框圖
該模塊主要功能為記錄用戶對被監(jiān)測軟件的操作。軟件測試人員在對軟件進行黑盒測試時,往往采用大量測試用例對軟件進行測試,以達到更高的測試覆蓋率,因此測試用例的設(shè)計成為了提高測試效率關(guān)鍵點。Windows本身是事件驅(qū)動的,而消息就是為了描述事件特征而產(chǎn)生的格式化信息。消息產(chǎn)生后被追加到消息隊列中,并被分發(fā)到對應(yīng)的應(yīng)用程序窗口進行處理。如果能將在應(yīng)用程序窗口處理消息之前,先截獲有用的消息,從中取出需要的數(shù)據(jù),便能實現(xiàn)對待測軟件進行用戶操作監(jiān)測。同時,為了不影響待測軟件的自身正常運行,將需要的數(shù)據(jù)從消息取出后,應(yīng)將消息完整的傳遞給原目標(biāo)窗口。
基于本模塊需求,選擇利用Windows系統(tǒng)提供Hook消息處理機制實現(xiàn)。Hook根據(jù)處理消息分為許多種類,同時又分為全局與局部。全局 Hook可以監(jiān)視系統(tǒng)范圍的消息,而局部 Hook只能監(jiān)視本程序的消息。本模塊在實現(xiàn)過程中用到的Hook包括WH_CALLWNDPROC、WH_KEYBOARD、WH_MSGFILTER,其類型與作用如表1所示。
本模塊預(yù)先將鉤子程序封裝在動態(tài)鏈接庫文件中,并預(yù)留待測軟件進程號接口。為實現(xiàn)目標(biāo)軟件監(jiān)測,本模塊設(shè)計在進行監(jiān)測之前提供系統(tǒng)運行所有進程名與其對應(yīng)的進程號于列表框中,用于監(jiān)測軟件的選定。當(dāng)選擇需要監(jiān)測的軟件之后,本模塊調(diào)用鉤子函數(shù),將鉤子注入到目標(biāo)軟件中。由于用戶對于軟件有效操作主要包括菜單操作,對話框操作,字符串輸入操作等,結(jié)合Hook機制特點,本模塊識別并記錄的信息有:被點擊菜單名(包括多級菜單);菜單項關(guān)閉;對話框中被點擊的按鍵名;對話框中文本框內(nèi)容變化;對話框中文本輸入。
表1 用戶操作監(jiān)測模塊使用的Hook
將用戶操作依次按照上述方式記錄,生成用戶操作序列。因此用戶操作的再實現(xiàn)將變得十分簡單,也為軟件后期測試與升級提供了測試用例的來源。本模塊流程框圖如圖2。
圖2 用戶操作監(jiān)測模塊流程框圖
該模塊主要功能為識別待監(jiān)測軟件故障。本模塊是基于Windows系統(tǒng)結(jié)構(gòu)化異常處理機制(Structure Exception Handler,SEH)。當(dāng)異常發(fā)生時,軟件會向系統(tǒng)拋出異常,請求系統(tǒng)對異常進行處理。而Windows系統(tǒng)允許嵌套式異常處理機制的存在,即當(dāng)異常發(fā)生時,操作系統(tǒng)的異常分發(fā)函數(shù)在進行處理后,如果異常沒有被處理就會遍歷異常處理鏈,直到異常被處理,如果仍沒有注冊函數(shù)處理異常,則將異常交缺省處理函數(shù)或者直接結(jié)束產(chǎn)生異常的進程[6]?;诖?,本模塊設(shè)計一個異常處理函數(shù)與鉤子程序一起封裝成動態(tài)鏈接庫。當(dāng)待監(jiān)測軟件發(fā)生異常時會調(diào)用異常處理函數(shù),而此時堆棧中為 EXCEPTION_REGISTRATION結(jié)構(gòu)體將會保存本次異常的錯誤信息。本模塊通過記錄錯誤信息實現(xiàn)故障的識別,錯誤信息中部分異常代碼含義如表2所示。
表2 錯誤信息中部分異常代碼含義
同時Windows系統(tǒng)自身會將軟件異常信息記錄并發(fā)送到微軟公司服務(wù)器,但系統(tǒng)用戶只能通過錯誤報告窗口查看部分錯誤信息。為了能更加深入的了解故障信息,更好的幫助解決錯誤,通過自編軟件記錄顯然是更好的選擇。設(shè)計一個簡單程序窗口,該窗口能通過用戶輸入一元二次方程等式,自動計算出等式解。當(dāng)該軟件發(fā)生故障時,可通過錯誤報告窗口查看相關(guān)錯誤信息,如圖3所示。
圖3 軟件問題報告窗口
當(dāng)用戶運行目標(biāo)程序的同時運行監(jiān)測程序,即可開始實現(xiàn)軟件應(yīng)用數(shù)據(jù)的提取。具體步驟如下:
步驟1:監(jiān)測軟件開始運行,選擇需要監(jiān)測的進程名或者進程號;
步驟2:創(chuàng)建記錄文件;
步驟3:將鉤子程序與異常處理程序掛入系統(tǒng),監(jiān)測目標(biāo)軟件;
步驟4:當(dāng)目標(biāo)軟件正常運行時記錄目標(biāo)軟件操作信息,當(dāng)目標(biāo)軟件發(fā)生異常時記錄異常信息;
步驟5:重復(fù)步驟4,直到目標(biāo)進程終止;
步驟6:重復(fù)步驟1,直到監(jiān)測軟件關(guān)閉。監(jiān)測程序流程框圖如圖4。
圖4 監(jiān)測程序流程框圖
軟件運行過程中的數(shù)據(jù)與不正常停止后產(chǎn)生的錯誤報告對于軟件后期維護與升級具有重要的作用。在Windows系統(tǒng)的運行過程中,某個程序出現(xiàn)非法操作或錯誤提示是每個用戶都會遇到的情況。而此時,Windows會啟動錯誤報告機制(Windows Error Reporting,簡稱WER),詢問用戶是否發(fā)送錯誤信息到微軟公司,同時程序?qū)⑼V惯\行。
當(dāng)程序出現(xiàn)非法操作或者錯誤提示時,程序會向系統(tǒng)拋出異常消息。監(jiān)測系統(tǒng)通過捕獲軟件拋出的異常消息,判定軟件出現(xiàn)異常。而后監(jiān)控系統(tǒng)會調(diào)用EXCEPTION_RECORD結(jié)構(gòu)中ExceptionInformation成員進行二次識別。由于Windows錯誤報告機制為當(dāng)錯誤發(fā)生之后會立即產(chǎn)生許多有效的數(shù)據(jù)報告并將報告上傳至后臺服務(wù)器,而后將大部分?jǐn)?shù)據(jù)報告刪除,所以為了獲得盡量多的數(shù)據(jù),當(dāng)系統(tǒng)發(fā)生故障時,應(yīng)盡快將錯誤報告?zhèn)浞?。基于此,?dāng)識別出目標(biāo)軟件發(fā)生故障之后,監(jiān)測系統(tǒng)應(yīng)立即軟件錯誤報告中的信息提取備份,作為后期分析數(shù)據(jù)。
用戶在對平臺進行操作時會產(chǎn)生大量操作數(shù)據(jù),而與被監(jiān)測軟件相關(guān)的操作往往都是在同一窗口下的。軟件測試人員在獲取測試數(shù)據(jù)后,結(jié)合錯誤報告與操作記錄,經(jīng)過數(shù)次反向?qū)嶒灡隳艽_定用戶操作中的有效部分,進而生成能夠重現(xiàn)相應(yīng)軟件故障的測試用例。
本文中提出一種基于用戶應(yīng)用數(shù)據(jù)記錄與分析的錯誤還原方法,主要是利用用戶應(yīng)用數(shù)據(jù),實現(xiàn)錯誤再還原。設(shè)計一個具有代表性的待測試軟件,軟件窗口頁面如圖5(a)所示。該軟件擁有基本菜單功能,在此基礎(chǔ)上增加“對話框”菜單項。點擊“對話框”項后出現(xiàn)圖5(b)頁面。其中圖5(b)的功能:
圖5 待測軟件窗口
1)在“Number1”與“Number2”中分別輸入兩個數(shù),點擊“divide”鍵后,“Number3”出現(xiàn)兩數(shù)相除的結(jié)果。此功能設(shè)計時應(yīng)考慮除數(shù)不能為“0”,在計算結(jié)果之前應(yīng)先判定除數(shù)是否為“0”。此處不做判斷,檢驗監(jiān)測軟件監(jiān)測結(jié)果;
2)“error”鍵:此處設(shè)計另一個錯誤,點擊“error”鍵后,軟件會對空指針賦值;
3)“Cancel”鍵:關(guān)閉此對話框;
4)“收縮/擴展”鍵:關(guān)閉/打開對話框下方展示部分。
監(jiān)測軟件窗口頁面如圖6所示。其圖中各部分功能:
1)目標(biāo)軟件選擇框:此框為下拉選擇框,監(jiān)測軟件運行之后先訪問系統(tǒng),將系統(tǒng)中所有的進程列至框內(nèi),供選擇;
2)“確定”鍵:選定目標(biāo)進程后,點擊該鍵,監(jiān)測軟件對指定進程進行監(jiān)測;
3)“完成”鍵:監(jiān)測工作完成,關(guān)閉軟件;
4)“取消”鍵:取消監(jiān)測,關(guān)閉軟件。
圖6 監(jiān)測軟件窗口
先運行待監(jiān)測軟件,而后在監(jiān)測軟件上對目標(biāo)進程注入消息鉤子,開始記錄實驗數(shù)據(jù)。得到的操作記錄如圖7所示。
圖7 操作記錄
由實驗記錄的數(shù)據(jù)可知,目標(biāo)軟件產(chǎn)生了大量操作,包括文件新建,文件打開,以及“對話”菜單生成對話框中相關(guān)功能。其中,操作過程中產(chǎn)生了兩個錯誤,相關(guān)錯誤代碼為“C0000094”,“C0000005”。通過查詢微軟公司發(fā)布的Microsoft Docs開發(fā)技術(shù)文檔可知,相關(guān)代碼含義分別為“線程試圖將整數(shù)值除以零的整數(shù)除數(shù)”,“該線程試圖讀取或?qū)懭肫錄]有適當(dāng)訪問權(quán)限的虛擬地址”。結(jié)果與實驗設(shè)計相吻合,生成相關(guān)的測試用例如表3所示。
目前有很多自動化回歸測試工具,例如QTP、WinRunner、QARun、VisualTest等。這類工具一般采用捕獲/回放的模式,記錄用戶操作的流程,保存下來作為備選測試用例,通過應(yīng)用程序?qū)α鞒棠_本的自動執(zhí)行來驗證被測系統(tǒng)的響應(yīng)是否正確。以Quick Test Professional(簡稱QTP)為例,Micro Focus公司的QTP工具是一種自動測試工具,用于執(zhí)行重復(fù)的自動化測試。通過自動錄制、檢測和回放用戶的應(yīng)用操作,QTP工具能夠有效地幫助測試人員對復(fù)雜的企業(yè)級應(yīng)用的不同發(fā)布版進行測試。
為了更加詳盡的對比QTP與監(jiān)測軟件,設(shè)計QTP軟件對上述待測軟件進行監(jiān)測,并且對待測軟件進行與第3.2節(jié)中相同操作,得到QTP記錄的實驗監(jiān)測結(jié)果如圖8所示。
表3 軟件“divide”功能測試用例
圖8 QTP實驗監(jiān)測結(jié)果
根據(jù)對比可以發(fā)現(xiàn),QTP軟件能夠較為詳細的記錄目標(biāo)軟件操作過程并且生成相應(yīng)的測試用例。而本文中設(shè)計的監(jiān)測軟件同樣能夠詳細的記錄并生成測試用例,除此之外,監(jiān)測軟件會記錄下待測軟件不正常終止情況,并識別出相應(yīng)的故障類型。顯然,運用本方法對待測軟件進行監(jiān)測與故障識別更加有助于軟件測試工作的進行。本文設(shè)計的監(jiān)測軟件與QTP的測試情況如表4所示。
相對已有的測試工具,本文中提出的監(jiān)測軟件仍然存在一定不足。其中包括:軟件測試用例的生成尚未實現(xiàn)自動化與精簡,最簡化的測試用例仍需要依靠測試人員根本軟件報告多次測試生成;軟件錯誤定位還不夠精細,只能通過錯誤代碼與操作記錄綜合分析確定大概位置。
表4 監(jiān)測軟件與QTP的測試情況
本文提出一種軟件運行監(jiān)測與故障識別方法,通過監(jiān)測程序監(jiān)視用戶的操作和程序狀態(tài),結(jié)合Windows錯誤報告和監(jiān)測記錄對軟件動態(tài)故障進行識別和測試用例生成。通過實例證明,當(dāng)程序出現(xiàn)故障時,合理借用Windows系統(tǒng)錯誤報告機制能夠有效地對軟件故障進行識別,并且結(jié)合用戶操作記錄,生成了能夠讓軟件故障重現(xiàn)的測試用例,為軟件發(fā)布之后的維護與升級提供了巨大幫助。
軟件運行過程中的數(shù)據(jù)報告除了可以用于故障識別之外,還可以用于具體錯誤的分析預(yù)定位與軟件可靠度分析。將軟件監(jiān)測實現(xiàn)底層化,獲取更多的程序運行數(shù)據(jù),軟件測試工作會更加深入。