本發(fā)明涉及軟件測(cè)試技術(shù)領(lǐng)域,特別是一種黑盒回歸測(cè)試方法。
背景技術(shù):
軟件功能是軟件價(jià)值的重要體現(xiàn),軟件功能變更是軟件開發(fā)過(guò)程中一項(xiàng)難以避免且經(jīng)常發(fā)生的行為,對(duì)于每一次功能變更,都需要通過(guò)回歸測(cè)試驗(yàn)證其正確性。特別是對(duì)于gui類應(yīng)用軟件,這類軟件采用人機(jī)交互方式,為用戶提供了一種快捷、簡(jiǎn)便的軟件操作方式,gui類軟件在給用戶帶來(lái)直觀、簡(jiǎn)便、快捷的同時(shí),其本身所具有的輸入/輸出圖形化、事件驅(qū)動(dòng)、事件觸發(fā)隨機(jī)性、多任務(wù)以及消息傳遞等特性,使軟件功能測(cè)試以及回歸測(cè)試工作面臨許多新的挑戰(zhàn)。
挑戰(zhàn)1:如何獲取軟件所具有的功能
gui類軟件包含大量的界面,每一個(gè)界面中又包含很多菜單和按鈕,由此構(gòu)成不同的軟件功能。對(duì)于gui類軟件而言,每一個(gè)功能路徑對(duì)應(yīng)著一個(gè)軟件功能,在測(cè)試過(guò)程中,至少要覆蓋這些功能路徑。然而,由于軟件功能路徑繁多,僅憑手工方式難以確定被測(cè)軟件所具有的全部功能,因此也就無(wú)法對(duì)軟件功能進(jìn)行全面、有效的測(cè)試。
挑戰(zhàn)2:軟件功能變更及其影響域難以確定
目前,大多數(shù)gui類軟件是采用快速原型方法開發(fā)的,軟件版本變更頻繁,在軟件生存周期內(nèi),需要進(jìn)行多次回歸測(cè)試,由于gui類軟件功能復(fù)雜,難以用人工方式識(shí)別軟件功能變更以及功能變更對(duì)軟件其他功能帶來(lái)的影響,測(cè)試人員只能憑借經(jīng)驗(yàn)對(duì)軟件進(jìn)行回歸測(cè)試,這樣,難免造成回歸測(cè)試的重復(fù)、冗余和遺漏,影響回歸測(cè)試的質(zhì)量和效率。
挑戰(zhàn)3:如何獲知測(cè)試覆蓋情況
gui類軟件采用事件驅(qū)動(dòng)方式執(zhí)行,用戶通過(guò)與控件的交互來(lái)觸發(fā)相應(yīng)的事件進(jìn)而與內(nèi)部代碼及業(yè)務(wù)邏輯發(fā)生交互,因此,傳統(tǒng)測(cè)試中的諸如分支覆蓋、語(yǔ)句覆蓋等經(jīng)典的覆蓋準(zhǔn)則很難適用于gui類軟件測(cè)試中,無(wú)法有效指導(dǎo)測(cè)試。另一方面,gui類軟件功能是通過(guò)界面體現(xiàn)的,用戶通過(guò)點(diǎn)擊界面元素實(shí)現(xiàn)軟件功能,因此,如何通過(guò)功能覆蓋來(lái)衡量測(cè)試充分性是測(cè)試人員面臨的另一大難題。
挑戰(zhàn)4:如何約簡(jiǎn)測(cè)試用例
在軟件測(cè)試過(guò)程中,測(cè)試人員需要設(shè)計(jì)大量的測(cè)試用例,從功能覆蓋的角度而言,這些測(cè)試用例難免存在重復(fù)和冗余,即不同測(cè)試用例所覆蓋的功能相同,對(duì)于這些測(cè)試用例,需要進(jìn)行約簡(jiǎn),以減少測(cè)試用例執(zhí)行和維護(hù)成本。
挑戰(zhàn)5:如何篩選回歸測(cè)試用例
在前一輪的測(cè)試過(guò)程中,測(cè)試人員設(shè)計(jì)了大量的測(cè)試用例,在回歸測(cè)試階段,測(cè)試人員需要根據(jù)軟件功能變更及其影響情況,從已有測(cè)試用例集中篩選出回歸測(cè)試用例,由于缺乏有效的方法,測(cè)試人員難以從大量測(cè)試用例中篩選出符合要求的回歸測(cè)試用例。
近年來(lái),軟件的功能越來(lái)越豐富,復(fù)雜度也越來(lái)越高。隨之,軟件系統(tǒng)功能測(cè)試的測(cè)試用例數(shù)成倍增長(zhǎng),執(zhí)行一次全集回歸測(cè)試的時(shí)間大幅度增加,已經(jīng)成為影響產(chǎn)品快速發(fā)布的重要因素之一。尤其在升級(jí)維護(hù)項(xiàng)目中,需求一般來(lái)源于客戶,具有需求變化快、時(shí)間要求緊、絕大部分代碼屬于繼承等特點(diǎn),原有的窮舉所有測(cè)試用例的測(cè)試策略存在的周期長(zhǎng)、效率低的問題愈加凸顯。憑經(jīng)驗(yàn)選擇部分子集進(jìn)行回歸測(cè)試,雖然可以大幅度的減少測(cè)試時(shí)間,但是測(cè)試質(zhì)量無(wú)法保證,存在很大的漏測(cè)、重復(fù)測(cè)風(fēng)險(xiǎn)。
回歸測(cè)試優(yōu)化技術(shù)的重點(diǎn)是如何選擇有效的回歸測(cè)試集來(lái)保證測(cè)試有效性并提高測(cè)試效率。如何平衡成本與風(fēng)險(xiǎn),業(yè)內(nèi)進(jìn)行了眾多優(yōu)化技術(shù)研究,大部分都集中在對(duì)每一個(gè)測(cè)試需求對(duì)應(yīng)的多個(gè)測(cè)試用例約簡(jiǎn)技術(shù)上,例如粒子群優(yōu)化算法、啟發(fā)式算法、遺傳算法、基于數(shù)據(jù)依賴及控制依賴的用例選擇方法等,對(duì)測(cè)試范圍優(yōu)化技術(shù)鮮有涉及。
但上述測(cè)試方法及裝置存在兩點(diǎn)問題:一是,對(duì)系統(tǒng)測(cè)試者的能力要求很高,或者需要掌握用戶的使用場(chǎng)景,或者需要對(duì)被測(cè)軟件的設(shè)計(jì)非常了解,清楚了解每個(gè)測(cè)試用例在代碼中的執(zhí)行路徑,這是大多數(shù)系統(tǒng)測(cè)試人員都無(wú)法掌握的。二是,對(duì)測(cè)試環(huán)境和測(cè)試資源的要求較高,尤其是嵌入式系統(tǒng),測(cè)試資源緊張、測(cè)試手段匱乏,很難實(shí)施。
中國(guó)發(fā)明專利申請(qǐng)cn106354631a公開了一種快速軟件系統(tǒng)回歸測(cè)試的方法,包括:根據(jù)代碼差異以及使用關(guān)系,獲得全部變化影響的用戶接口全集,確定系統(tǒng)回歸測(cè)試黑盒測(cè)試用例范圍;根據(jù)變化單元的復(fù)雜度及用戶接口使用變化單元的情況,計(jì)算用戶接口的優(yōu)先級(jí),確定黑盒測(cè)試用例的執(zhí)行順序;依據(jù)上述測(cè)試范圍和優(yōu)先級(jí)順序?qū)嵤y(cè)試。
目前,在回歸測(cè)試領(lǐng)域,有代表性的黑盒回歸測(cè)試工具是mercuryinteractive公司的winrunner和ibmhpquicktestprofessional(qtp)。這些工具采用捕獲/回放技術(shù),通過(guò)捕獲測(cè)試人員的操作,生成測(cè)試腳本。在回歸測(cè)試時(shí),通過(guò)回放測(cè)試腳本程序,對(duì)修改后的軟件進(jìn)行測(cè)試。這種方法采用的是重新運(yùn)行所有測(cè)試用例的策略,不能針對(duì)軟件的修改情況選擇回歸測(cè)試用例,難免執(zhí)行不必要的測(cè)試用例,并且,在回放測(cè)試腳本時(shí),由于軟件版本的變更,經(jīng)常導(dǎo)致腳本程序中斷,測(cè)試人員需要花費(fèi)大量的時(shí)間調(diào)試測(cè)試腳本,從而,大大降低了測(cè)試效率,因此,盡管這些工具有很獨(dú)特的理念,但實(shí)際使用效果不佳。此外,這類工具不具備功能變更標(biāo)識(shí)、功能變更影響分析、測(cè)試用例優(yōu)化以及回歸測(cè)試用例優(yōu)選等功能,不能滿足回歸測(cè)試需要。
另外一個(gè)在回歸測(cè)試領(lǐng)域研究較多的是基于代碼的回歸測(cè)試,這類方法主要是通過(guò)分析代碼,找出受代碼改動(dòng)影響的代碼部分,這部分代碼是回歸測(cè)試時(shí)需要重新測(cè)試的代碼。這類方法只適合于白盒測(cè)試,由于軟件代碼與軟件功能不存在直接的一一對(duì)應(yīng)關(guān)系,因此,這類方法不適合于對(duì)軟件進(jìn)行功能回歸即黑盒回歸測(cè)試。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明需要解決的技術(shù)問題是提供一種快速、準(zhǔn)確、高效進(jìn)行黑盒回歸測(cè)試的方法和系統(tǒng)。
為解決上述技術(shù)問題,本發(fā)明的一種黑盒回歸測(cè)試方法,包括以下步驟,
步驟s101:源代碼解析,通過(guò)類型解析和對(duì)源代碼的詞法、語(yǔ)法分析得到代碼的語(yǔ)法樹和類型系統(tǒng);
步驟s102:界面元素分析,掃描源代碼抽象語(yǔ)法樹,以窗口類定義為基本單元,分析被測(cè)軟件的界面構(gòu)成,形成界面元素樹模型;
步驟s103:交互關(guān)系分析,掃描源代碼抽象語(yǔ)法樹,并依據(jù)所使用的類型系統(tǒng)對(duì)調(diào)用邏輯、事件流進(jìn)行分析,形成被測(cè)軟件界面元素調(diào)用關(guān)系模型;
步驟s104:測(cè)試執(zhí)行過(guò)程跟蹤,捕獲用例執(zhí)行過(guò)程中所輸入的數(shù)據(jù)以及點(diǎn)擊的界面元素,形成用例執(zhí)行路徑數(shù)據(jù);
步驟s105:用例覆蓋分析,將用例執(zhí)行數(shù)據(jù)與界面模型進(jìn)行匹配,得到每個(gè)用例執(zhí)行后被覆蓋的界面元素和路徑,并以圖形方式顯示于界面上;
步驟s106:測(cè)試用例約簡(jiǎn),分析一組用例所覆蓋的界面元素和路徑,采用基于調(diào)用路徑和基于界面元素覆蓋數(shù)量?jī)煞N算法剔除其中冗余的測(cè)試用例,形成測(cè)試用例集;
步驟s107:功能差異檢測(cè),通過(guò)對(duì)兩個(gè)軟件版本的靜態(tài)分析結(jié)果進(jìn)行分析,找出兩個(gè)版本間的ui差異和ui變更位置;
步驟s108:功能變更影響分析,依據(jù)找到的變更點(diǎn),采用回溯迭代算法,在界面元素靜態(tài)結(jié)構(gòu)模型上查找依賴項(xiàng),形成從變更點(diǎn)出發(fā)的變更影響范圍即影響域;
步驟s109:回歸測(cè)試用例篩選:以變更影響域?yàn)槟繕?biāo)函數(shù),采用覆蓋的變更功能優(yōu)先、關(guān)鍵度優(yōu)先以及路徑長(zhǎng)度優(yōu)先策略,從約簡(jiǎn)后的測(cè)試用例集中查找出能夠覆蓋變更影響域的最少個(gè)數(shù)測(cè)試用例;
步驟s110:影響域覆蓋分析,依據(jù)篩選出的回歸測(cè)試用例所能夠覆蓋的變更影響域,找出尚未被覆蓋的變更影響域。
進(jìn)一步的,所述步驟s101源代碼解析中如果代碼為c#語(yǔ)言,將代碼的邏輯結(jié)構(gòu)與代碼所述的類型系統(tǒng)相關(guān)聯(lián),所述類型系統(tǒng)中包含被測(cè)軟件自定義的類型、引用類庫(kù)的類型以及框架自身的類型,依據(jù)其關(guān)聯(lián)關(guān)系識(shí)別出語(yǔ)法樹的語(yǔ)義信息。
進(jìn)一步的,所述步驟s104測(cè)試執(zhí)行過(guò)程跟蹤具體還包括以下步驟,
步驟s141:執(zhí)行窗口調(diào)用樹圖構(gòu)建;
步驟s142:界面控件捕獲。
更進(jìn)一步的,所述步驟s142中的界面控件包括按鈕、編輯框、菜單項(xiàng)、listview、標(biāo)簽、工具欄按鈕、tab選項(xiàng)卡、列表框和combobox。
進(jìn)一步的,所述步驟s106測(cè)試用例約簡(jiǎn)具體包括以下步驟,
步驟s161:關(guān)鍵用例處理;
步驟s162:用例篩選;
步驟s163:結(jié)果提交。
進(jìn)一步的,所述步驟s108功能變更影響分析包括基于功能圖的變更影響分析和基于調(diào)用關(guān)系的變更影響分析。
進(jìn)一步的,所述步驟s109測(cè)試用例篩選采用覆蓋的變更功能優(yōu)先、關(guān)鍵度優(yōu)先、路徑長(zhǎng)度優(yōu)先三種原則,從約簡(jiǎn)后的測(cè)試用例集中,挑選出個(gè)數(shù)最少的測(cè)試用例。
采用上述后方法后,本發(fā)明有效解決回歸測(cè)試中的如下問題:
1、軟件功能自動(dòng)獲取;
2、軟件功能變更標(biāo)識(shí)及變更影響分析;
3、測(cè)試覆蓋獲??;
4、測(cè)試用例約簡(jiǎn);
5、回歸測(cè)試用例篩選。
本發(fā)明能夠有效避免回歸測(cè)試的重復(fù)、冗余和遺漏,大大提高回歸測(cè)試的充分性、有效性和測(cè)試效率。
附圖說(shuō)明
下面結(jié)合附圖和具體實(shí)施方式對(duì)本發(fā)明作進(jìn)一步詳細(xì)的說(shuō)明。
圖1為本發(fā)明黑盒回歸測(cè)試功能結(jié)構(gòu)示意圖。
圖2為本發(fā)明源代碼解析工作流程圖。
圖3為本發(fā)明匹配關(guān)系示意圖。
圖4為本發(fā)明依賴關(guān)系模型圖。
圖5為本發(fā)明按鈕種類示意圖。
圖6為本發(fā)明按鈕抽象操作流程圖。
圖7為本發(fā)明查找窗口示意圖。
圖8為本發(fā)明文本框抽象操作流程圖。
圖9為本發(fā)明菜單窗口示意圖。
圖10為本發(fā)明菜單抽象操作流程圖。
圖11為本發(fā)明測(cè)試用例優(yōu)化處理流程圖。
圖12為本發(fā)明功能結(jié)構(gòu)變更影響示意圖。
圖13為本發(fā)明調(diào)用關(guān)系變更影響示意圖。
圖14為本發(fā)明回歸測(cè)試用例優(yōu)選處理流程。
圖15為本發(fā)明學(xué)生管理系統(tǒng)程序主界面示意圖。
圖16為本發(fā)明界面元素及交互關(guān)系分析結(jié)果示意圖。
圖17為本發(fā)明“登錄系統(tǒng)”測(cè)試執(zhí)行跟蹤示意圖。
圖18為本發(fā)明測(cè)試用例覆蓋路徑示意圖。
圖19為本發(fā)明測(cè)試用例優(yōu)化結(jié)果示意圖。
圖20為本發(fā)明功能差異檢測(cè)結(jié)果示意圖。
圖21為本發(fā)明變更影響分析結(jié)果示意圖。
具體實(shí)施方式
如圖1所示,本發(fā)明的一種黑盒回歸測(cè)試方法,包括以下步驟,
步驟s101:源代碼解析,通過(guò)類型解析和對(duì)源代碼的詞法、語(yǔ)法分析得到代碼的語(yǔ)法樹和類型系統(tǒng)。如圖2所示,當(dāng)代碼為c#語(yǔ)言時(shí),由于c#語(yǔ)言是面向?qū)ο笳Z(yǔ)言,要對(duì)代碼進(jìn)行進(jìn)一步分析,需要將代碼的邏輯結(jié)構(gòu)(ast)與代碼所處的類型系統(tǒng)相關(guān)聯(lián),該類型系統(tǒng)中包含被測(cè)軟件自定義的類型、引用類庫(kù)的類型以及框架自身的類型,依據(jù)其關(guān)聯(lián)關(guān)系識(shí)別出語(yǔ)法樹的語(yǔ)義信息。本方案依據(jù)程序集依賴關(guān)系構(gòu)建類型系統(tǒng)全集,根據(jù)語(yǔ)法樹節(jié)點(diǎn)所定義的元素類型,以全命名查找對(duì)應(yīng)的類型系統(tǒng)元素,建立永久關(guān)聯(lián)并進(jìn)行存儲(chǔ)。通過(guò)解析方法查詢兩者關(guān)聯(lián)關(guān)系,產(chǎn)生源代碼抽象語(yǔ)法樹、類型系統(tǒng)范圍及關(guān)聯(lián)數(shù)據(jù)庫(kù)。
步驟s102:界面元素分析,掃描源代碼抽象語(yǔ)法樹,以窗口類定義為基本單元,分析被測(cè)軟件的界面構(gòu)成,形成界面元素樹模型。在建立代碼邏輯結(jié)構(gòu)和類型系統(tǒng)基礎(chǔ)上,通過(guò)遍歷語(yǔ)法樹以樹結(jié)構(gòu)模板識(shí)別方法查找界面元素定義及屬性設(shè)置。最終形成全集數(shù)據(jù)模型。
依據(jù)ast所表示的語(yǔ)法邏輯和類型系統(tǒng),在代表ui元素的類定義中分析界面元素組織關(guān)系,系統(tǒng)定義模式庫(kù)表示要在語(yǔ)法樹上識(shí)別的特征模板,通過(guò)匹配引擎在迭代語(yǔ)法樹的過(guò)程中抽取界面元素的定義、屬性設(shè)置和隸屬關(guān)系信息,形成界面元素集合并建立隸屬關(guān)系。
模式庫(kù)中的一條模式規(guī)則由一棵節(jié)點(diǎn)有序的樹形結(jié)構(gòu)表示,依據(jù)有序樹匹配理論在抽象語(yǔ)法樹上進(jìn)行匹配,規(guī)則樹是由規(guī)則節(jié)點(diǎn)與特定規(guī)則關(guān)聯(lián)形成的樹形結(jié)構(gòu),規(guī)則節(jié)點(diǎn)定義語(yǔ)法樹節(jié)點(diǎn)的屬性匹配規(guī)則,用于對(duì)語(yǔ)法樹節(jié)點(diǎn)的匹配。如圖3所示,節(jié)點(diǎn)之間的關(guān)系分為三種情形:1.存在于子層:表示ast片段中以某個(gè)子節(jié)點(diǎn)為根的子樹完全與規(guī)則匹配;2.存在于左子樹:表示ast片段某節(jié)點(diǎn)下第一個(gè)節(jié)點(diǎn)子樹中存在與規(guī)則匹配的節(jié)點(diǎn),3.存在于子樹:表示ast片段某節(jié)點(diǎn)下全部子樹中存在與規(guī)則匹配的節(jié)點(diǎn)。
模式庫(kù)中的一條模式規(guī)則由一棵節(jié)點(diǎn)有序的樹形結(jié)構(gòu)表示,依據(jù)有序樹匹配理論在抽象語(yǔ)法樹上進(jìn)行匹配,規(guī)則樹是由規(guī)則節(jié)點(diǎn)與特定規(guī)則關(guān)聯(lián)形成的樹形結(jié)構(gòu),規(guī)則節(jié)點(diǎn)定義語(yǔ)法樹節(jié)點(diǎn)的屬性匹配規(guī)則,用于對(duì)語(yǔ)法樹節(jié)點(diǎn)的匹配。節(jié)點(diǎn)之間的關(guān)系分為三種情形:1.存在于子層:表示ast片段中以某個(gè)子節(jié)點(diǎn)為根的子樹完全與規(guī)則匹配;2.存在于左子樹:表示ast片段某節(jié)點(diǎn)下第一個(gè)節(jié)點(diǎn)子樹中存在與規(guī)則匹配的節(jié)點(diǎn),3.存在于子樹:表示ast片段某節(jié)點(diǎn)下全部子樹中存在與規(guī)則匹配的節(jié)點(diǎn)。
步驟s103:交互關(guān)系分析,掃描源代碼抽象語(yǔ)法樹,并依據(jù)所使用的類型系統(tǒng)對(duì)調(diào)用邏輯、事件流進(jìn)行分析,形成被測(cè)軟件界面元素調(diào)用關(guān)系模型。在通過(guò)語(yǔ)法樹迭代遍歷語(yǔ)法樹獲得界面元素定義的同時(shí),識(shí)別界面事件的定義-引用關(guān)系,在事件和處理函數(shù)之間建立連接,分析類型、方法間的調(diào)用關(guān)系,通過(guò)控制流分析方法在界面元素間建立引用關(guān)系,形成依賴關(guān)系模型。利用有向圖建立窗口、窗口元素、元素間交互關(guān)系,窗口及元素用有向圖中的節(jié)點(diǎn)表示,交互及關(guān)聯(lián)關(guān)系用有向邊來(lái)表示,其類圖用圖4表示。
步驟s104:測(cè)試執(zhí)行過(guò)程跟蹤,捕獲用例執(zhí)行過(guò)程中所輸入的數(shù)據(jù)以及點(diǎn)擊的界面元素,形成用例執(zhí)行路徑數(shù)據(jù)。測(cè)試執(zhí)行跟蹤主要用于捕獲測(cè)試人員所做的操作,例如,點(diǎn)擊的菜單、按鈕、鍵盤輸入的數(shù)據(jù)等。通過(guò)捕獲的這些操作信息,測(cè)試人員可以準(zhǔn)確掌握測(cè)試用例對(duì)軟件界面元素的覆蓋情況。具體包括以下步驟,
步驟s141:執(zhí)行窗口調(diào)用樹圖構(gòu)建;為了實(shí)現(xiàn)上述目的,本專利中綜合采用鉤子和api函數(shù),在測(cè)試人員執(zhí)行樣本測(cè)試用例過(guò)程中構(gòu)建執(zhí)行窗口調(diào)用樹圖,構(gòu)建算法如下,執(zhí)行結(jié)束后,w是執(zhí)行窗口調(diào)用樹圖的結(jié)點(diǎn)集合,e是執(zhí)行窗口調(diào)用樹圖的邊的集合。
步驟s142:界面控件捕獲,界面控件是軟件界面的組成要素,本專利通過(guò)對(duì)常用界面元素特性分析,給出了以下幾種常見控件的抽象操作方法。
1)按鈕的抽象操作;
2)編輯框的抽象操作;
3)菜單項(xiàng)的抽象操作;
4)listview抽象操作;
5)標(biāo)簽的抽象操作;
6)工具欄按鈕的抽象操作;
7)tab選項(xiàng)卡的抽象操作;
8)列表框的抽象操作;
9)combobox的抽象操作;
除了這幾種常用控件外,工具還對(duì)對(duì)話框的彈出等gui軟件的狀態(tài)變化進(jìn)行抽象操作,下面對(duì)部分重要控件的抽象操作進(jìn)行詳細(xì)介紹。
1)按鈕點(diǎn)擊的抽象操作
當(dāng)判斷截獲到一條消息并且控件的類名為“button”時(shí),有可能是一個(gè)標(biāo)準(zhǔn)的按鈕控件,還有可能是checkbox或radiobutton,三種控件的區(qū)別如圖5所示。
對(duì)于checkbox或radiobutton控件,用戶可以選擇或不選擇,將它的值在真與假之間改變。checkbox和radiobutton控件有一個(gè)名為checked的屬性,需要檢查checked屬性的值,才能對(duì)按鈕的狀態(tài)進(jìn)行具體描述。
radiobutton和checkbox有一些不同點(diǎn),第一、radiobutton控件以組的形式出現(xiàn),同一組內(nèi)只能有一個(gè)且必須有一個(gè)選項(xiàng)選中,選中即控件的checked屬性為真;而checkbox控件可以以組的形式出現(xiàn),也可以單獨(dú)出現(xiàn),可以多個(gè)選項(xiàng)同時(shí)選中或均不選中;第二、radiobutton只要被單擊,所點(diǎn)擊選項(xiàng)的checked屬性就變成真,即使radiobutton的屬性已經(jīng)為真了,單擊后它的屬性依然為真,而checkbox控件屬性值在控件被單擊后,會(huì)從假變?yōu)檎?,或從真變?yōu)榧?。針?duì)按鈕控件,其抽象操作流程如圖6所示。
判斷按鈕的類型的處理具體描述為:
利用getwindowlong(hwnd,nindex)函數(shù)判斷按鈕的具體類型,函數(shù)有兩個(gè)參數(shù):hwnd:窗口或控件的句柄;nindex:指定要檢索的基于0的偏移量,可以設(shè)置為gwl_exstyle代表獲得擴(kuò)展窗口風(fēng)格、gwl_style代表獲得窗口風(fēng)格、gwl_hwndparent代表如果父窗口存在,獲得父窗口句柄。為了判斷具體的控件類型,使用的是gwl_style窗口風(fēng)格標(biāo)識(shí),再將獲取值同0x0000ffff進(jìn)行與操作,就可以判定所操作控件是bs_autocheckbutton或bs_autoradiobutton,然后再根據(jù)控件具體類型進(jìn)行抽象操作。
2)文本框的抽象操作
由于對(duì)編輯框的操作后,收到的消息只是文本框的內(nèi)容,例如圖7所示記事本程序“查找”窗口,編輯框輸入內(nèi)容“測(cè)試”后,如果只是輸出記錄“在文本框中輸入內(nèi)容‘測(cè)試’”,因?yàn)闆]有獲取編輯框的標(biāo)簽,無(wú)法完整表達(dá)所操作的含義,這就需要對(duì)編輯框進(jìn)行一個(gè)獲取標(biāo)簽信息的特殊處理。對(duì)文本框控件的抽象操作處理流程如圖8所示。
如何獲取文本框的標(biāo)簽具體描述為:
1、編輯框編輯結(jié)束時(shí)查找文本框的標(biāo)簽坐標(biāo)時(shí),首先需要利用win32api函數(shù)getwindowrect(inthwnd,refrt)找到文本框的左側(cè)和底側(cè)的坐標(biāo)值,其中hwnd代表控件的句柄,rt代表一個(gè)結(jié)構(gòu),結(jié)構(gòu)由四個(gè)元素組成,分別是控件的上側(cè)、下側(cè)、左側(cè)、右側(cè)的坐標(biāo)值。其功能是將句柄為hwnd的控件底側(cè)、左側(cè)、上側(cè)、右側(cè)的坐標(biāo)拷貝到rt結(jié)構(gòu)中,通過(guò)取rt結(jié)構(gòu)的參數(shù)值即可。
2、根據(jù)經(jīng)驗(yàn)文本框的標(biāo)簽位置一般在其左側(cè)或者上側(cè),首先從控件的左側(cè)開始查詢,取出所操作文本框控件的左側(cè)和底側(cè)坐標(biāo)值,按照x坐標(biāo)遞減的順序,尋找控件類名是“l(fā)abel”的控件,設(shè)置遞減的長(zhǎng)度,如果沒有,再取出所操作文本框控件的上側(cè)和左側(cè)坐標(biāo)值,再按照y坐標(biāo)值遞減的順序進(jìn)行查找,同樣需要設(shè)置遞減的長(zhǎng)度,直到找到“l(fā)abel”控件,將其標(biāo)簽屬性標(biāo)識(shí)文本框控件,對(duì)文本框進(jìn)行抽象操作。
3)菜單項(xiàng)的選擇抽象操作
菜單的結(jié)構(gòu)是層次型構(gòu)造,如圖9所示,最上一層“文件”、“編輯”、“格式”的菜單被稱為主菜單項(xiàng),主菜單項(xiàng)在前端的接口中是可見的,下一層的菜單只有單擊主菜單之后才會(huì)顯示,其中“新建”、“打開”等菜單項(xiàng),都被稱為子菜單。子菜單也可以有自己的子菜單,每一個(gè)菜單的條目都會(huì)有唯一的菜單句柄,用來(lái)唯一標(biāo)識(shí)所點(diǎn)擊的菜單條目。對(duì)菜單控件的抽象操作處理流程如圖10所示。
對(duì)菜單項(xiàng)抽象操作具體描述為:
1、當(dāng)點(diǎn)擊主菜單時(shí),通過(guò)getmenu(inthwin)函數(shù)返回菜單句柄,其中hwnd代表窗口的句柄;
2、再利用menuitemfrompoint(inthwin,inthmenu,pointpt)函數(shù)得到所點(diǎn)擊主菜單選項(xiàng)在主菜單中的位置索引,其中hwin代表窗口的句柄,hmenu代表菜單的句柄,pt代表當(dāng)前點(diǎn)擊的坐標(biāo);
3、調(diào)用getmenustring(inthmenu,inttopmenuindex,inttopmenutext,128,mf_byposition)函數(shù)獲取主菜單的文本,其中hpremenu代表菜單的句柄,topmenuindex代表點(diǎn)擊主菜單項(xiàng)的索引,topmenutext代表得到菜單文本的字符串,mf_byposition代表獲取類型標(biāo)識(shí);
4、此時(shí)子菜單打開,如果用戶繼續(xù)點(diǎn)擊子菜單項(xiàng),調(diào)用getsubmenu(inthpremenu,inttopmenuindex)函數(shù)獲取子菜單項(xiàng)句柄,其中hpremenu代表菜單的句柄,topmenuindex代表點(diǎn)擊主菜單的索引;menuitemfrompoint(inthwin,inthsubmenu,pointpt)函數(shù)獲取子菜單索引,其中hwin代表主菜單的句柄,hsubmenu代表子菜單的句柄,pt代表鼠標(biāo)點(diǎn)擊的坐標(biāo);
5、調(diào)用getmenustring(inthsubmenu,intindexsub,intsubmenutext,128,mf_bycommand)函數(shù)獲取子菜單文本,其中hsubmenu代表子菜單的句柄,indexsub代表選擇的子菜單項(xiàng)的索引,submenutext代表的得到子菜單項(xiàng)文本的字符串,進(jìn)而結(jié)合主菜單對(duì)菜單項(xiàng)操作進(jìn)行抽象處理。
步驟s105:用例覆蓋分析,將用例執(zhí)行數(shù)據(jù)與界面模型進(jìn)行匹配,得到每個(gè)用例執(zhí)行后被覆蓋的界面元素和路徑,并以圖形方式顯示于界面上。
步驟s106:測(cè)試用例約簡(jiǎn),分析一組用例所覆蓋的界面元素和路徑,采用基于調(diào)用路徑和基于界面元素覆蓋數(shù)量?jī)煞N算法剔除其中冗余的測(cè)試用例,形成測(cè)試用例集。
由于測(cè)試用例設(shè)計(jì)的局限性,從功能覆蓋的角度而言,難免存在重復(fù)或冗余的測(cè)試用例,這類測(cè)試用例對(duì)測(cè)試覆蓋是沒有貢獻(xiàn)的,需要將其剔除,以減少回歸測(cè)試執(zhí)行和回歸測(cè)試用例維護(hù)工作量。
本發(fā)明中提出了基于調(diào)用路徑和覆蓋路徑兩種測(cè)試用例優(yōu)化策略,采用基于程序路徑和功能路徑的啟發(fā)式貪心算法,對(duì)測(cè)試用例進(jìn)行約簡(jiǎn),有效剔除了重復(fù)和冗余的測(cè)試用例,大大減少了測(cè)試用例的維護(hù)和執(zhí)行費(fèi)用。
依據(jù)測(cè)試用例關(guān)鍵度和覆蓋ui元素及調(diào)用路徑的對(duì)應(yīng)關(guān)系來(lái)完成測(cè)試用例集的約簡(jiǎn)工作,通過(guò)及時(shí)判斷測(cè)試用例對(duì)ui元素節(jié)點(diǎn)的覆蓋情況,系統(tǒng)在得到每個(gè)測(cè)試用例所覆蓋的界面元素和執(zhí)行路徑后,采用基于調(diào)用路徑和基于界面元素覆蓋數(shù)量?jī)煞N算法剔除其中冗余和重復(fù)的測(cè)試用例,從而在保留關(guān)鍵測(cè)試用例基礎(chǔ)上盡可能地收縮測(cè)試用例集,完成用例優(yōu)化。優(yōu)化分為三個(gè)階段進(jìn)行,即關(guān)鍵測(cè)試用例處理及包含冗余檢測(cè)階段、測(cè)試用例篩選階段和測(cè)試用例排序階段,如圖11所示。具體包括以下步驟,
步驟s161:關(guān)鍵用例處理;迭代所有的必要測(cè)試用例,對(duì)所有被必要測(cè)試用例覆蓋的ui元素節(jié)點(diǎn)和調(diào)用路徑進(jìn)行標(biāo)注;迭代所有測(cè)試用例,檢測(cè)測(cè)試用例覆蓋路徑間的包含關(guān)系,對(duì)包含在關(guān)鍵用例中的冗余用例進(jìn)行標(biāo)注。而后更新剩余測(cè)試用例集和未被覆蓋的ui節(jié)點(diǎn)和調(diào)用邊形成覆蓋需求集。
步驟s162:用例篩選;用例篩選。在現(xiàn)有覆蓋需求集和用例集基礎(chǔ)上,對(duì)所有剩余用例依據(jù)調(diào)用路徑和基于界面元素覆蓋數(shù)量?jī)煞N算法進(jìn)行關(guān)鍵度排序。在調(diào)用路徑覆蓋優(yōu)先原則下,依據(jù)用例覆蓋待測(cè)有調(diào)用關(guān)系向邊數(shù)量進(jìn)行由高到底排序,在界面元素覆蓋數(shù)量?jī)?yōu)先原則下,依據(jù)用例覆蓋待測(cè)ui節(jié)點(diǎn)的數(shù)量進(jìn)行由高到底排序,選取關(guān)鍵度最高的用例作為候選用例,更新測(cè)試用例集和剩余未被覆蓋的ui節(jié)點(diǎn)和調(diào)用邊,重復(fù)上述步驟,直到候選測(cè)試用例集為空或所有剩余測(cè)試用例關(guān)鍵度為0為止。
步驟s163:結(jié)果提交,對(duì)所有關(guān)鍵測(cè)試用例也依據(jù)兩種關(guān)鍵度評(píng)價(jià)方法執(zhí)行貪心算法進(jìn)行排序,合并已選測(cè)試用例依次排序,順序設(shè)置執(zhí)行優(yōu)先級(jí),輸出被優(yōu)化后的測(cè)試用例集,綜合用例集覆蓋范圍,提取未能覆蓋的功能模型范圍。
步驟s107:功能差異檢測(cè),通過(guò)對(duì)兩個(gè)軟件版本的靜態(tài)分析結(jié)果進(jìn)行分析,找出兩個(gè)版本間的ui差異和ui變更位置。
通過(guò)在ui結(jié)構(gòu)差異和ui交互差異兩個(gè)方面對(duì)新舊兩個(gè)版本軟件進(jìn)行檢測(cè),在全局功能交互模型中標(biāo)識(shí)變化點(diǎn)。
以有向圖表示的功能交互模型中抽取界面元素節(jié)點(diǎn)。按照包含關(guān)系有向邊抽取ui元素和其間的連接關(guān)系,以樹形結(jié)構(gòu)表示系統(tǒng)ui構(gòu)成,建模系統(tǒng)功能結(jié)構(gòu)模型;按照調(diào)用關(guān)系有向邊抽取交互模型子圖,用來(lái)表示ui元素間的功能交互模型。我們通過(guò)編輯距離方法比較兩種結(jié)構(gòu)之間的差異,通過(guò)計(jì)算將原版本結(jié)構(gòu)模型映射為新版本結(jié)構(gòu)模型的變更操作序列,揭示兩個(gè)版本間的功能結(jié)構(gòu)變更和交互變更,并在新舊版本中進(jìn)行標(biāo)注形成變更域。
系統(tǒng)使用關(guān)聯(lián)關(guān)系矩陣存儲(chǔ)系統(tǒng)ui元素功能結(jié)構(gòu)和交互關(guān)系有向圖,定義新增、刪除、變更三種基本操作,通過(guò)計(jì)算將原版本功能結(jié)構(gòu)、交互關(guān)系有向圖轉(zhuǎn)換為新版本有向圖的最小代價(jià),將相應(yīng)的編輯操作映射到新舊版本的結(jié)構(gòu)和交互模型上,標(biāo)注變更。
系統(tǒng)首先以靜態(tài)分析得到的ui元素節(jié)點(diǎn)的全限定名來(lái)進(jìn)行節(jié)點(diǎn)對(duì)齊和屬性比對(duì),生成對(duì)應(yīng)節(jié)點(diǎn)間的編輯操作集合;而后對(duì)比對(duì)比兩個(gè)版本間的ui元素差異,映射ui元素節(jié)點(diǎn)的增加、刪除操作;最后對(duì)圖中的有向邊連接關(guān)系及其連接屬性進(jìn)行比對(duì),形成連接關(guān)系間的增加、刪除、修改操作,將上述操作集合并形成操作序列,依據(jù)ui元素差異和屬性差異標(biāo)注功能結(jié)構(gòu)變更、依據(jù)有向邊差異標(biāo)注交互關(guān)系變更。
步驟s108:功能變更影響分析,依據(jù)找到的變更點(diǎn),采用回溯迭代算法,在界面元素靜態(tài)結(jié)構(gòu)模型上查找依賴項(xiàng),形成從變更點(diǎn)出發(fā)的變更影響范圍即影響域。
系統(tǒng)綜合基于功能圖的變更影響分析和基于調(diào)用關(guān)系(控制流)的變更影響分析結(jié)果,合并生成變更影響域。
1)基于功能圖的變更影響分析。本系統(tǒng)采用靜態(tài)分析技術(shù)獲得被測(cè)軟件功能結(jié)構(gòu),在被測(cè)軟件交互模型中從窗口元素出發(fā)按照ui元素包含關(guān)系可抽取ui結(jié)構(gòu),結(jié)構(gòu)中的根節(jié)點(diǎn)為每一個(gè)程序窗口,下級(jí)節(jié)點(diǎn)構(gòu)成控件樹,在功能結(jié)構(gòu)圖中,用元素間節(jié)點(diǎn)間的有向邊表示包含關(guān)聯(lián),方向由父節(jié)點(diǎn)指向子節(jié)點(diǎn),我們認(rèn)為子節(jié)點(diǎn)屬性的變更會(huì)影響父節(jié)點(diǎn)功能的完成,即,在軟件功能圖中ui節(jié)點(diǎn)屬性和子樹結(jié)構(gòu)的變更會(huì)沿有向邊的反方向傳遞。系統(tǒng)首先在結(jié)構(gòu)樹中標(biāo)注變更檢測(cè)得到的功能結(jié)構(gòu)變更,依據(jù)上述傳播規(guī)律沿有向邊上溯到根節(jié)點(diǎn),沿途標(biāo)注變更影響路徑,形成結(jié)構(gòu)變更影響域。
2)基于調(diào)用關(guān)系的變更影響分析。系統(tǒng)在進(jìn)行基于代碼的靜態(tài)分析時(shí),生成函數(shù)調(diào)用關(guān)系數(shù)據(jù)結(jié)構(gòu),我們把依賴關(guān)系模型表示為一個(gè)有向圖,函數(shù)作為該有向圖的節(jié)點(diǎn),每一個(gè)函數(shù)調(diào)用表達(dá)式作為連接兩個(gè)函數(shù)節(jié)點(diǎn)的有向邊,其方向由調(diào)用函數(shù)指向被調(diào)用函數(shù),整個(gè)函數(shù)調(diào)用有向圖描述了被測(cè)工程的函數(shù)調(diào)用關(guān)系;通過(guò)事件映射模式規(guī)則識(shí)別出界面元素及事件處理函數(shù)間的映射關(guān)系,與函數(shù)調(diào)用合成形成控制依賴有向圖。靜態(tài)分析時(shí)抽取了界面元素對(duì)象的定義-引用關(guān)系,通過(guò)綜合界面元素定義-引用對(duì)(d-upair),在函數(shù)調(diào)用中識(shí)別對(duì)界面元素對(duì)象的引用,從而在控制流節(jié)點(diǎn)(函數(shù))中關(guān)聯(lián)受影響的界面元素,鏈接形成界面元素間的引用關(guān)系,界面元素間的引用關(guān)系與控制流方向相同。我們認(rèn)為界面元素節(jié)點(diǎn)的變更,會(huì)沿控制流雙向傳遞,系統(tǒng)通過(guò)函數(shù)調(diào)用有向邊和事件關(guān)聯(lián)有向邊,由變更點(diǎn)出發(fā)追溯至界面元素節(jié)點(diǎn),沿途標(biāo)注調(diào)用關(guān)系影響域。如圖12和圖13所示,系統(tǒng)最終在交互模型中合成兩種方式所標(biāo)注的節(jié)點(diǎn)和有向邊形成變更影響域,標(biāo)注受變更影響的所有ui元素。
步驟s109:測(cè)試用例篩選:以變更影響域?yàn)槟繕?biāo)函數(shù),采用覆蓋的變更功能優(yōu)先、關(guān)鍵度優(yōu)先以及路徑長(zhǎng)度優(yōu)先策略,從約簡(jiǎn)后的測(cè)試用例集中查找出能夠覆蓋變更影響域的最少個(gè)數(shù)測(cè)試用例;
步驟s110:影響域覆蓋分析,依據(jù)篩選出的回歸測(cè)試用例所能夠覆蓋的變更影響域,找出尚未被覆蓋的變更影響域。
采用覆蓋的變更功能優(yōu)先、關(guān)鍵度優(yōu)先、路徑長(zhǎng)度優(yōu)先三種原則,從約簡(jiǎn)后的測(cè)試用例集中,挑選出個(gè)數(shù)最少的測(cè)試用例。其工作流程如圖14所示。首先,對(duì)原有測(cè)試用例進(jìn)行篩選,參照變更域中控制流路徑,對(duì)因路徑變更不能抵達(dá)變更點(diǎn)所在ui元素的測(cè)試用例進(jìn)行標(biāo)注,在候選用例集中排除該用例。而后,利用剩余用例構(gòu)成候選用例集進(jìn)行優(yōu)選:將回歸測(cè)試用例集置為為空,且其測(cè)試覆蓋度為0;根據(jù)測(cè)試人員的選擇,依據(jù)變更功能優(yōu)先、關(guān)鍵度優(yōu)先、路徑長(zhǎng)度優(yōu)先的原則計(jì)算單個(gè)測(cè)試用例對(duì)變更影響域覆蓋的貢獻(xiàn),據(jù)此對(duì)候選用例進(jìn)行排序,選取覆蓋貢獻(xiàn)大于0的測(cè)試用例中,貢獻(xiàn)最大的測(cè)試用例加入回歸測(cè)試用例集;對(duì)變更域節(jié)點(diǎn)進(jìn)行覆蓋標(biāo)注,計(jì)算總體覆蓋貢獻(xiàn);余下用例重復(fù)進(jìn)行上一步判斷,直到余下用例均計(jì)算完畢為止;最終提交回歸測(cè)試用例集,及變更域覆蓋數(shù)據(jù)集,對(duì)未能覆蓋的變更域節(jié)點(diǎn)和路徑進(jìn)行標(biāo)注,提示進(jìn)行新用例設(shè)計(jì)。
上述算法中依據(jù)覆蓋貢獻(xiàn)對(duì)候選用例集的排序直接影響了最終測(cè)試用例篩選的結(jié)果,相關(guān)排序指標(biāo)的計(jì)算方式為:
變更功能:整個(gè)用例路徑上覆蓋變更影響域中未覆蓋變更點(diǎn)的個(gè)數(shù),用來(lái)描述單個(gè)測(cè)試用例對(duì)變更影響域覆蓋的貢獻(xiàn);
路徑關(guān)鍵度:使用在靜態(tài)分析中的到的ui元素依賴關(guān)系有向圖中ui節(jié)點(diǎn)的扇入數(shù)與扇出數(shù)的總和,結(jié)合測(cè)試需求來(lái)標(biāo)注單個(gè)元素的關(guān)鍵度,整個(gè)用例的關(guān)鍵度是用例所覆蓋變更域內(nèi)尚未覆蓋的變更點(diǎn)的關(guān)鍵度的總和,用來(lái)描述單個(gè)測(cè)試用例對(duì)變更影響域關(guān)鍵功能點(diǎn)覆蓋的貢獻(xiàn)。
路徑長(zhǎng)度:標(biāo)注測(cè)試用例路徑的長(zhǎng)度,用來(lái)度量測(cè)試用例執(zhí)行的大小及用例的綜合測(cè)試能力,在覆蓋度相同的情況下優(yōu)先選擇路徑長(zhǎng)度大的測(cè)試用例。
實(shí)施方式一:
下面以vsc#語(yǔ)言開發(fā)的學(xué)生管理系統(tǒng)程序?yàn)槔唧w說(shuō)明如何通過(guò)本發(fā)明實(shí)現(xiàn)黑盒回歸測(cè)試。示例程序輸入界面如圖15所示。
1、界面元素及交互關(guān)系分析
根據(jù)本發(fā)明步驟s101源代碼解析、步驟s102界面元素分析和步驟s103交互關(guān)系分析,通過(guò)對(duì)軟件源代碼進(jìn)行分析,可得到界面中的元素,即軟件窗口組成、窗口調(diào)用關(guān)系、控件類型、名稱等屬性,如圖16所示。
2、測(cè)試執(zhí)行跟蹤
以“登錄系統(tǒng)”功能為例,用戶界面如圖17所示。通過(guò)跟蹤用戶執(zhí)行步驟,得出用戶對(duì)“用戶名”、“密碼”文本框進(jìn)行了輸入操作,對(duì)“登錄”按鈕進(jìn)行了點(diǎn)擊操作,如圖17所示。測(cè)試操作覆蓋了流程涉及“登錄”界面,如圖18所示。
3、測(cè)試用例約簡(jiǎn)
采用步驟s106測(cè)試用例約簡(jiǎn)中的算法,通過(guò)測(cè)試用例覆蓋路徑、界面、控件等的比對(duì),找出冗余測(cè)試用例,得出測(cè)試用例約簡(jiǎn)結(jié)果,如圖19所示。
4、功能差異檢測(cè)及變更影響分析
采用步驟步驟s107功能差異檢測(cè)和步驟s108功能變更影響分析中的算法,通過(guò)對(duì)軟件回歸版本和基線版本的對(duì)比,得出軟件功能差異,如圖20所示。并且在軟件功能調(diào)用圖中顯示變更影響分析,其中黃色標(biāo)注修改的部分,藍(lán)色標(biāo)注新增的部分,如圖21所示。
雖然以上描述了本發(fā)明的具體實(shí)施方式,但是本領(lǐng)域熟練技術(shù)人員應(yīng)當(dāng)理解,這些僅是舉例說(shuō)明,可以對(duì)本實(shí)施方式作出多種變更或修改,而不背離本發(fā)明的原理和實(shí)質(zhì),本發(fā)明的保護(hù)范圍僅由所附權(quán)利要求書限定。