數(shù)的分級策略,具體地,將需要測試的函數(shù)分為三類,第一類是應(yīng)用程序中涉及操作系統(tǒng)框架的組件的函數(shù),第二類是應(yīng)用程序中由JAVA語言派生出來的函數(shù),第三類是應(yīng)用程序中自定義函數(shù)。其中,第一類的優(yōu)先級高于第二類,第二類的優(yōu)先級又高于第三類。也就是說,在具體測試過程中,可以先測試第一類函數(shù),在第一類函數(shù)中沒發(fā)現(xiàn)拖慢應(yīng)用程序啟動時間的函數(shù)的情況下,再測試第二類函數(shù),在第二類函數(shù)中也沒有發(fā)現(xiàn)拖慢應(yīng)用程序啟動時間的函數(shù)的情況下,再測試第三類函數(shù)。通過這種分級策略,提高了測試效率。當(dāng)然,本發(fā)明不僅限于此,也可以是同時測試三類函數(shù),或者在這三類函數(shù)中隨機(jī)選擇函數(shù)進(jìn)行測試。
[0034]對于第一類函數(shù),以Android系統(tǒng)為例,應(yīng)用程序中涉及操作系統(tǒng)框架的組件有Activity,Service服務(wù),Content Provider內(nèi)容提供者,BroadcastReceiver廣播接收器等組件,這些組件中涉及開發(fā)人員編寫的函數(shù)是需要測試的函數(shù),例如組件中重寫的函數(shù)。舉例來說,BroadcastReceiver廣播接收器是Android應(yīng)用中一個重要的組件。BroadcastReceiver非常類似于事件編程中的監(jiān)聽器。與普通事件監(jiān)聽器不同的是:普通事件監(jiān)聽器監(jiān)聽的事件源是程序中的對象;而BroadcastReceiver監(jiān)聽的事件源是Android應(yīng)用中的其他組件。當(dāng)需要使用BroadcastReceiver組件接收廣播消息時,開發(fā)人員需要實現(xiàn)自己的BroadcastReceiver子類,并重寫onReceiveO函數(shù)。這里,onReceiveO函數(shù)就是需要測試的函數(shù)之一。
[0035]對于第二類函數(shù),由JAVA語言派生出來的類和方法,指的是繼承或重載JAVA已有類的類和方法。JAVA語言包含許多已實現(xiàn)的類和方法,繼承是從已有的類中派生出新的類,新的類能吸收已有類的數(shù)據(jù)屬性和行為,并能擴(kuò)展新的能力。重載用于創(chuàng)建完成一組任務(wù)相似但參數(shù)的類型或參數(shù)的個數(shù)不同的方法。
[0036]對于第三類函數(shù),開發(fā)人員自定義的類和方法。開發(fā)人員根據(jù)實際需求自定義的類和方法,用以實現(xiàn)特定功能,這些自定義的類和方法與JAVA已有類無繼承關(guān)系,但可能具有引用關(guān)系。
[0037]步驟S202,解析得到應(yīng)用程序中所有需要測試的線程,包括以下線程的一種或多種:繼承線程基類的線程,以及應(yīng)用程序中實現(xiàn)runable接口的線程。
[0038]在Android系統(tǒng)中,當(dāng)一個應(yīng)用程序第一次啟動時,Android會同時啟動一個對應(yīng)的主線程(Main Thread),主線程主要負(fù)責(zé)處理與UI相關(guān)的事件,如用戶的按鍵事件,用戶接觸屏幕的事件以及屏幕繪圖事件,并把相關(guān)的事件分發(fā)到對應(yīng)的組件進(jìn)行處理。在android中有兩種實現(xiàn)線程thread的方法:一種是擴(kuò)展java.1ang.Thread類,另一種是實現(xiàn)runnable接口。因此本發(fā)明通過解析具有這兩種特點的線程作為需要測試的線程。線程兩個最主要的方法是:runO—一包含線程運行時所執(zhí)行的代碼,StartO—一用于啟動線程。
[0039]步驟S203,在應(yīng)用程序啟動過程中,接管函數(shù)和/或線程,記錄函數(shù)和/或線程的執(zhí)行時間和調(diào)用次數(shù)。
[0040]對于函數(shù),通過hook方法接管函數(shù)本身,記錄函數(shù)的執(zhí)行時間和調(diào)用次數(shù)。對于線程,通過hook方法接管線程的run()方法,記錄線程的執(zhí)行時間和調(diào)用次數(shù)。具體的,測試調(diào)用方在需要測試的函數(shù)和/或線程run()方法中設(shè)置hook事件,該hook事件用于監(jiān)測函數(shù)和/或線程run()方法的執(zhí)行時間和調(diào)用次數(shù)。在應(yīng)用程序啟動過程中,一旦某個需要測試的函數(shù)和/或線程run()方法執(zhí)行完成,觸發(fā)hook事件,測試調(diào)用方就會得到通知,繼而得到被測試函數(shù)和/或線程run()方法的執(zhí)行時間和調(diào)用次數(shù)。
[0041 ] 以onReceive()函數(shù)為例,onReceive()是用于處理接收到廣播的函數(shù),通過hook方法可明確知道處理廣播需要的時間,即onReceiveO的執(zhí)行時間。
[0042]步驟S204,根據(jù)函數(shù)和/或線程的單次調(diào)用的執(zhí)行時間和調(diào)用次數(shù),計算所述函數(shù)和/或線程的總執(zhí)行時間。
[0043]在步驟S203中,可以得到函數(shù)和/或線程run()方法的單次調(diào)用的執(zhí)行時間以及調(diào)用次數(shù),如果某些函數(shù)和/或線程run()方法的調(diào)用次數(shù)為多次,則將多次調(diào)用的執(zhí)行時間累加得到總執(zhí)行時間;如果某些函數(shù)和/或線程run()方法的調(diào)用次數(shù)為一次,那么這些函數(shù)和/或線程run()方法的總執(zhí)行時間就是這次調(diào)用的執(zhí)行時間。
[0044]步驟S205,根據(jù)函數(shù)和/或線程的總執(zhí)行時間計算單次調(diào)用的平均執(zhí)行時間。
[0045]將函數(shù)和/或線程run()方法的總執(zhí)行時間除以調(diào)用次數(shù)得到單次調(diào)用的平均執(zhí)行時間。
[0046]步驟S206,根據(jù)函數(shù)和/或線程的總執(zhí)行時間和/或單次調(diào)用的平均執(zhí)行時間,對所有被測試的函數(shù)和/或線程進(jìn)行排序,以供按照排序結(jié)果進(jìn)行應(yīng)用程序的調(diào)試。
[0047]本實施例中,可根據(jù)函數(shù)和/或線程的總執(zhí)行時間對所有被測試的函數(shù)和/或線程進(jìn)行排序,得到一個排序結(jié)果;再根據(jù)函數(shù)和/或線程的單次調(diào)用的平均執(zhí)行時間對所有被測試的函數(shù)和/或線程進(jìn)行排序,得到另一個排序結(jié)果。這兩個排序結(jié)果供開發(fā)人員結(jié)合參考,確定優(yōu)先級進(jìn)行應(yīng)用程序的調(diào)試。排序越靠前的函數(shù)和/或線程的優(yōu)先級越高,開發(fā)人員優(yōu)先對優(yōu)先級高的函數(shù)和/或線程進(jìn)行調(diào)試,確定執(zhí)行時間過長的原因。
[0048]根據(jù)本實施例提供的應(yīng)用程序性能測試方法,首先通過解析確定需要測試的函數(shù)和/或線程,然后啟動應(yīng)用程序,通過hook方法接管函數(shù)和/或線程,記錄函數(shù)和/或線程的執(zhí)行時間和調(diào)用次數(shù),根據(jù)函數(shù)和/或線程的執(zhí)行時間和調(diào)用次數(shù),對所有被測試的函數(shù)和/或線程進(jìn)行排序,以供按照排序結(jié)果進(jìn)行應(yīng)用程序的調(diào)試。本方法深入到應(yīng)用程序內(nèi)部,對應(yīng)用程序內(nèi)部的函數(shù)和/或線程進(jìn)行測試,測試出哪個函數(shù)和/或線程的執(zhí)行時間最長,調(diào)用次數(shù)最多。根據(jù)測試結(jié)果,開發(fā)人員可有針對性的對這些函數(shù)和/或線程進(jìn)行調(diào)試,以解決應(yīng)用程序啟動時間過長的技術(shù)問題。在解析需要測試的函數(shù)時,可按照分級策略進(jìn)行解析,提高了測試效率。
[0049]圖3示出了根據(jù)本發(fā)明一個實施例的應(yīng)用程序性能測試裝置的功能框圖。如圖3所示,該裝置包括:解析模塊301,接管模塊302,排序模塊303。
[0050]解析模塊301,適于解析得到應(yīng)用程序中所有需要測試的函數(shù)和/或線程。解析模塊301通過解析獲取到應(yīng)用程序需要進(jìn)行測試的函數(shù)和/或線程,這些函數(shù)和/或線程都是應(yīng)用程序啟動過程中會執(zhí)行的函數(shù)和/或線程。如果將應(yīng)用程序啟動過程中所有執(zhí)行的函數(shù)和/或線程都進(jìn)行測試,則會造成測試時間過長,且影響整個系統(tǒng)的性能,因此本發(fā)明通過解析從所有執(zhí)行的函數(shù)和/或線程識別出需要測試的函數(shù)和/或線程,過濾出其它沒有必要進(jìn)行測試的函數(shù)和/或線程。本實施例中,解析模塊301進(jìn)一步適于:解析得到應(yīng)用程序中涉及操作系統(tǒng)框架的組件的函數(shù),和/或,解析得到應(yīng)用程序中由JAVA語言派生出來的函數(shù),和/或,解析得到應(yīng)用程序中自定義函數(shù)。
[0051]進(jìn)一步,本裝置提供了解析函數(shù)的分級策略,具體地,將需要測試的函數(shù)分為三類,第一類是應(yīng)用程序中涉及操作系統(tǒng)框架的組件的函數(shù),第二類是應(yīng)用程序中由JAVA語言派生出來的函數(shù),第三類是應(yīng)用程序中自定義函數(shù)。其中,第一類的優(yōu)先級高于第二類,第二類的優(yōu)先級又高于第三類。也就是說,在具體測試過程中,可以先解析并測試第一類函數(shù),在第一類函數(shù)中沒發(fā)現(xiàn)拖慢應(yīng)用程序啟動時間的函數(shù)的情況下,