本發(fā)明屬于安卓應(yīng)用程序測(cè)試技術(shù)領(lǐng)域,尤其涉及一種安卓應(yīng)用程序自動(dòng)化黑盒測(cè)試的方法及系統(tǒng)。
背景技術(shù):
窗口(window)為應(yīng)用程序顯示在設(shè)備屏幕上的整個(gè)圖形界面,唯一標(biāo)識(shí)當(dāng)前界面。引起窗口變化的因素包括不同Activity間的相互切換、同一個(gè)Activity組件中不同布局控件的顯示與隱藏等。
ADB(Android Debug Bridge)即Android調(diào)試橋,是Android系統(tǒng)中的一種命令行工具,可以利用ADB實(shí)現(xiàn)Android手機(jī)與PC的連接。
APK(Android Package)即Android安裝包。
隨著移動(dòng)互聯(lián)網(wǎng)技術(shù)的快速發(fā)展,Android應(yīng)用程序的開發(fā)數(shù)量也越來越多。為保證Android應(yīng)用程序的質(zhì)量,應(yīng)用程序在正式發(fā)布到應(yīng)用市場(chǎng)之前,需要對(duì)它進(jìn)行測(cè)試。但是開發(fā)者只提供了APK應(yīng)用包給應(yīng)用市場(chǎng),只能進(jìn)行黑盒測(cè)試。同時(shí),自動(dòng)化黑盒測(cè)試也非常符合最近比較流行的移動(dòng)云測(cè)試服務(wù)。開發(fā)者只需上傳被測(cè)應(yīng)用程序的APK文件,就可利用云服務(wù)平臺(tái)的資源進(jìn)行測(cè)試。因此,實(shí)現(xiàn)在無源碼的情況下對(duì)Android應(yīng)用程序進(jìn)行自動(dòng)化測(cè)試是非常有意義的。然而,現(xiàn)有的方法和技術(shù)仍然不能充分滿足自動(dòng)化和覆蓋率方面的要求,主要存在的問題包括:其一,需要手動(dòng)編寫或者手動(dòng)錄制測(cè)試腳本,導(dǎo)致測(cè)試的自動(dòng)化程度不高;其二,需先通過靜態(tài)分析技術(shù)構(gòu)建Activity轉(zhuǎn)換圖,不僅過程復(fù)雜,而且界面覆蓋率不高。
Tanzirul Azim等人提出了使用目標(biāo)和深度優(yōu)先遍歷的方式模擬用戶操作與Android應(yīng)用程序進(jìn)行交互,從而實(shí)現(xiàn)對(duì)應(yīng)用程序進(jìn)行測(cè)試,具體的實(shí)現(xiàn)過程為:
(1)對(duì)被測(cè)應(yīng)用程序進(jìn)行靜態(tài)分析,構(gòu)建基于Activity組件的遍歷模型;
(2)運(yùn)用目標(biāo)和深度優(yōu)先遍歷的方式,模擬用戶操作與Android應(yīng)用程序進(jìn)行交互;
(3)在遍歷的過程中生成測(cè)試結(jié)果。
該技術(shù)方案的缺點(diǎn):由于采用的是基于Activity組件的遍歷模型,由于一個(gè)Activity可能包含多個(gè)不同的窗口,同一個(gè)Activity中的窗口可以相互切換,基于Activity的遍歷模型其實(shí)并沒有真正建立顯示界面之間的切換關(guān)系,使得其對(duì)GUI的遍歷不夠充分,從而影響界面覆蓋率。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的在于提供一種安卓應(yīng)用程序自動(dòng)化黑盒測(cè)試的方法及系統(tǒng),旨在解決現(xiàn)有技術(shù)提供的安卓應(yīng)用程序的方法,需要手動(dòng)編寫或者手動(dòng)錄制測(cè)試腳本,導(dǎo)致測(cè)試的自動(dòng)化程度不高,同時(shí)需先通過靜態(tài)分析技術(shù)構(gòu)建Activity轉(zhuǎn)換圖,過程復(fù)雜,界面覆蓋率不高的問題。
本發(fā)明是這樣實(shí)現(xiàn)的,一種安卓應(yīng)用程序自動(dòng)化黑盒測(cè)試的方法,該安卓應(yīng)用程序自動(dòng)化黑盒測(cè)試的方法包括以下步驟:
步驟一,通過基于ADB命令的安卓應(yīng)用窗口控件識(shí)別方法識(shí)別目標(biāo)窗口中的所有控件信息和目標(biāo)窗口信息;
步驟二,運(yùn)用安卓應(yīng)用窗口全覆蓋測(cè)試用例自動(dòng)生成方法自動(dòng)生成測(cè)試用例;
步驟三,運(yùn)用RobotiumEx高重用測(cè)試腳本自動(dòng)生成方法自動(dòng)生成測(cè)試腳本。
進(jìn)一步,步驟一,通過基于ADB命令的安卓應(yīng)用窗口控件識(shí)別方法識(shí)別目標(biāo)窗口中的所有控件信息和目標(biāo)窗口信息時(shí),控件信息包括控件類型、控件名稱和控件屬性,窗口信息包括窗口所在Activity名稱和窗口哈希碼;
通過基于ADB命令的安卓應(yīng)用窗口控件識(shí)別方法識(shí)別目標(biāo)窗口中的所有控件信息和目標(biāo)窗口信息包括以下步驟:
步驟(1),通過ADB向設(shè)備分別發(fā)送dump和adb shell dumpsys window w|findstr mCurrent命令;
步驟(2),通過執(zhí)行dump命令獲得保存當(dāng)前設(shè)備屏幕上的窗口控件信息的xml文件,通過執(zhí)行adb shell dumpsys window w|findstr mCurrent命令獲得當(dāng)前窗口所屬的Activity名和窗口哈希碼;
步驟(3),把獲得的xml文件抓取到本地主機(jī)上,對(duì)其進(jìn)行解析,并把獲得的當(dāng)前窗口所屬的Activity名和窗口哈希碼信息加入控件信息中,生成控件節(jié)點(diǎn)列表;
步驟(4),把生成的控件節(jié)點(diǎn)列表重新寫入一個(gè)xml文件中。
進(jìn)一步,步驟二,運(yùn)用安卓應(yīng)用窗口全覆蓋測(cè)試用例自動(dòng)生成方法自動(dòng)生成測(cè)試用例時(shí),需要構(gòu)建一個(gè)基于安卓應(yīng)用窗口的遍歷模型,遍歷模型為一個(gè)有向圖,圖節(jié)點(diǎn)表示一個(gè)窗口節(jié)點(diǎn),而圖的邊表示一個(gè)模擬動(dòng)作,在基于窗口的遍歷模型中,窗口標(biāo)識(shí)(Window Flag)用于唯一標(biāo)識(shí)一個(gè)窗口,在窗口標(biāo)識(shí)中保存了Activity名稱和窗口哈希碼信息,可通過分別對(duì)Activity名稱和窗口哈希碼進(jìn)行對(duì)比來判斷兩個(gè)窗口是否相同;任務(wù)(Task)可表示為(窗口標(biāo)識(shí),動(dòng)作,控件節(jié)點(diǎn))這樣一個(gè)三元組,其中窗口標(biāo)識(shí)表示一個(gè)動(dòng)作在此窗口下執(zhí)行,動(dòng)作表示一個(gè)待模擬的操作,控件節(jié)點(diǎn)表示待模擬操作所屬控件,只有當(dāng)應(yīng)用程序運(yùn)行到此窗口且此窗口上的動(dòng)作被執(zhí)行后,一個(gè)任務(wù)才算被執(zhí)行;窗口節(jié)點(diǎn)(Window Node)中保存了與窗口相關(guān)的所有信息,其中包括對(duì)應(yīng)的窗口標(biāo)識(shí)、當(dāng)前窗口中包含的所有待執(zhí)行的任務(wù)形成的任務(wù)列表、父節(jié)點(diǎn)、子節(jié)點(diǎn)列表、從起始窗口節(jié)點(diǎn)到當(dāng)前窗口節(jié)點(diǎn)的路徑上執(zhí)行的所有任務(wù)列表以及當(dāng)前窗口中的轉(zhuǎn)換列表;轉(zhuǎn)換(Transition)用于表示模型中的一個(gè)轉(zhuǎn)換關(guān)系,它保存了任務(wù)和窗口節(jié)點(diǎn)信息,其中任務(wù)表示當(dāng)前窗口節(jié)點(diǎn)中的一個(gè)任務(wù),而節(jié)點(diǎn)表示任務(wù)執(zhí)行后所產(chǎn)生的子節(jié)點(diǎn);
運(yùn)用安卓應(yīng)用窗口全覆蓋測(cè)試用例自動(dòng)生成方法自動(dòng)生成測(cè)試用例包括以下步驟:
步驟(1),通過基于ADB命令的安卓應(yīng)用窗口控件識(shí)別方法識(shí)別目標(biāo)窗口中的所有控件信息和目標(biāo)窗口信息,根據(jù)控件類型為每個(gè)控件生成一個(gè)任務(wù),形成任務(wù)列表,根據(jù)窗口信息生成窗口標(biāo)識(shí),并把窗口標(biāo)識(shí)加入窗口節(jié)點(diǎn)中;
步驟(2),如果窗口節(jié)點(diǎn)的任務(wù)列表不為空,依次從任務(wù)列表中取出一個(gè)任務(wù),并根據(jù)窗口標(biāo)識(shí)判斷當(dāng)前窗口是否為執(zhí)行任務(wù)所需要的窗口,如果是所需窗口,則直接執(zhí)行任務(wù),如果不是所需窗口,則先恢復(fù)到當(dāng)前任務(wù)所需要的窗口,然后執(zhí)行任務(wù);
步驟(3),判斷執(zhí)行這個(gè)任務(wù)后窗口是否發(fā)生切換;
步驟(4),如果發(fā)生切換,則判斷是否跳轉(zhuǎn)到其他應(yīng)用的窗口中,如果跳轉(zhuǎn)到其它應(yīng)用的窗口中,則重啟應(yīng)用程序,循環(huán)步驟(1)、步驟(2)、步驟(3),否則把當(dāng)前任務(wù)加入到任務(wù)執(zhí)行路徑列表中,循環(huán)步驟(1),獲取跳轉(zhuǎn)后的窗口節(jié)點(diǎn)信息,把新窗口節(jié)點(diǎn)信息和當(dāng)前執(zhí)行的任務(wù)加入到當(dāng)前轉(zhuǎn)換中,把當(dāng)前轉(zhuǎn)換添加到當(dāng)前窗口節(jié)點(diǎn)的轉(zhuǎn)換列表中,同時(shí)把前一個(gè)窗口節(jié)點(diǎn)添加為新窗口節(jié)點(diǎn)的父窗口節(jié)點(diǎn);
步驟(5),如果沒有發(fā)生切換,循環(huán)步驟(2)、步驟(3);
步驟(6),判斷當(dāng)前窗口是否為結(jié)束窗口,即點(diǎn)擊這個(gè)窗口上的任何控件都不會(huì)切換到新的窗口,如果為結(jié)束窗口則根據(jù)任務(wù)執(zhí)行路徑列表生成一個(gè)測(cè)試用例,同時(shí)刪除任務(wù)執(zhí)行路徑列表中最后一個(gè)任務(wù);
步驟(7),判斷是否遍歷完整個(gè)應(yīng)用程序,如果已經(jīng)遍歷完整個(gè)應(yīng)用程序,則整個(gè)遍歷結(jié)果,如果沒有遍歷完整個(gè)應(yīng)用程序,則返回上一個(gè)窗口,遞歸執(zhí)行前面六個(gè)步驟,從而實(shí)現(xiàn)對(duì)整個(gè)應(yīng)用進(jìn)行遍歷。
在步驟(2)中,恢復(fù)到所需窗口的過程為:
先從任務(wù)中獲取任務(wù)執(zhí)行所需要的目標(biāo)窗口標(biāo)識(shí),然后獲取應(yīng)用程序當(dāng)前窗口標(biāo)識(shí),如果目標(biāo)窗口標(biāo)識(shí)和當(dāng)前窗口標(biāo)識(shí)相同則不做處理,如果不同則模擬返回操作返回前一個(gè)窗口,再判斷返回后的窗口標(biāo)識(shí)是否為目標(biāo)窗口標(biāo)識(shí);重復(fù)上述過程,直到找到目標(biāo)窗口為止;如果退回到應(yīng)用程序的起始窗口還沒有找到目標(biāo)窗口,則從目標(biāo)窗口節(jié)點(diǎn)中獲取保存的已經(jīng)執(zhí)行的任務(wù)列表,從起始窗口開始,依次執(zhí)行任務(wù)列表中的任務(wù),直到運(yùn)行到目標(biāo)窗口。
在步驟(6)中,生成的測(cè)試用例保存在Excel文檔中,測(cè)試用例的內(nèi)容包括測(cè)試用例名稱、操作步驟、當(dāng)前Activity名稱、目標(biāo)Activity名稱、被測(cè)控件的相關(guān)信息、操作關(guān)鍵字、結(jié)果檢查關(guān)鍵字、輸入數(shù)據(jù)和預(yù)期輸出數(shù)據(jù)字段。
進(jìn)一步,在步驟二中,運(yùn)用安卓應(yīng)用窗口全覆蓋測(cè)試用例自動(dòng)生成方法自動(dòng)生成測(cè)試用例時(shí),可使用<Activity名稱、當(dāng)前窗口截圖>替代<Activity名稱、窗口哈希碼>來唯一標(biāo)識(shí)一個(gè)安卓應(yīng)用窗口。
進(jìn)一步,在步驟三中,運(yùn)用RobotiumEx高重用測(cè)試腳本自動(dòng)生成方法自動(dòng)生成測(cè)試腳本時(shí),首先對(duì)Robotium框架中Solo類包含的常用方法進(jìn)行封裝,然后通過在Excel文檔中輸入相應(yīng)的關(guān)鍵字調(diào)用封裝好的測(cè)試腳本生成方法,自動(dòng)生成測(cè)試腳本;
運(yùn)用RobotiumEx高重用測(cè)試腳本自動(dòng)生成方法自動(dòng)生成測(cè)試腳本包括以下步驟:
步驟(1),對(duì)Robotium框架中Solo類包含的常用方法進(jìn)行封裝,得到常用的測(cè)試腳本生成方法;
步驟(2),給封裝好的測(cè)試腳本生成方法綁定相應(yīng)的關(guān)鍵字,形成RobotiumEx自動(dòng)化測(cè)試框架;
步驟(3),運(yùn)用安卓應(yīng)用窗口全覆蓋測(cè)試用例自動(dòng)生成方法生成Excel測(cè)試用例文檔;
步驟(4),在生成的測(cè)試用例文檔中添加相應(yīng)的測(cè)試數(shù)據(jù)和關(guān)鍵字;
步驟(5),讀取添加關(guān)鍵字和測(cè)試數(shù)據(jù)后的測(cè)試用例,獲取測(cè)試用例對(duì)應(yīng)的所有關(guān)鍵字,依次通過關(guān)鍵字調(diào)用相應(yīng)的測(cè)試腳本生成方法,為測(cè)試用例自動(dòng)生成測(cè)試腳本。
本發(fā)明的另一目的在于提供一種安卓應(yīng)用程序自動(dòng)化黑盒測(cè)試的系統(tǒng),該安卓應(yīng)用程序自動(dòng)化黑盒測(cè)試的系統(tǒng)包括:
基于ADB命令的安卓應(yīng)用窗口控件識(shí)別模塊,用于獲取當(dāng)前窗口的控件信息和窗口信息,控件信息包括控件類型、控件名稱和控件屬性,窗口信息包括窗口所在Activity名稱和窗口哈希碼;
安卓應(yīng)用窗口全覆蓋測(cè)試用例自動(dòng)生成模塊,與所述基于ADB命令的安卓應(yīng)用窗口控件識(shí)別模塊相連接,用于根據(jù)深度優(yōu)先遍歷方式,在自動(dòng)生成測(cè)試用例的過程中對(duì)安卓應(yīng)用窗口進(jìn)行全覆蓋;
RobotiumEx高重用測(cè)試腳本自動(dòng)生成模塊,與所述安卓應(yīng)用窗口全覆蓋測(cè)試用例自動(dòng)生成模塊相連接,用于對(duì)Robotium框架中Solo類包含的常用方法進(jìn)行封裝,并通過在Excel文檔中輸入相應(yīng)的關(guān)鍵字調(diào)用封裝好的測(cè)試腳本生成方法,自動(dòng)生成測(cè)試腳本。
本發(fā)明提供的安卓應(yīng)用程序自動(dòng)化黑盒測(cè)試的方法及系統(tǒng),首先通過基于ADB命令的安卓應(yīng)用窗口控件識(shí)別方法,識(shí)別目標(biāo)窗口中的所有控件信息和目標(biāo)窗口信息;然后運(yùn)用安卓應(yīng)用窗口全覆蓋測(cè)試用例自動(dòng)生成方法,自動(dòng)生成測(cè)試用例;最后運(yùn)用RobotiumEx高重用測(cè)試腳本自動(dòng)生成方法,自動(dòng)生成測(cè)試腳本;在通過基于ADB命令的安卓應(yīng)用窗口控件識(shí)別方法,識(shí)別目標(biāo)窗口中的所有控件信息和目標(biāo)窗口信息時(shí),在獲取控件信息時(shí)只需解析通過ADB命令獲得的控件信息文檔即可得到所有控件信息,并且通過ADB命令可以直接獲取窗口信息,過程簡(jiǎn)單并且節(jié)約時(shí)間;在運(yùn)用安卓應(yīng)用窗口全覆蓋測(cè)試用例自動(dòng)生成方法自動(dòng)生成測(cè)試用例時(shí),可在自動(dòng)生成測(cè)試用例的過程中,對(duì)安卓應(yīng)用窗口進(jìn)行全覆蓋;在運(yùn)用RobotiumEx高重用測(cè)試腳本自動(dòng)生成方法,自動(dòng)生成測(cè)試腳本時(shí),通過對(duì)Robotium自動(dòng)化測(cè)試框架進(jìn)行封裝,只需在測(cè)試用例文檔中添加關(guān)鍵字和測(cè)試數(shù)據(jù),即可實(shí)現(xiàn)自動(dòng)生成測(cè)試腳本,并且當(dāng)測(cè)試數(shù)據(jù)發(fā)生變化時(shí),只需修改測(cè)試用例文檔中的測(cè)試數(shù)據(jù)即可,而不需修改測(cè)試腳本,從而提高了測(cè)試腳本的可重用性;本發(fā)明達(dá)到了在不需要程序源碼的情況下,提高測(cè)試的自動(dòng)化程度、界面覆蓋率和提高測(cè)試腳本的可重用性的目的。
附圖說明
圖1是本發(fā)明實(shí)施例提供的安卓應(yīng)用程序自動(dòng)化黑盒測(cè)試的方法的實(shí)現(xiàn)流程圖;
圖2是本發(fā)明實(shí)施例提供的基于ADB命令的安卓應(yīng)用窗口控件識(shí)別的實(shí)現(xiàn)流程圖;
圖3是本發(fā)明實(shí)施例提供的安卓應(yīng)用窗口全覆蓋測(cè)試用例自動(dòng)生成的實(shí)現(xiàn)流程圖;
圖4是本發(fā)明實(shí)施例提供的SCLICK關(guān)鍵字封裝的實(shí)現(xiàn)流程圖;
圖5是本發(fā)明實(shí)施例提供的安卓應(yīng)用程序自動(dòng)化黑盒測(cè)試的系統(tǒng)的結(jié)構(gòu)框圖。
圖中:51、基于ADB命令的安卓應(yīng)用窗口控件識(shí)別模塊;52、安卓應(yīng)用窗口全覆蓋測(cè)試用例自動(dòng)生成模塊;53、RobotiumEx高重用測(cè)試腳本自動(dòng)生成模塊。
具體實(shí)施方式
為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下結(jié)合實(shí)施例,對(duì)本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說明。應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
如圖1所示,本發(fā)明是這樣實(shí)現(xiàn)的,一種安卓應(yīng)用程序自動(dòng)化黑盒測(cè)試的方法,該安卓應(yīng)用程序自動(dòng)化黑盒測(cè)試的方法包括以下步驟:
步驟S101,通過基于ADB命令的安卓應(yīng)用窗口控件識(shí)別方法識(shí)別目標(biāo)窗口中的所有控件信息和目標(biāo)窗口信息;
步驟S102,運(yùn)用安卓應(yīng)用窗口全覆蓋測(cè)試用例自動(dòng)生成方法自動(dòng)生成測(cè)試用例;
步驟S103,運(yùn)用RobotiumEx高重用測(cè)試腳本自動(dòng)生成方法自動(dòng)生成測(cè)試腳本。
在本發(fā)明實(shí)施例中,步驟S101,通過基于ADB命令的安卓應(yīng)用窗口控件識(shí)別方法識(shí)別目標(biāo)窗口中的所有控件信息和目標(biāo)窗口信息時(shí),控件信息包括控件類型、控件名稱和控件屬性,窗口信息包括窗口所在Activity名稱和窗口哈希碼;
如圖2所示,通過基于ADB命令的安卓應(yīng)用窗口控件識(shí)別方法識(shí)別目標(biāo)窗口中的所有控件信息和目標(biāo)窗口信息包括以下步驟:
步驟(1),通過ADB向設(shè)備分別發(fā)送dump和adb shell dumpsys window w|findstr mCurrent命令;
步驟(2),通過執(zhí)行dump命令獲得保存當(dāng)前設(shè)備屏幕上的窗口控件信息的xml文件,通過執(zhí)行adb shell dumpsys window w|findstr mCurrent命令獲得當(dāng)前窗口所屬的Activity名和窗口哈希碼;
步驟(3),把獲得的xml文件抓取到本地主機(jī)上,對(duì)其進(jìn)行解析,并把獲得的當(dāng)前窗口所屬的Activity名和窗口哈希碼信息加入控件信息中,生成控件節(jié)點(diǎn)列表;
步驟(4),把生成的控件節(jié)點(diǎn)列表重新寫入一個(gè)xml文件中。
在本發(fā)明實(shí)施例中,步驟S102,運(yùn)用安卓應(yīng)用窗口全覆蓋測(cè)試用例自動(dòng)生成方法自動(dòng)生成測(cè)試用例時(shí),需要構(gòu)建一個(gè)基于安卓應(yīng)用窗口的遍歷模型,遍歷模型為一個(gè)有向圖,圖節(jié)點(diǎn)表示一個(gè)窗口節(jié)點(diǎn),而圖的邊表示一個(gè)模擬動(dòng)作,在基于窗口的遍歷模型中,窗口標(biāo)識(shí)(Window Flag)用于唯一標(biāo)識(shí)一個(gè)窗口,在窗口標(biāo)識(shí)中保存了Activity名稱和窗口哈希碼信息,可通過分別對(duì)Activity名稱和窗口哈希碼進(jìn)行對(duì)比來判斷兩個(gè)窗口是否相同;任務(wù)(Task)可表示為(窗口標(biāo)識(shí),動(dòng)作,控件節(jié)點(diǎn))這樣一個(gè)三元組,其中窗口標(biāo)識(shí)表示一個(gè)動(dòng)作在此窗口下執(zhí)行,動(dòng)作表示一個(gè)待模擬的操作,控件節(jié)點(diǎn)表示待模擬操作所屬控件,只有當(dāng)應(yīng)用程序運(yùn)行到此窗口且此窗口上的動(dòng)作被執(zhí)行后,一個(gè)任務(wù)才算被執(zhí)行;窗口節(jié)點(diǎn)(Window Node)中保存了與窗口相關(guān)的所有信息,其中包括對(duì)應(yīng)的窗口標(biāo)識(shí)、當(dāng)前窗口中包含的所有待執(zhí)行的任務(wù)形成的任務(wù)列表、父節(jié)點(diǎn)、子節(jié)點(diǎn)列表、從起始窗口節(jié)點(diǎn)到當(dāng)前窗口節(jié)點(diǎn)的路徑上執(zhí)行的所有任務(wù)列表以及當(dāng)前窗口中的轉(zhuǎn)換列表;轉(zhuǎn)換(Transition)用于表示模型中的一個(gè)轉(zhuǎn)換關(guān)系,它保存了任務(wù)和窗口節(jié)點(diǎn)信息,其中任務(wù)表示當(dāng)前窗口節(jié)點(diǎn)中的一個(gè)任務(wù),而節(jié)點(diǎn)表示任務(wù)執(zhí)行后所產(chǎn)生的子節(jié)點(diǎn);
如圖3所示,運(yùn)用安卓應(yīng)用窗口全覆蓋測(cè)試用例自動(dòng)生成方法自動(dòng)生成測(cè)試用例包括以下步驟:
步驟(1),通過基于ADB命令的安卓應(yīng)用窗口控件識(shí)別方法識(shí)別目標(biāo)窗口中的所有控件信息和目標(biāo)窗口信息,根據(jù)控件類型為每個(gè)控件生成一個(gè)任務(wù),形成任務(wù)列表,根據(jù)窗口信息生成窗口標(biāo)識(shí),并把窗口標(biāo)識(shí)加入窗口節(jié)點(diǎn)中;
步驟(2),如果窗口節(jié)點(diǎn)的任務(wù)列表不為空,依次從任務(wù)列表中取出一個(gè)任務(wù),并根據(jù)窗口標(biāo)識(shí)判斷當(dāng)前窗口是否為執(zhí)行任務(wù)所需要的窗口,如果是所需窗口,則直接執(zhí)行任務(wù),如果不是所需窗口,則先恢復(fù)到當(dāng)前任務(wù)所需要的窗口,然后執(zhí)行任務(wù);
步驟(3),判斷執(zhí)行這個(gè)任務(wù)后窗口是否發(fā)生切換;
步驟(4),如果發(fā)生切換,則判斷是否跳轉(zhuǎn)到其他應(yīng)用的窗口中,如果跳轉(zhuǎn)到其它應(yīng)用的窗口中,則重啟應(yīng)用程序,循環(huán)步驟(1)、步驟(2)、步驟(3),否則把當(dāng)前任務(wù)加入到任務(wù)執(zhí)行路徑列表中,循環(huán)步驟(1),獲取跳轉(zhuǎn)后的窗口節(jié)點(diǎn)信息,把新窗口節(jié)點(diǎn)信息和當(dāng)前執(zhí)行的任務(wù)加入到當(dāng)前轉(zhuǎn)換中,把當(dāng)前轉(zhuǎn)換添加到當(dāng)前窗口節(jié)點(diǎn)的轉(zhuǎn)換列表中,同時(shí)把前一個(gè)窗口節(jié)點(diǎn)添加為新窗口節(jié)點(diǎn)的父窗口節(jié)點(diǎn);
步驟(5),如果沒有發(fā)生切換,循環(huán)步驟(2)、步驟(3);
步驟(6),判斷當(dāng)前窗口是否為結(jié)束窗口,即點(diǎn)擊這個(gè)窗口上的任何控件都不會(huì)切換到新的窗口,如果為結(jié)束窗口則根據(jù)任務(wù)執(zhí)行路徑列表生成一個(gè)測(cè)試用例,同時(shí)刪除任務(wù)執(zhí)行路徑列表中最后一個(gè)任務(wù);
步驟(7),判斷是否遍歷完整個(gè)應(yīng)用程序,如果已經(jīng)遍歷完整個(gè)應(yīng)用程序,則整個(gè)遍歷結(jié)果,如果沒有遍歷完整個(gè)應(yīng)用程序,則返回上一個(gè)窗口,遞歸執(zhí)行前面六個(gè)步驟,從而實(shí)現(xiàn)對(duì)整個(gè)應(yīng)用進(jìn)行遍歷。
在步驟(2)中,恢復(fù)到所需窗口的過程為:
先從任務(wù)中獲取任務(wù)執(zhí)行所需要的目標(biāo)窗口標(biāo)識(shí),然后獲取應(yīng)用程序當(dāng)前窗口標(biāo)識(shí),如果目標(biāo)窗口標(biāo)識(shí)和當(dāng)前窗口標(biāo)識(shí)相同則不做處理,如果不同則模擬返回操作返回前一個(gè)窗口,再判斷返回后的窗口標(biāo)識(shí)是否為目標(biāo)窗口標(biāo)識(shí);重復(fù)上述過程,直到找到目標(biāo)窗口為止;如果退回到應(yīng)用程序的起始窗口還沒有找到目標(biāo)窗口,則從目標(biāo)窗口節(jié)點(diǎn)中獲取保存的已經(jīng)執(zhí)行的任務(wù)列表,從起始窗口開始,依次執(zhí)行任務(wù)列表中的任務(wù),直到運(yùn)行到目標(biāo)窗口。
在步驟(6)中,生成的測(cè)試用例保存在Excel文檔中,測(cè)試用例的內(nèi)容包括測(cè)試用例名稱、操作步驟、當(dāng)前Activity名稱、目標(biāo)Activity名稱、被測(cè)控件的相關(guān)信息、操作關(guān)鍵字、結(jié)果檢查關(guān)鍵字、輸入數(shù)據(jù)和預(yù)期輸出數(shù)據(jù)字段。
在本發(fā)明實(shí)施例中,在步驟S102中,運(yùn)用安卓應(yīng)用窗口全覆蓋測(cè)試用例自動(dòng)生成方法自動(dòng)生成測(cè)試用例時(shí),可使用<Activity名稱、當(dāng)前窗口截圖>替代<Activity名稱、窗口哈希碼>來唯一標(biāo)識(shí)一個(gè)安卓應(yīng)用窗口。
在本發(fā)明實(shí)施例中,在步驟S103中,運(yùn)用RobotiumEx高重用測(cè)試腳本自動(dòng)生成方法自動(dòng)生成測(cè)試腳本時(shí),首先對(duì)Robotium框架中Solo類包含的常用方法進(jìn)行封裝,然后通過在Excel文檔中輸入相應(yīng)的關(guān)鍵字調(diào)用封裝好的測(cè)試腳本生成方法,自動(dòng)生成測(cè)試腳本;
運(yùn)用RobotiumEx高重用測(cè)試腳本自動(dòng)生成方法自動(dòng)生成測(cè)試腳本包括以下步驟:
步驟(1),對(duì)Robotium框架中Solo類包含的常用方法進(jìn)行封裝,得到常用的測(cè)試腳本生成方法;
步驟(2),給封裝好的測(cè)試腳本生成方法綁定相應(yīng)的關(guān)鍵字,形成RobotiumEx自動(dòng)化測(cè)試框架;
步驟(3),運(yùn)用安卓應(yīng)用窗口全覆蓋測(cè)試用例自動(dòng)生成方法生成Excel測(cè)試用例文檔;
步驟(4),在生成的測(cè)試用例文檔中添加相應(yīng)的測(cè)試數(shù)據(jù)和關(guān)鍵字;
步驟(5),讀取添加關(guān)鍵字和測(cè)試數(shù)據(jù)后的測(cè)試用例,獲取測(cè)試用例對(duì)應(yīng)的所有關(guān)鍵字,依次通過關(guān)鍵字調(diào)用相應(yīng)的測(cè)試腳本生成方法,為測(cè)試用例自動(dòng)生成測(cè)試腳本。
如圖5所示,本發(fā)明的另一目的在于提供一種安卓應(yīng)用程序自動(dòng)化黑盒測(cè)試的系統(tǒng),該安卓應(yīng)用程序自動(dòng)化黑盒測(cè)試的系統(tǒng)包括:
基于ADB命令的安卓應(yīng)用窗口控件識(shí)別模塊51,用于獲取當(dāng)前窗口的控件信息和窗口信息,控件信息包括控件類型、控件名稱和控件屬性,窗口信息包括窗口所在Activity名稱和窗口哈希碼;
安卓應(yīng)用窗口全覆蓋測(cè)試用例自動(dòng)生成模塊52,與基于ADB命令的安卓應(yīng)用窗口控件識(shí)別模塊51相連接,用于根據(jù)深度優(yōu)先遍歷方式,在自動(dòng)生成測(cè)試用例的過程中對(duì)安卓應(yīng)用窗口進(jìn)行全覆蓋;
RobotiumEx高重用測(cè)試腳本自動(dòng)生成模塊53,與安卓應(yīng)用窗口全覆蓋測(cè)試用例自動(dòng)生成模塊52相連接,用于對(duì)Robotium框架中Solo類包含的常用方法進(jìn)行封裝,并通過在Excel文檔中輸入相應(yīng)的關(guān)鍵字調(diào)用封裝好的測(cè)試腳本生成方法,自動(dòng)生成測(cè)試腳本。
下面結(jié)合附圖及具體實(shí)施例對(duì)本發(fā)明的應(yīng)用原理作進(jìn)一步描述。
本發(fā)明實(shí)施例提供的安卓應(yīng)用程序自動(dòng)化黑盒測(cè)試的方法包含:基于ADB命令的安卓應(yīng)用窗口控件識(shí)別方法、安卓應(yīng)用窗口全覆蓋測(cè)試用例自動(dòng)生成方法和RobotiumEx高重用測(cè)試腳本自動(dòng)生成方法三大部分,首先通過基于ADB命令的安卓應(yīng)用窗口控件識(shí)別方法識(shí)別目標(biāo)窗口中的所有控件信息和目標(biāo)窗口信息;然后運(yùn)用安卓應(yīng)用窗口全覆蓋測(cè)試用例自動(dòng)生成方法自動(dòng)生成測(cè)試用例;最后運(yùn)用RobotiumEx高重用測(cè)試腳本自動(dòng)生成方法自動(dòng)生成測(cè)試腳本。從而達(dá)到在不需要程序源碼的情況下提高測(cè)試的自動(dòng)化程度、界面覆蓋率和提高測(cè)試腳本的可重用性的目的。
本發(fā)明提出了一種安卓應(yīng)用窗口全覆蓋測(cè)試用例自動(dòng)生成和RobotiumEx高重用測(cè)試腳本自動(dòng)生成的自動(dòng)化黑盒測(cè)試方法,該方法包含基于ADB命令的安卓應(yīng)用窗口控件識(shí)別、安卓應(yīng)用窗口全覆蓋測(cè)試用例自動(dòng)生成和RobotiumEx高重用測(cè)試腳本自動(dòng)生成三部分。
1)基于ADB命令的安卓應(yīng)用窗口控件識(shí)別
該部分用于獲取當(dāng)前窗口的控件信息和窗口信息,控件信息包括控件類型、控件名稱和控件屬性等,窗口信息包括窗口所在Activity名稱和窗口哈希碼?;贏DB命令的安卓應(yīng)用窗口控件識(shí)別過程如圖2所示。
主要步驟如下:
(1)通過ADB向設(shè)備分別發(fā)送dump和adb shell dumpsys window w|findstr mCurrent命令;
(2)通過執(zhí)行dump命令獲得保存當(dāng)前設(shè)備屏幕上的窗口控件信息的xml文件,通過執(zhí)行adb shell dumpsys window w|findstr mCurrent命令獲得當(dāng)前窗口所屬的Activity名和窗口哈希碼;
(3)把獲得的xml文件抓取到本地主機(jī)上,對(duì)其進(jìn)行解析,并把獲得的當(dāng)前窗口所屬的Activity名和窗口哈希碼信息加入控件信息中,生成控件節(jié)點(diǎn)列表;
(4)把生成的控件節(jié)點(diǎn)列表重新寫入一個(gè)xml文件中。
2)安卓應(yīng)用窗口全覆蓋測(cè)試用例自動(dòng)生成
根據(jù)深度優(yōu)先遍歷思想,本發(fā)明提出了一種安卓應(yīng)用窗口全覆蓋測(cè)試用例自動(dòng)生成方法,這種方法的特征為可以在自動(dòng)生成測(cè)試用例的過程中對(duì)安卓應(yīng)用窗口進(jìn)行全覆蓋。其中在運(yùn)用這種方法自動(dòng)生成測(cè)試用例的過程中需要構(gòu)建一個(gè)基于安卓應(yīng)用窗口的遍歷模型,這個(gè)遍歷模型為一個(gè)有向圖,圖節(jié)點(diǎn)表示一個(gè)窗口節(jié)點(diǎn),而圖的邊表示一個(gè)模擬動(dòng)作。
為了更好地描述基于窗口的遍歷模型,本發(fā)明對(duì)以下概念進(jìn)行了定義:
定義:窗口標(biāo)識(shí)(Window Flag)用于唯一標(biāo)識(shí)一個(gè)窗口,在窗口標(biāo)識(shí)中保存了Activity名稱和窗口哈希碼信息,可以通過分別對(duì)Activity名稱和窗口哈希碼進(jìn)行對(duì)比來判斷兩個(gè)窗口是否相同。
定義:任務(wù)(Task)可表示為(窗口標(biāo)識(shí),動(dòng)作,控件節(jié)點(diǎn))這樣一個(gè)三元組,其中窗口標(biāo)識(shí)表示一個(gè)動(dòng)作在此窗口下執(zhí)行,動(dòng)作表示一個(gè)待模擬的操作,控件節(jié)點(diǎn)表示待模擬操作所屬控件,只有當(dāng)應(yīng)用程序運(yùn)行到此窗口且此窗口上的動(dòng)作被執(zhí)行后,一個(gè)任務(wù)才算被執(zhí)行。
定義:窗口節(jié)點(diǎn)(Window Node)中保存了與窗口相關(guān)的所有信息,其中包括對(duì)應(yīng)的窗口標(biāo)識(shí)、當(dāng)前窗口中包含的所有待執(zhí)行的任務(wù)形成的任務(wù)列表、父節(jié)點(diǎn)、子節(jié)點(diǎn)列表、從起始窗口節(jié)點(diǎn)到當(dāng)前窗口節(jié)點(diǎn)的路徑上執(zhí)行的所有任務(wù)列表以及當(dāng)前窗口中的轉(zhuǎn)換列表。
定義:轉(zhuǎn)換(Transition)用于表示模型中的一個(gè)轉(zhuǎn)換關(guān)系,它保存了任務(wù)和窗口節(jié)點(diǎn)信息,其中任務(wù)表示當(dāng)前窗口節(jié)點(diǎn)中的一個(gè)任務(wù),而節(jié)點(diǎn)表示任務(wù)執(zhí)行后所產(chǎn)生的子節(jié)點(diǎn)。
安卓應(yīng)用窗口全覆蓋測(cè)試用例自動(dòng)生成過程如圖3所示。
主要步驟如下:
(1)通過基于ADB命令的安卓應(yīng)用窗口控件識(shí)別方法識(shí)別目標(biāo)窗口中的所有控件信息和目標(biāo)窗口信息,根據(jù)控件類型為每個(gè)控件生成一個(gè)任務(wù),形成任務(wù)列表,根據(jù)窗口信息生成窗口標(biāo)識(shí),并把它們加入窗口節(jié)點(diǎn)中;
(2)如果窗口節(jié)點(diǎn)的任務(wù)列表不為空,依次從任務(wù)列表中取出一個(gè)任務(wù),并根據(jù)窗口標(biāo)識(shí)判斷當(dāng)前窗口是否為執(zhí)行任務(wù)所需要的窗口,如果是所需窗口,則直接執(zhí)行任務(wù),如果不是所需窗口,則先恢復(fù)到當(dāng)前任務(wù)所需要的窗口,然后執(zhí)行任務(wù);
恢復(fù)到所需窗口的過程為:先從任務(wù)中獲取任務(wù)執(zhí)行所需要的目標(biāo)窗口標(biāo)識(shí),然后獲取應(yīng)用程序當(dāng)前窗口標(biāo)識(shí),如果目標(biāo)窗口標(biāo)識(shí)和當(dāng)前窗口標(biāo)識(shí)相同則不做處理,如果不同則模擬返回操作返回前一個(gè)窗口,再判斷返回后的窗口標(biāo)識(shí)是否為目標(biāo)窗口標(biāo)識(shí)。重復(fù)上述過程,直到找到目標(biāo)窗口為止。如果退回到應(yīng)用程序的起始窗口還沒有找到目標(biāo)窗口,則從目標(biāo)窗口節(jié)點(diǎn)中獲取保存的已經(jīng)執(zhí)行的任務(wù)列表,從起始窗口開始,依次執(zhí)行任務(wù)列表中的任務(wù),直到運(yùn)行到目標(biāo)窗口。
(3)判斷執(zhí)行這個(gè)任務(wù)后窗口是否發(fā)生切換;
(4)如果發(fā)生切換,則判斷是否跳轉(zhuǎn)到其他應(yīng)用的窗口中,如果跳轉(zhuǎn)到其它應(yīng)用的窗口中,則重啟應(yīng)用程序,循環(huán)步驟(1)、(2)、(3)。否則把當(dāng)前任務(wù)加入到任務(wù)執(zhí)行路徑列表中,循環(huán)步驟(1),獲取跳轉(zhuǎn)后的窗口節(jié)點(diǎn)信息,把新窗口節(jié)點(diǎn)信息和當(dāng)前執(zhí)行的任務(wù)加入到當(dāng)前轉(zhuǎn)換中,把當(dāng)前轉(zhuǎn)換添加到當(dāng)前窗口節(jié)點(diǎn)的轉(zhuǎn)換列表中,同時(shí)把前一個(gè)窗口節(jié)點(diǎn)添加為新窗口節(jié)點(diǎn)的父窗口節(jié)點(diǎn);
(5)如果沒有發(fā)生切換,循環(huán)步驟(2)(3);
(6)判斷當(dāng)前窗口是否為結(jié)束窗口,即點(diǎn)擊這個(gè)窗口上的任何控件都不會(huì)切換到新的窗口,如果為結(jié)束窗口則根據(jù)任務(wù)執(zhí)行路徑列表生成一個(gè)測(cè)試用例,同時(shí)刪除任務(wù)執(zhí)行路徑列表中最后一個(gè)任務(wù);
(7)判斷是否遍歷完整個(gè)應(yīng)用程序,如果已經(jīng)遍歷完整個(gè)應(yīng)用程序,則整個(gè)遍歷結(jié)果。如果沒有遍歷完整個(gè)應(yīng)用程序,則返回上一個(gè)窗口,遞歸執(zhí)行前面六個(gè)步驟,從而實(shí)現(xiàn)對(duì)整個(gè)應(yīng)用進(jìn)行遍歷。
生成的測(cè)試用例保存在Excel文檔中,測(cè)試用例的內(nèi)容包括測(cè)試用例名稱、操作步驟、當(dāng)前Activity名稱、目標(biāo)Activity名稱、被測(cè)控件的相關(guān)信息、操作關(guān)鍵字、結(jié)果檢查關(guān)鍵字、輸入數(shù)據(jù)和預(yù)期輸出數(shù)據(jù)等字段。
(3)RobotiumEx高重用測(cè)試腳本自動(dòng)生成
RobotiumEx高重用測(cè)試腳本自動(dòng)生成方法首先對(duì)Robotium框架中Solo類包含的常用方法進(jìn)行封裝;然后通過在Excel文檔中輸入相應(yīng)的關(guān)鍵字調(diào)用封裝好的測(cè)試腳本生成方法,自動(dòng)生成測(cè)試腳本。
主要步驟如下:
(1)對(duì)Robotium框架中Solo類包含的常用方法進(jìn)行封裝,得到常用的測(cè)試腳本生成方法;
(2)給封裝好的測(cè)試腳本生成方法綁定相應(yīng)的關(guān)鍵字,形成RobotiumEx自動(dòng)化測(cè)試框架;
(3)運(yùn)用安卓應(yīng)用窗口全覆蓋測(cè)試用例自動(dòng)生成方法生成Excel測(cè)試用例文檔;
(4)在生成的測(cè)試用例文檔中添加相應(yīng)的測(cè)試數(shù)據(jù)和關(guān)鍵字;
(5)讀取添加關(guān)鍵字和測(cè)試數(shù)據(jù)后的測(cè)試用例,獲取測(cè)試用例對(duì)應(yīng)的所有關(guān)鍵字,依次通過關(guān)鍵字調(diào)用相應(yīng)的測(cè)試腳本生成方法,為測(cè)試用例自動(dòng)生成測(cè)試腳本。
RobotiumEx自動(dòng)化測(cè)試框架封裝了操作關(guān)鍵字和結(jié)果檢查關(guān)鍵字兩種關(guān)鍵字,表1為所封裝的部分關(guān)鍵字表。
表1部分關(guān)鍵字表
下面以SCLICK關(guān)鍵字為例對(duì)關(guān)鍵字的封裝過程進(jìn)行詳細(xì)介紹,SCLICK關(guān)鍵字的封裝過程如圖4所示。
本發(fā)明技術(shù)方案帶來的有益效果
(1)由于一個(gè)Activity可能包含多個(gè)不同的窗口,同一個(gè)Activity中的窗口可以相互切換,基于Activity的遍歷模型其實(shí)并沒有真正建立顯示界面之間的切換關(guān)系,因此安卓應(yīng)用窗口全覆蓋測(cè)試用例自動(dòng)生成方法可以提高測(cè)試的界面覆蓋率。
(2)由于在使用Robotium編寫測(cè)試腳本的時(shí)候,測(cè)試數(shù)據(jù)是包含在腳本中的,當(dāng)測(cè)試數(shù)據(jù)發(fā)生變化時(shí)候,就需要修改測(cè)試腳本,代碼重用性不高。而RobotiumEx高重用測(cè)試腳本自動(dòng)生成方法在測(cè)試數(shù)據(jù)發(fā)生變化時(shí)候,只需修改測(cè)試用例文檔中的測(cè)試數(shù)據(jù)即可,從而提高了測(cè)試腳本的可重用性。
在運(yùn)用安卓應(yīng)用窗口全覆蓋測(cè)試用例自動(dòng)生成方法自動(dòng)生成測(cè)試用例這一步驟中,可以使用<Activity名稱,當(dāng)前窗口截圖>替代<Activity名稱,窗口哈希碼>來唯一標(biāo)識(shí)一個(gè)安卓應(yīng)用窗口。
本發(fā)明根據(jù)深度優(yōu)先遍歷思想,提出了一種安卓應(yīng)用窗口全覆蓋測(cè)試用例自動(dòng)生成方法,這種方法可以在自動(dòng)生成測(cè)試用例的過程中對(duì)安卓應(yīng)用窗口進(jìn)行全覆蓋;本發(fā)明對(duì)整個(gè)技術(shù)方案的改進(jìn):首先通過基于ADB命令的安卓應(yīng)用窗口控件識(shí)別方法識(shí)別目標(biāo)窗口中的所有控件信息和目標(biāo)窗口信息,這種方法在獲取控件信息時(shí)只需解析通過ADB命令獲得的控件信息文檔即可得到所有控件信息,并且通過ADB命令可以直接獲取窗口信息,過程簡(jiǎn)單并且節(jié)約時(shí)間;然后運(yùn)用安卓應(yīng)用窗口全覆蓋測(cè)試用例自動(dòng)生成方法自動(dòng)生成測(cè)試用例,這種方法可以在自動(dòng)生成測(cè)試用例的過程中對(duì)安卓應(yīng)用窗口進(jìn)行全覆蓋;最后運(yùn)用RobotiumEx高重用測(cè)試腳本自動(dòng)生成方法自動(dòng)生成測(cè)試腳本,這種方法通過對(duì)Robotium自動(dòng)化測(cè)試框架進(jìn)行封裝,只需在測(cè)試用例文檔中添加關(guān)鍵字和測(cè)試數(shù)據(jù),即可實(shí)現(xiàn)自動(dòng)生成測(cè)試腳本,并且當(dāng)測(cè)試數(shù)據(jù)發(fā)生變化時(shí),只需修改測(cè)試用例文檔中的測(cè)試數(shù)據(jù)即可,而不需修改測(cè)試腳本,從而提高了測(cè)試腳本的可重用性。
以上所述僅為本發(fā)明的較佳實(shí)施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi)所作的任何修改、等同替換和改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。