序源代碼就可實現(xiàn)自動化測試,而且不需要對應(yīng)用進行重簽名,還可同時測試多個應(yīng)用或多個進程。并且支持所有的安卓系統(tǒng),支持使用控件標識定位,支持操作Web頁面,由于是在計算機上編寫測試用例,因此還可以進行多終端的協(xié)同測試。
[0077]下面采用一個具體的實施例,對圖1和圖2所示方法實施例的技術(shù)方案進行詳細說明。
[0078]圖3為本發(fā)明安卓界面自動化測試方法實施例三中測試樁注入過程的流程圖,如圖3所示,過程包括:
[0079]S301、根據(jù)測試端發(fā)送的測試指令中包含的被測應(yīng)用的代碼查找代碼對應(yīng)的被測應(yīng)用的進程標識。
[0080]S302、將被測應(yīng)用的進程標識對應(yīng)的被測進程附加到目標進程,具體為調(diào)用Ptrace函數(shù)將被測進程附加到目標進程。
[0081]S303、分別獲取mmap函數(shù)、dlopen函數(shù)和dlsym函數(shù)在目標進程中的地址。
[0082]S304、在目標進程中調(diào)用dlopen函數(shù)加載測試樁加載器(libexloader.so)。
[0083]S305、在目標進程中調(diào)用dlsym函數(shù)獲取libexloader.so模塊中目標函數(shù)(1adDex函數(shù))的地址。
[0084]S306、在目標進程中調(diào)用1adDex函數(shù)。
[0085]其中,S306具體為:
[0086]S306a、獲取 JNIEnv 指針。
[0087]S306b、調(diào)用 ClassLoader.getSystemClassLoader 獲取 ClassLoader 類實例。
[0088]S306c、創(chuàng)建DexClassLoader類實例,加載測試樁類。
[0089]S306d、調(diào)用 DexClassLoader.findClass 獲取測試樁類。
[0090]S306e、調(diào)用測試樁類的入口函數(shù)。
[0091]S307、創(chuàng)建Socket服務(wù)端線程,監(jiān)聽測試端發(fā)送的連接。
[0092]S308、調(diào)用Ptrace函數(shù)恢復被測進程運行。
[0093]上述過程完成后,即實現(xiàn)了測試樁的動態(tài)注入,注入完成時,測試樁已經(jīng)在被測進程中創(chuàng)建了 Socket服務(wù)端,用于監(jiān)聽測試端發(fā)送的連接。Socket服務(wù)端監(jiān)聽到來自測試端的測試程序的連接后,與測試端建立連接,建立連接后測試程序會發(fā)送一系列的操作指令給第一服務(wù)端,第一服務(wù)端接收測試程序發(fā)送的操作指令并執(zhí)行操作指令,返回執(zhí)行結(jié)果給測試程序。操作指令包括:獲取控件樹,或,獲取控件文本,或,點擊按鈕等操作。Socket服務(wù)端監(jiān)聽到來自測試端的測試程序的連接后,與測試端建立連接,建立連接后測試程序會發(fā)送一系列的操作指令給第一服務(wù)端,第一服務(wù)端接收測試程序發(fā)送的操作指令并執(zhí)行操作指令,返回執(zhí)行結(jié)果給測試程序。操作指令包括:獲取控件樹,或,獲取控件文本,或,點擊按鈕等操作。
[0094]圖4為本發(fā)明服務(wù)端實施例一的結(jié)構(gòu)示意圖,服務(wù)端運行在安卓設(shè)備上,如圖4所示,本實施例的服務(wù)端可以包括:查找模塊11、處理模塊12、獲取模塊13和創(chuàng)建模塊14,其中,查找模塊11用于根據(jù)測試端發(fā)送的測試指令中包含的被測應(yīng)用的代碼查找代碼對應(yīng)的被測應(yīng)用的進程標識。處理模塊12用于將被測應(yīng)用的進程標識對應(yīng)的被測進程附加到目標進程。獲取模塊13用于分別獲取用于分配內(nèi)存的函數(shù)在目標進程中的第一地址、用于加載動態(tài)鏈接模塊的函數(shù)在目標進程中的第二地址和用于獲取測試樁加載器模塊中目標函數(shù)的地址的函數(shù)在目標進程中的第三地址。創(chuàng)建模塊14用于在目標進程中通過依次調(diào)用用于加載動態(tài)鏈接模塊的函數(shù)、用于獲取測試樁加載器模塊中目標函數(shù)的地址的函數(shù)和目標函數(shù),在被測進程中創(chuàng)建第一服務(wù)端,以使測試端通過第一服務(wù)端對被測進程進行測試。
[0095]進一步地,服務(wù)端還包括:接收模塊,該接收模塊用于在查找模塊根據(jù)測試端發(fā)送的測試指令中包含的被測應(yīng)用的代碼查找代碼對應(yīng)的被測應(yīng)用的進程標識之前,接收測試端發(fā)送的測試信令。
[0096]進一步地,處理模塊12還用于:在目標進程中通過依次調(diào)用用于加載動態(tài)鏈接模塊的函數(shù)、用于獲取測試樁加載器模塊中目標函數(shù)的地址的函數(shù)和目標函數(shù),在被測進程中創(chuàng)建第一服務(wù)端之后,監(jiān)聽來自測試端的測試程序的連接。
[0097]處理模塊12還用于:監(jiān)聽到來自測試端的測試程序的連接后,與測試端建立連接。接收模塊還用于接收測試程序發(fā)送的操作指令。
[0098]處理模塊12還用于執(zhí)行操作指令。
[0099]服務(wù)端還包括:發(fā)送模塊,該發(fā)送模塊用于返回執(zhí)行結(jié)果給測試程序。
[0100]其中,操作指令包括:獲取控件樹,或,獲取控件文本,或,點擊按鈕。
[0101]本實施例的服務(wù)端,可以用于執(zhí)行圖1所示方法實施例的技術(shù)方案,其實現(xiàn)原理類似,此處不再贅述。
[0102]本實施例提供的服務(wù)端,通過查找模塊根據(jù)被測應(yīng)用的代碼查找代碼對應(yīng)的被測應(yīng)用的進程標識后,處理模塊將被測進程附加到目標進程,接著獲取模塊分別獲取mmap函數(shù)、dlopen函數(shù)和dlsym函數(shù)在目標進程中的地址,創(chuàng)建模塊在目標進程中通過依次調(diào)用mmap函數(shù)、dlopen函數(shù)和dlsym函數(shù),完成測試樁的動態(tài)注入,倉Il建了第一服務(wù)端,使得測試端通過該第一服務(wù)端對被測進程進行測試。從而在測試過程中無需獲取被測應(yīng)用的程序源代碼就可實現(xiàn)自動化測試,而且不需要對應(yīng)用進行重簽名,還可同時測試多個應(yīng)用或多個進程。并且支持所有的安卓系統(tǒng),支持使用控件標識定位,支持操作Web頁面,由于是在計算機上編寫測試用例,因此還可以進行多終端的協(xié)同測試。
[0103]圖5為本發(fā)明測試端實施例一的結(jié)構(gòu)示意圖,測試端運行在計算機上,如圖5所示,本實施例的測試端可以包括:發(fā)送模塊21和處理模塊22,其中,發(fā)送模塊21用于向服務(wù)端發(fā)送測試指令,測試指令包含被測應(yīng)用的代碼,以使服務(wù)端接收到測試指令后根據(jù)代碼查找代碼對應(yīng)的被測應(yīng)用的進程標識,在被測應(yīng)用的進程標識對應(yīng)的被測進程中創(chuàng)建第一服務(wù)端。處理模塊22用于通過第一服務(wù)端對被測進程進行測試。
[0104]進一步地,發(fā)送模塊21還用于:在處理模塊通過第一服務(wù)端對被測進程進行測試之前,向服務(wù)端發(fā)送測試程序的連接,以使服務(wù)端監(jiān)聽到連接后與測試端建立連接。
[0105]進一步地,發(fā)送模塊還用于:向服務(wù)端發(fā)送操作指令;
[0106]測試端還包括:接收模塊,該接收模塊用于接收服務(wù)端返回的執(zhí)行結(jié)果。其中,操作指令包括:獲取控件樹,或,獲取控件文本,或,點擊按鈕。
[0107]本實施例的裝置,可以用于執(zhí)行圖2所示方法實施例的技術(shù)方案,其實現(xiàn)原理類似,此處不再贅述。
[0108]本實施例提供的測試端,通過發(fā)送模塊向服務(wù)端發(fā)送測試指令,用于服務(wù)端根據(jù)被測應(yīng)用的代碼查找代碼對應(yīng)的被測應(yīng)用的進程標識后,將被測進程附加到目標進程,接著分別獲取_ap函數(shù)、dlopen函數(shù)和dlsym函數(shù)在目標進程中的地址,在目標進程中通過依次調(diào)用mmap函數(shù)、dlopen函數(shù)和dlsym函數(shù),完成測試樁的動態(tài)注入,倉Il建了第一服務(wù)端,進而處理模塊通過該第一服務(wù)端對被測進程進行測試。從而在測試過程中無需獲取被測應(yīng)用的程序源代碼就可實現(xiàn)自動化測試,而且不需要對應(yīng)用進行重簽名,還可同時測試多個應(yīng)用或多個進程。并且支持所有的安卓系統(tǒng),支持使用控件標識定位,支持操作Web頁面,由于是