一種基于占用Android系統(tǒng)智能設備內(nèi)存和CPU的壓力測試方法
【專利摘要】本發(fā)明涉及一種基于占用Android系統(tǒng)智能設備內(nèi)存和CPU的壓力測試方法,在被測設備上安裝agent程序,測試主機首先通過測試腳本運行agent程序,agent程序運行后會啟動一個服務Service,服務中開啟一個線程作為socket服務端監(jiān)聽客戶端的連接請求;測試主機作為socket客戶端發(fā)出連接請求,與agent建立socket連接,通過socket通信機制控制agent程序進行占用Android系統(tǒng)內(nèi)存和CPU的行為;agent程序接受到測試主機端發(fā)送的占用內(nèi)存和CPU的命令后,即開始占用內(nèi)存和CPU,使Android系統(tǒng)資源匱乏,為壓力測試提供條件;然后測試主機端開始各項測試工作,完成測試后發(fā)出停止占用內(nèi)存和CPU的命令,agent程序接收到此項命令便終止占用系統(tǒng)內(nèi)存和CPU的行為;最后,測試主機端通過命令斷開與agent程序的socket連接并使agent程序終止運行。
【專利說明】—種基于占用Android系統(tǒng)智能設備內(nèi)存和CPU的壓力測試方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及一種基于占用Android系統(tǒng)智能設備內(nèi)存和CPU的壓力測試方法,屬于軟件可靠性測試【技術(shù)領(lǐng)域】,為Android軟件壓力測試提供條件。
【背景技術(shù)】
[0002]Google開發(fā)的Android系統(tǒng),作為智能手機操作系統(tǒng)之一,是基于Linux平臺的開源手機操作系統(tǒng),如今已占據(jù)全球智能手機操作系統(tǒng)市場大部分的份額。用戶對Android應用的需求與日俱增,所以,為更加快速有效地開發(fā)出穩(wěn)定的應用,測試技術(shù)就顯得尤為重要。
[0003]壓力測試是保證軟件質(zhì)量的重要測試工作,在軟件所需資源(內(nèi)存、CPU等)匱乏的條件下進行測試工作。然而在Android系統(tǒng)中進行資源的占用與傳統(tǒng)的計算機中資源占用情況是有較大區(qū)別的,例如,Android框架對每個進程的內(nèi)存可用大小限制在幾十M,這就給內(nèi)存占用增加了難度。
[0004]Monkey是Android系統(tǒng)自帶的一個命令行工具,它通過向系統(tǒng)發(fā)送偽隨機的用戶事件流,實現(xiàn)對應用程序進行壓力測試。但是Monkey只是模擬巨大的工作負荷(一連串事件的執(zhí)行)以查看應用程序是否有異常情況出現(xiàn),它并沒有對系統(tǒng)的資源進行大量主動的占用,也就是說,Monkey沒有能讓應用程序在系統(tǒng)資源匱乏的條件下進行測試工作。
【發(fā)明內(nèi)容】
[0005]本發(fā)明的技術(shù)解決問題:克服現(xiàn)有技術(shù)的不足,提供一種占用Android系統(tǒng)智能設備內(nèi)存和CPU以支持壓力測試方法。軟件測試中測試主機端通過socket通信能隨時控制占用或停止占用被測設備內(nèi)存和CPU,更好的支持了壓力測試的過程;agent程序使用JNI技術(shù)實現(xiàn)對系統(tǒng)內(nèi)存的占用和停止占用,擺脫了 android框架對進程所能占用內(nèi)存的限制;由于提高了 agent程序中各服務的優(yōu)先權(quán),使得對系統(tǒng)內(nèi)存和CPU的占用更加穩(wěn)定。
[0006]本發(fā)明技術(shù)解決方案:一種基于占用Android系統(tǒng)智能設備內(nèi)存和CPU的壓力測試方法,實現(xiàn)步驟如下:
[0007](I)在被測設備上安裝Android的應用程序即agent程序,測試人員在測試主機上通過編寫測試腳本對被測設備上的軟件進行測試;
[0008](2)壓力測試時,測試主機首先通過測試腳本運行agent程序,agent程序運行后會啟動一個服務Service,服務中開啟一個線程作為socket服務端監(jiān)聽客戶端的連接請求;
[0009](3)測試主機作為socket客戶端發(fā)出連接請求,與agent建立socket連接,通過socket通信機制控制agent程序進行占用Android系統(tǒng)內(nèi)存和CPU的行為;
[0010](4)agent程序接受到測試主機端發(fā)送的占用內(nèi)存和CPU的命令后,即開始占用內(nèi)存和CPU,使Android系統(tǒng)資源匱乏,為壓力測試提供條件;[0011](5)然后測試主機端開始各項測試工作,完成測試后發(fā)出停止占用內(nèi)存和CPU的命令,agent程序接收到此項命令便終止占用系統(tǒng)內(nèi)存和CPU的行為;
[0012](6)最后,測試主機端通過命令斷開與agent程序的socket連接并使agent程序終止運行。
[0013]所述步驟(3)中的agent程序進行占用Android系統(tǒng)內(nèi)存行為的實現(xiàn)過程為:
[0014](I)首先agent程序通過接受到的占用Android系統(tǒng)內(nèi)存的命令后,獲取需要的內(nèi)存占用比例大??;
[0015](2)利用 java.lang.ProcessBuilder 類和 java.lang.Process 類創(chuàng)建一個進程,執(zhí)行“cat/proc/meminfo”命令獲取當前內(nèi)存使用信息,解析所述的使用信息得到Android系統(tǒng)總的內(nèi)存大小及當前空閑內(nèi)存大??;
[0016](3)再根據(jù)之前解析的內(nèi)存占用比例計算出需要agent程序占用的內(nèi)存大小,啟動占用內(nèi)存的服務SM,并將所需占用的內(nèi)存大小作為消息參數(shù)傳遞給SM,服務Sm,啟動后,首先加載之前生成好的動態(tài)庫,此動態(tài)庫由實現(xiàn)本地方法即占用內(nèi)存和停止占用內(nèi)存的方法的C++文件生成,在服務中聲明動態(tài)庫中的本地方法便可在服務中調(diào)用這些本地方法;服務Sm獲取需要占用的內(nèi)存大小,然后調(diào)用占用內(nèi)存的本地方法實現(xiàn)內(nèi)存占用操作;
[0017](4)當agent程序接收到停止占用內(nèi)存的命令時,即終止服務Smem的運行;服務Smem被銷毀時調(diào)用停止占用內(nèi)存的本地方法,從而釋放掉自己占用的內(nèi)存。
[0018]所述步驟(3)中的agent程序進行占用Android系統(tǒng)CPU行為的實現(xiàn)過程為:
[0019](I)首先解析命令得到需要把CPU占用比例之后,利用java.lang.ProcessBuilder類和java.lang.Process類創(chuàng)建一個進程,執(zhí)行本地命令“top”并解析其返回結(jié)果得到當前的CPU使用率;
[0020](2)利用當前CPU使用率和需要的CPU占用比例,計算出需要agent占用的CPU比例,把此比例作為消息參數(shù)傳遞給占用CPU的服務Scpu并啟動Sctu ;
[0021](3)服務Sepu啟動后,首先獲得需要占用CPU的比例大小,之后便啟動線程占用一定比例的CPU,每個線程中是一個循環(huán),以一定的時間(幾十毫秒)為周期,每個周期分為兩段時間,一段時間內(nèi)線程做空循環(huán)以占用CPU,另一段時間調(diào)用Thread, sleep O方法睡眠以讓出CPU,通過控制每個周期內(nèi)兩段時間的比例決定進程占單個CPU的比例;
[0022](4)當agent程序接收到停止占用CPU的命令時,即終止服務Sepu,Scpu在結(jié)束前終止所有之前開啟的占用CPU的線程,結(jié)束對CPU的占用。
[0023]本發(fā)明原理:首先,對Android系統(tǒng)內(nèi)存的占用,由于Android框架限制每個進程所能使用的內(nèi)存,超出內(nèi)存限制就會報出00M (Out of Memory)異常,為了能夠占用隨意大小的內(nèi)存,使用JNI技術(shù),調(diào)用C++代碼,在C++代碼中使用mallocO方法分配一定的內(nèi)存,這種方法占用的內(nèi)存大小是不計入Android對進程所能使用內(nèi)存的限制的。為確定所需占用內(nèi)存的大小,就需要知道系統(tǒng)總的內(nèi)存大小和當前已用內(nèi)存大小。在Android程序中利用 java.lang.ProcessBuilder 類和 java.lang.Process 類創(chuàng)建一個進程來執(zhí)行“cat/proc/meminfo”命令并得到此命令的返回結(jié)果,對這些結(jié)果信息進行解析得到所需的內(nèi)存信息。
[0024]在系統(tǒng)CPU的占用方面,采用多線程方法,啟動一個或多個線程占用CPU,每個線程在一段時間內(nèi)一直做一個空循環(huán),另一段時間內(nèi)通過Thread, sleep ()方法睡眠,控制這兩段時間的比例以決定占用CPU的比例大小。對于單核的設備,確定此比例相對容易,多核的就比較復雜,需多個線程配合,例如,對于雙核的設備,要占用小于50%的CPU,開啟一個線程占用CPU并調(diào)整其占用比例來實現(xiàn),而要占用大于50%的CPU,可以讓一個線程完全占用一個核,另一個線程再占用一定比例CPU來配合完成占用所需比例的CPU。與占用內(nèi)存類似,需獲取當前CPU使用信息以確定要占用多少比例的CPU,同樣利用java.lang.ProcessBuilder類和java.lang.Process類創(chuàng)建一個進程,執(zhí)行本地命令“top”并解析其返回結(jié)果得到當前的CPU使用信息。
[0025]上述兩項功能是通過在Android程序(agent)中分別啟動一個服務(Service)實現(xiàn)的。在測試工作開始之前,首先將此Android應用程序安裝到被測設備上,進行壓力測試時,測試人員通過adb(Android Debug Bridge)執(zhí)行shell命令啟動程序,程序運行后會啟動一個服務,服務中開啟一個線程作為socket服務端監(jiān)聽客戶端的連接請求??蛻舳税l(fā)出socket連接請求,成功建立socket連接后,在需要的時候,向socket服務端發(fā)出占用(停止占用)內(nèi)存或CPU的命令,服務端接收到命令后做出相應操作。若是要占用內(nèi)存(CPU),則開啟占用內(nèi)存(CPU)的服務,程序開始占用系統(tǒng)內(nèi)存(CPU);反之,若收到停止占用內(nèi)存(CPU)的服務,則停止占用內(nèi)存(CPU)服務的運行,釋放所占內(nèi)存(CPU)。在占用與停止占用內(nèi)存(CPU)之間便能提供壓力測試的條件(內(nèi)存、CPU資源的匱乏),測試人員可在這種條件下進行各種測試。
[0026]本發(fā)明具有如下優(yōu)點和積極效果:
[0027]( I)測試人員在測試主機端編寫測試腳本對被測設備上的軟件進行測試時,能通過socket通信控制被測設備上agent程序的動作隨時進行占用或停止占用設備的內(nèi)存和CPU,從而能夠隨時為壓力測試提供系統(tǒng)資源匱乏的條件,更方便了測試腳本的編寫,也更好的支持了壓力測試的過程。
[0028](2)Agent程序中使用JNI技術(shù)實現(xiàn)對系統(tǒng)內(nèi)存的占用和停止占用,擺脫了android框架對進程所能占用內(nèi)存的限制。
[0029](3)對agent程序中各個服務進行了保護,提升了各個服務的優(yōu)先權(quán),防止系統(tǒng)在資源匱乏的條件下將agent程序中的服務終止,使agent程序?qū)ο到y(tǒng)內(nèi)存和CPU的占用更加穩(wěn)定。
【專利附圖】
【附圖說明】
[0030]圖1是本發(fā)明測試主機端進行壓力測試的流程示意圖;
[0031]圖2是本發(fā)明中agent程序的工作流程示意圖;
[0032]圖3是agent程序的類圖。
【具體實施方式】
[0033]下面將結(jié)合附圖和實施示例對本發(fā)明作進一步的詳細說明。通過足夠詳細的描述這些實施示例,使得本領(lǐng)域技術(shù)人員能夠理解和實踐本發(fā)明。在不脫離本發(fā)明的主旨和范圍的情況下,可以對實施做出邏輯的、實現(xiàn)的和其他的改變。因此,以下詳細說明不應該被理解為限制意義,本發(fā)明的范圍僅僅由權(quán)利要求來限定。
[0034]軟件自動化測試工作中,測試人員通過編寫測試腳本控制測試過程,進行壓力測試時,測試主機首先運行之前安裝在被測設備上的用于占用系統(tǒng)資源的應用程序(agent)。Agent運行后,作為socket服務端等待客戶端連接請求,測試主機作為socket客戶端發(fā)出連接請求。在建立socket連接之后,便可通過測試腳本的編寫來與agent進行socket通信,控制agent占用和停止占用系統(tǒng)內(nèi)存和CPU,為所需的壓力測試提供條件。
[0035]壓力測試過程如圖1所示,測試人員在編寫腳本時遵循圖示步驟控制測試,腳本中首先執(zhí)行語句啟動agent并與之建立socket連接,然后通過socket通信控制agent占用內(nèi)存和CPU,這樣便可在內(nèi)存和CPU資源匱乏的條件下進行各種壓力測試工作,查看被測軟件在資源不充裕的條件下的運行情況。壓力測試工作完成后,在腳本中執(zhí)行語句,通過socket連接發(fā)出停止占用內(nèi)存和CPU的命令,然后斷開socket連接并結(jié)束agent的運行。
[0036]Agent程序是運行在被測設備上的Android應用程序,開始運行時啟動一個主服務S,主服務開啟一個線程,用于監(jiān)聽socket連接請求,在socket連接建立后接受并解析客戶端發(fā)送過來的命令,根據(jù)命令做出相應操作。
[0037]對于占用系統(tǒng)內(nèi)存的命令,首先解析命令得到需要把內(nèi)存占用率提高到的比例。然后利用 java.lang.ProcessBuilder 類和 java.lang.Process 類創(chuàng)建一個進程執(zhí)行“cat/proc/meminfo”命令獲取當前內(nèi)存使用信息,解析這些信息得到系統(tǒng)總的內(nèi)存大小及當前空閑內(nèi)存大小,再根據(jù)之前解析的內(nèi)存占用比例計算出需要agent占用的內(nèi)存大小。啟動占用內(nèi)存的服務Sm并將所需占用的內(nèi)存大小作為消息參數(shù)傳遞給SM。服務Sm啟動后,首先加載之前生成好的動態(tài)庫,此動態(tài)庫由實現(xiàn)本地方法(占用內(nèi)存和停止占用內(nèi)存的方法)的C++文件生成,在服務中聲明動態(tài)庫中的本地方法便可在服務中調(diào)用這些本地方法。服務Sm獲取需要占用的內(nèi)存大小,然后調(diào)用占用內(nèi)存的本地方法實現(xiàn)內(nèi)存占用操作。
[0038]Socket服務端接收到停止占用內(nèi)存的命令時,即終止服務Sm的運行,服務Sm被銷毀時調(diào)用停止占用內(nèi)存的本地方法,從而釋放掉自己占用的內(nèi)存。
[0039]類似地,當收到占用CPU的命令時,agent主服務S解析命令得到需要把CPU占用率提高到的比例,之后同樣利用java.lang.ProcessBuilder類和java.lang.Process類創(chuàng)建一個進程,執(zhí)行本地命令“top”并解析其返回結(jié)果得到當前的CPU使用率。有了當前CPU使用率和需要的CPU占用比例,便能計算出需要agent占用的CPU比例。把此比例作為消息參數(shù)傳遞給占用CPU的服務Scpu并啟動S-。服務Sctu啟動后,首先獲得需要占用CPU的比例大小,之后便啟動線程占用一定比例的CPU。每個線程中是一個循環(huán),以一定的時間(幾十毫秒)為周期,每個周期分為兩段時間,一段時間內(nèi)線程做空循環(huán)以占用CPU,另一段時間調(diào)用Thread, sleep O方法睡眠以讓出CPU。通過控制每個周期內(nèi)兩段時間的比例決定進程占單個CPU的比例,例如,若使兩段時間相等,那么進程一般可占一個CPU百分之五十左右的使用率。所以,對于單核設備,占用一定比例的CPU比較容易,可只開啟一個線程,把線程循環(huán)周期中做空循環(huán)的時間所占比例設為所需占用CPU的比例即可。多核的情況就比較復雜,要占用大比率的CPU就需要多個線程。下面以雙核為例進行說明,假設需要占用CPU的比例為a,若a小于50%,則開啟一個線程,設置它空循環(huán)時間的比例為2a,那么此線程占用總的CPU (兩個)的比例即為a左右;在壓力測試中,測試人員需要的是資源匱乏的條件,所以一般情況下要占用的CPU使用率會比50%大很多,若a大于50%,開啟兩個線程(只開啟單獨的一個線程不能滿足需求),設置一個線程空循環(huán)時間的比例為100%,另一個線程空循環(huán)時間的比例為(a_50%)*2,這樣兩個線程能占用a的CPU比例。對于更多核的設備,就需要更多線程協(xié)同配合來完成CPU的占用工作,其原理與雙核類似。
[0040]在需要停止占用CPU時,銷毀服務Scpu, Sctu在結(jié)束前終止所有之前開啟的占用CPU的線程。
[0041]圖2所示是agent程序的工作過程,agent被啟動之后首先作為socket服務端,監(jiān)聽客戶端的連接請求,收到socket連接請求并成功建立連接后,agent開始等待客戶端發(fā)送過來的命令。通過對命令的解析,agent決定采取何種動作,對于占用內(nèi)存、占用CPU、停止占用內(nèi)存、停止占用CPU的命令所做操作分別是啟動占用內(nèi)存的服務開始占用內(nèi)存、啟動占用CPU的服務開始占用CPU、停止占用內(nèi)存的服務、停止占用CPU的服務,然后繼續(xù)等待客戶端發(fā)送的命令。當agent收到結(jié)束運行的命令時,agent便結(jié)束程序運行。
[0042]Agent的類圖如圖3所示,作為一個Android應用程序,agent開始運行時首先是啟動一個活動(Activity),該活動馬上啟動主服務(MainService)并結(jié)束自己的運行,從而使agent在后臺運行,主服務創(chuàng)建socket并開始監(jiān)聽客戶端連接請求。主服務(MainService)、占用內(nèi)存的服務(OccupyMemService)和占用CPU的服務(OccupyCPUService)都繼承了 Service類,MainService負責與測試主機的通信,接受命令通過啟動(停止)OccupyMemService、OccupyCPUService完成對系統(tǒng)內(nèi)存和CPU的占用(釋放)。兩個服務OccupyMemService和OccupyCPUService分別實現(xiàn)內(nèi)存占用和CPU占用的功能。
[0043]本發(fā)明未詳細闡述部分屬于本領(lǐng)域技術(shù)人員公知技術(shù)。
【權(quán)利要求】
1.一種基于占用Android系統(tǒng)智能設備內(nèi)存和CPU的壓力測試方法,其特征在于步驟如下: 第一步,在被測設備上安裝Android的應用程序即agent程序,測試人員在測試主機上通過編寫測試腳本對被測設備上的軟件進行測試; 第二步,壓力測試時,測試主機首先通過測試腳本運行agent程序,agent程序運行后會啟動一個服務Service,服務中開啟一個線程作為socket服務端監(jiān)聽客戶端的連接請求; 第三步,測試主機作為socket客戶端發(fā)出連接請求,與agent建立socket連接,通過socket通信機制控制agent程序進行占用Android系統(tǒng)內(nèi)存和CPU的行為; 第四步,agent程序接受到測試主機端發(fā)送的占用內(nèi)存和CPU的命令后,即開始占用內(nèi)存和CPU,使Android系統(tǒng)資源匱乏,為壓力測試提供條件; 第五步,然后測試主機端開始各項測試工作,完成測試后發(fā)出停止占用內(nèi)存和CPU的命令,agent程序接收到此項命令便終止占用系統(tǒng)內(nèi)存和CPU的行為; 第六步,最后,測試主機端通過命令斷開與agent程序的socket連接并使agent程序終止運行。
2.根據(jù)權(quán)利要求1所述的基于占用Android系統(tǒng)智能設備內(nèi)存和CPU的壓力測試方法,其特征在于:所述步驟(3)中的agent程序進行占用Android系統(tǒng)內(nèi)存行為的實現(xiàn)過程為: (1)首先agent程序接受到占用Android系統(tǒng)內(nèi)存的命令后,獲取需要的內(nèi)存占用比例大??; (2)利用java.lang.ProcessBuilder 類和 java.lang.Process 類創(chuàng)建一個進程,執(zhí)行“cat/proc/meminfo”命令獲取當前內(nèi)存使用信息,解析所述的使用信息得到Android系統(tǒng)總的內(nèi)存大小及當前空閑內(nèi)存大??; (3)再根據(jù)之前解析的內(nèi)存占用比例計算出需要agent程序占用的內(nèi)存大小,啟動占用內(nèi)存的服務SM,并將所需占用的內(nèi)存大小作為消息參數(shù)傳遞給SM,服務Sm啟動后,首先加載之前生成好的動態(tài)庫,此動態(tài)庫由實現(xiàn)本地方法即占用內(nèi)存和停止占用內(nèi)存的方法的C++文件生成,在服務中聲明動態(tài)庫中的本地方法便可在服務中調(diào)用這些本地方法;月艮務Sm獲取需要占用的內(nèi)存大小,然后調(diào)用占用內(nèi)存的本地方法實現(xiàn)內(nèi)存占用操作; (4)當agent程序接收到停止占用內(nèi)存的命令時,即終止服務Smem的運行;服務Smem被銷毀時調(diào)用停止占用內(nèi)存的本地方法,從而釋放掉自己占用的內(nèi)存。
3.根據(jù)權(quán)利要求1所述的基于占用Android系統(tǒng)智能設備內(nèi)存和CPU的壓力測試方法,其特征在于:所述步驟(3)中的agent程序進行占用Android系統(tǒng)CPU行為的實現(xiàn)過程為: Cl)首先解析命令得到需要把CPU占用比例之后,利用java.lang.ProcessBuilder類和java.lang.Process類創(chuàng)建一個進程,執(zhí)行本地命令“top”并解析其返回結(jié)果得到當前的CPU使用率; (2)利用當前CPU使用率和需要的CPU占用比例,計算出需要agent占用的CPU比例,把此比例作為消息參數(shù)傳遞給占用CPU的服務Scpu并啟動Sctu ; (3)服務Sepu啟動后,首先獲得需要占用CPU的比例大小,之后便啟動線程占用一定比例的CPU,每個線程中是一個循環(huán),以一定的時間為周期,每個周期分為兩段時間,一段時間內(nèi)線程做空循環(huán)以占用CPU,另一段時間調(diào)用Thread, sleep O方法睡眠以讓出CPU,通過控制每個周期內(nèi)兩段時間的比例決定進程占單個CPU的比例; (4)當agent程序接收到停止占用CPU的命令時,即終止服務Sepu,Sepu在結(jié)束前終止所有之前開啟的占 用CPU的線程,結(jié)束對CPU的占用。
【文檔編號】G06F11/36GK103455416SQ201310303706
【公開日】2013年12月18日 申請日期:2013年7月18日 優(yōu)先權(quán)日:2013年7月18日
【發(fā)明者】姜博, 沈彥鳴, 高小鵬, 王珂, 陳鵬, 萬寒, 龍翔 申請人:北京航空航天大學