一种基于占用Android系统智能设备内存和CPU的压力测试方法

文档序号:6506035阅读:1028来源:国知局
一种基于占用Android系统智能设备内存和CPU的压力测试方法
【专利摘要】本发明涉及一种基于占用Android系统智能设备内存和CPU的压力测试方法,在被测设备上安装agent程序,测试主机首先通过测试脚本运行agent程序,agent程序运行后会启动一个服务Service,服务中开启一个线程作为socket服务端监听客户端的连接请求;测试主机作为socket客户端发出连接请求,与agent建立socket连接,通过socket通信机制控制agent程序进行占用Android系统内存和CPU的行为;agent程序接受到测试主机端发送的占用内存和CPU的命令后,即开始占用内存和CPU,使Android系统资源匮乏,为压力测试提供条件;然后测试主机端开始各项测试工作,完成测试后发出停止占用内存和CPU的命令,agent程序接收到此项命令便终止占用系统内存和CPU的行为;最后,测试主机端通过命令断开与agent程序的socket连接并使agent程序终止运行。
【专利说明】—种基于占用Android系统智能设备内存和CPU的压力测试方法
【技术领域】
[0001]本发明涉及一种基于占用Android系统智能设备内存和CPU的压力测试方法,属于软件可靠性测试【技术领域】,为Android软件压力测试提供条件。
【背景技术】
[0002]Google开发的Android系统,作为智能手机操作系统之一,是基于Linux平台的开源手机操作系统,如今已占据全球智能手机操作系统市场大部分的份额。用户对Android应用的需求与日俱增,所以,为更加快速有效地开发出稳定的应用,测试技术就显得尤为重要。
[0003]压力测试是保证软件质量的重要测试工作,在软件所需资源(内存、CPU等)匮乏的条件下进行测试工作。然而在Android系统中进行资源的占用与传统的计算机中资源占用情况是有较大区别的,例如,Android框架对每个进程的内存可用大小限制在几十M,这就给内存占用增加了难度。
[0004]Monkey是Android系统自带的一个命令行工具,它通过向系统发送伪随机的用户事件流,实现对应用程序进行压力测试。但是Monkey只是模拟巨大的工作负荷(一连串事件的执行)以查看应用程序是否有异常情况出现,它并没有对系统的资源进行大量主动的占用,也就是说,Monkey没有能让应用程序在系统资源匮乏的条件下进行测试工作。

【发明内容】

[0005]本发明的技术解决问题:克服现有技术的不足,提供一种占用Android系统智能设备内存和CPU以支持压力测试方法。软件测试中测试主机端通过socket通信能随时控制占用或停止占用被测设备内存和CPU,更好的支持了压力测试的过程;agent程序使用JNI技术实现对系统内存的占用和停止占用,摆脱了 android框架对进程所能占用内存的限制;由于提高了 agent程序中各服务的优先权,使得对系统内存和CPU的占用更加稳定。
[0006]本发明技术解决方案:一种基于占用Android系统智能设备内存和CPU的压力测试方法,实现步骤如下:
[0007](I)在被测设备上安装Android的应用程序即agent程序,测试人员在测试主机上通过编写测试脚本对被测设备上的软件进行测试;
[0008](2)压力测试时,测试主机首先通过测试脚本运行agent程序,agent程序运行后会启动一个服务Service,服务中开启一个线程作为socket服务端监听客户端的连接请求;
[0009](3)测试主机作为socket客户端发出连接请求,与agent建立socket连接,通过socket通信机制控制agent程序进行占用Android系统内存和CPU的行为;
[0010](4)agent程序接受到测试主机端发送的占用内存和CPU的命令后,即开始占用内存和CPU,使Android系统资源匮乏,为压力测试提供条件;[0011](5)然后测试主机端开始各项测试工作,完成测试后发出停止占用内存和CPU的命令,agent程序接收到此项命令便终止占用系统内存和CPU的行为;
[0012](6)最后,测试主机端通过命令断开与agent程序的socket连接并使agent程序终止运行。
[0013]所述步骤(3)中的agent程序进行占用Android系统内存行为的实现过程为:
[0014](I)首先agent程序通过接受到的占用Android系统内存的命令后,获取需要的内存占用比例大小;
[0015](2)利用 java.lang.ProcessBuilder 类和 java.lang.Process 类创建一个进程,执行“cat/proc/meminfo”命令获取当前内存使用信息,解析所述的使用信息得到Android系统总的内存大小及当前空闲内存大小;
[0016](3)再根据之前解析的内存占用比例计算出需要agent程序占用的内存大小,启动占用内存的服务SM,并将所需占用的内存大小作为消息参数传递给SM,服务Sm,启动后,首先加载之前生成好的动态库,此动态库由实现本地方法即占用内存和停止占用内存的方法的C++文件生成,在服务中声明动态库中的本地方法便可在服务中调用这些本地方法;服务Sm获取需要占用的内存大小,然后调用占用内存的本地方法实现内存占用操作;
[0017](4)当agent程序接收到停止占用内存的命令时,即终止服务Smem的运行;服务Smem被销毁时调用停止占用内存的本地方法,从而释放掉自己占用的内存。
[0018]所述步骤(3)中的agent程序进行占用Android系统CPU行为的实现过程为:
[0019](I)首先解析命令得到需要把CPU占用比例之后,利用java.lang.ProcessBuilder类和java.lang.Process类创建一个进程,执行本地命令“top”并解析其返回结果得到当前的CPU使用率;
[0020](2)利用当前CPU使用率和需要的CPU占用比例,计算出需要agent占用的CPU比例,把此比例作为消息参数传递给占用CPU的服务Scpu并启动Sctu ;
[0021](3)服务Sepu启动后,首先获得需要占用CPU的比例大小,之后便启动线程占用一定比例的CPU,每个线程中是一个循环,以一定的时间(几十毫秒)为周期,每个周期分为两段时间,一段时间内线程做空循环以占用CPU,另一段时间调用Thread, sleep O方法睡眠以让出CPU,通过控制每个周期内两段时间的比例决定进程占单个CPU的比例;
[0022](4)当agent程序接收到停止占用CPU的命令时,即终止服务Sepu,Scpu在结束前终止所有之前开启的占用CPU的线程,结束对CPU的占用。
[0023]本发明原理:首先,对Android系统内存的占用,由于Android框架限制每个进程所能使用的内存,超出内存限制就会报出00M (Out of Memory)异常,为了能够占用随意大小的内存,使用JNI技术,调用C++代码,在C++代码中使用mallocO方法分配一定的内存,这种方法占用的内存大小是不计入Android对进程所能使用内存的限制的。为确定所需占用内存的大小,就需要知道系统总的内存大小和当前已用内存大小。在Android程序中利用 java.lang.ProcessBuilder 类和 java.lang.Process 类创建一个进程来执行“cat/proc/meminfo”命令并得到此命令的返回结果,对这些结果信息进行解析得到所需的内存信息。
[0024]在系统CPU的占用方面,采用多线程方法,启动一个或多个线程占用CPU,每个线程在一段时间内一直做一个空循环,另一段时间内通过Thread, sleep ()方法睡眠,控制这两段时间的比例以决定占用CPU的比例大小。对于单核的设备,确定此比例相对容易,多核的就比较复杂,需多个线程配合,例如,对于双核的设备,要占用小于50%的CPU,开启一个线程占用CPU并调整其占用比例来实现,而要占用大于50%的CPU,可以让一个线程完全占用一个核,另一个线程再占用一定比例CPU来配合完成占用所需比例的CPU。与占用内存类似,需获取当前CPU使用信息以确定要占用多少比例的CPU,同样利用java.lang.ProcessBuilder类和java.lang.Process类创建一个进程,执行本地命令“top”并解析其返回结果得到当前的CPU使用信息。
[0025]上述两项功能是通过在Android程序(agent)中分别启动一个服务(Service)实现的。在测试工作开始之前,首先将此Android应用程序安装到被测设备上,进行压力测试时,测试人员通过adb(Android Debug Bridge)执行shell命令启动程序,程序运行后会启动一个服务,服务中开启一个线程作为socket服务端监听客户端的连接请求。客户端发出socket连接请求,成功建立socket连接后,在需要的时候,向socket服务端发出占用(停止占用)内存或CPU的命令,服务端接收到命令后做出相应操作。若是要占用内存(CPU),则开启占用内存(CPU)的服务,程序开始占用系统内存(CPU);反之,若收到停止占用内存(CPU)的服务,则停止占用内存(CPU)服务的运行,释放所占内存(CPU)。在占用与停止占用内存(CPU)之间便能提供压力测试的条件(内存、CPU资源的匮乏),测试人员可在这种条件下进行各种测试。
[0026]本发明具有如下优点和积极效果:
[0027]( I)测试人员在测试主机端编写测试脚本对被测设备上的软件进行测试时,能通过socket通信控制被测设备上agent程序的动作随时进行占用或停止占用设备的内存和CPU,从而能够随时为压力测试提供系统资源匮乏的条件,更方便了测试脚本的编写,也更好的支持了压力测试的过程。
[0028](2)Agent程序中使用JNI技术实现对系统内存的占用和停止占用,摆脱了android框架对进程所能占用内存的限制。
[0029](3)对agent程序中各个服务进行了保护,提升了各个服务的优先权,防止系统在资源匮乏的条件下将agent程序中的服务终止,使agent程序对系统内存和CPU的占用更加稳定。
【专利附图】

【附图说明】
[0030]图1是本发明测试主机端进行压力测试的流程示意图;
[0031]图2是本发明中agent程序的工作流程示意图;
[0032]图3是agent程序的类图。
【具体实施方式】
[0033]下面将结合附图和实施示例对本发明作进一步的详细说明。通过足够详细的描述这些实施示例,使得本领域技术人员能够理解和实践本发明。在不脱离本发明的主旨和范围的情况下,可以对实施做出逻辑的、实现的和其他的改变。因此,以下详细说明不应该被理解为限制意义,本发明的范围仅仅由权利要求来限定。
[0034]软件自动化测试工作中,测试人员通过编写测试脚本控制测试过程,进行压力测试时,测试主机首先运行之前安装在被测设备上的用于占用系统资源的应用程序(agent)。Agent运行后,作为socket服务端等待客户端连接请求,测试主机作为socket客户端发出连接请求。在建立socket连接之后,便可通过测试脚本的编写来与agent进行socket通信,控制agent占用和停止占用系统内存和CPU,为所需的压力测试提供条件。
[0035]压力测试过程如图1所示,测试人员在编写脚本时遵循图示步骤控制测试,脚本中首先执行语句启动agent并与之建立socket连接,然后通过socket通信控制agent占用内存和CPU,这样便可在内存和CPU资源匮乏的条件下进行各种压力测试工作,查看被测软件在资源不充裕的条件下的运行情况。压力测试工作完成后,在脚本中执行语句,通过socket连接发出停止占用内存和CPU的命令,然后断开socket连接并结束agent的运行。
[0036]Agent程序是运行在被测设备上的Android应用程序,开始运行时启动一个主服务S,主服务开启一个线程,用于监听socket连接请求,在socket连接建立后接受并解析客户端发送过来的命令,根据命令做出相应操作。
[0037]对于占用系统内存的命令,首先解析命令得到需要把内存占用率提高到的比例。然后利用 java.lang.ProcessBuilder 类和 java.lang.Process 类创建一个进程执行“cat/proc/meminfo”命令获取当前内存使用信息,解析这些信息得到系统总的内存大小及当前空闲内存大小,再根据之前解析的内存占用比例计算出需要agent占用的内存大小。启动占用内存的服务Sm并将所需占用的内存大小作为消息参数传递给SM。服务Sm启动后,首先加载之前生成好的动态库,此动态库由实现本地方法(占用内存和停止占用内存的方法)的C++文件生成,在服务中声明动态库中的本地方法便可在服务中调用这些本地方法。服务Sm获取需要占用的内存大小,然后调用占用内存的本地方法实现内存占用操作。
[0038]Socket服务端接收到停止占用内存的命令时,即终止服务Sm的运行,服务Sm被销毁时调用停止占用内存的本地方法,从而释放掉自己占用的内存。
[0039]类似地,当收到占用CPU的命令时,agent主服务S解析命令得到需要把CPU占用率提高到的比例,之后同样利用java.lang.ProcessBuilder类和java.lang.Process类创建一个进程,执行本地命令“top”并解析其返回结果得到当前的CPU使用率。有了当前CPU使用率和需要的CPU占用比例,便能计算出需要agent占用的CPU比例。把此比例作为消息参数传递给占用CPU的服务Scpu并启动S-。服务Sctu启动后,首先获得需要占用CPU的比例大小,之后便启动线程占用一定比例的CPU。每个线程中是一个循环,以一定的时间(几十毫秒)为周期,每个周期分为两段时间,一段时间内线程做空循环以占用CPU,另一段时间调用Thread, sleep O方法睡眠以让出CPU。通过控制每个周期内两段时间的比例决定进程占单个CPU的比例,例如,若使两段时间相等,那么进程一般可占一个CPU百分之五十左右的使用率。所以,对于单核设备,占用一定比例的CPU比较容易,可只开启一个线程,把线程循环周期中做空循环的时间所占比例设为所需占用CPU的比例即可。多核的情况就比较复杂,要占用大比率的CPU就需要多个线程。下面以双核为例进行说明,假设需要占用CPU的比例为a,若a小于50%,则开启一个线程,设置它空循环时间的比例为2a,那么此线程占用总的CPU (两个)的比例即为a左右;在压力测试中,测试人员需要的是资源匮乏的条件,所以一般情况下要占用的CPU使用率会比50%大很多,若a大于50%,开启两个线程(只开启单独的一个线程不能满足需求),设置一个线程空循环时间的比例为100%,另一个线程空循环时间的比例为(a_50%)*2,这样两个线程能占用a的CPU比例。对于更多核的设备,就需要更多线程协同配合来完成CPU的占用工作,其原理与双核类似。
[0040]在需要停止占用CPU时,销毁服务Scpu, Sctu在结束前终止所有之前开启的占用CPU的线程。
[0041]图2所示是agent程序的工作过程,agent被启动之后首先作为socket服务端,监听客户端的连接请求,收到socket连接请求并成功建立连接后,agent开始等待客户端发送过来的命令。通过对命令的解析,agent决定采取何种动作,对于占用内存、占用CPU、停止占用内存、停止占用CPU的命令所做操作分别是启动占用内存的服务开始占用内存、启动占用CPU的服务开始占用CPU、停止占用内存的服务、停止占用CPU的服务,然后继续等待客户端发送的命令。当agent收到结束运行的命令时,agent便结束程序运行。
[0042]Agent的类图如图3所示,作为一个Android应用程序,agent开始运行时首先是启动一个活动(Activity),该活动马上启动主服务(MainService)并结束自己的运行,从而使agent在后台运行,主服务创建socket并开始监听客户端连接请求。主服务(MainService)、占用内存的服务(OccupyMemService)和占用CPU的服务(OccupyCPUService)都继承了 Service类,MainService负责与测试主机的通信,接受命令通过启动(停止)OccupyMemService、OccupyCPUService完成对系统内存和CPU的占用(释放)。两个服务OccupyMemService和OccupyCPUService分别实现内存占用和CPU占用的功能。
[0043]本发明未详细阐述部分属于本领域技术人员公知技术。
【权利要求】
1.一种基于占用Android系统智能设备内存和CPU的压力测试方法,其特征在于步骤如下: 第一步,在被测设备上安装Android的应用程序即agent程序,测试人员在测试主机上通过编写测试脚本对被测设备上的软件进行测试; 第二步,压力测试时,测试主机首先通过测试脚本运行agent程序,agent程序运行后会启动一个服务Service,服务中开启一个线程作为socket服务端监听客户端的连接请求; 第三步,测试主机作为socket客户端发出连接请求,与agent建立socket连接,通过socket通信机制控制agent程序进行占用Android系统内存和CPU的行为; 第四步,agent程序接受到测试主机端发送的占用内存和CPU的命令后,即开始占用内存和CPU,使Android系统资源匮乏,为压力测试提供条件; 第五步,然后测试主机端开始各项测试工作,完成测试后发出停止占用内存和CPU的命令,agent程序接收到此项命令便终止占用系统内存和CPU的行为; 第六步,最后,测试主机端通过命令断开与agent程序的socket连接并使agent程序终止运行。
2.根据权利要求1所述的基于占用Android系统智能设备内存和CPU的压力测试方法,其特征在于:所述步骤(3)中的agent程序进行占用Android系统内存行为的实现过程为: (1)首先agent程序接受到占用Android系统内存的命令后,获取需要的内存占用比例大小; (2)利用java.lang.ProcessBuilder 类和 java.lang.Process 类创建一个进程,执行“cat/proc/meminfo”命令获取当前内存使用信息,解析所述的使用信息得到Android系统总的内存大小及当前空闲内存大小; (3)再根据之前解析的内存占用比例计算出需要agent程序占用的内存大小,启动占用内存的服务SM,并将所需占用的内存大小作为消息参数传递给SM,服务Sm启动后,首先加载之前生成好的动态库,此动态库由实现本地方法即占用内存和停止占用内存的方法的C++文件生成,在服务中声明动态库中的本地方法便可在服务中调用这些本地方法;月艮务Sm获取需要占用的内存大小,然后调用占用内存的本地方法实现内存占用操作; (4)当agent程序接收到停止占用内存的命令时,即终止服务Smem的运行;服务Smem被销毁时调用停止占用内存的本地方法,从而释放掉自己占用的内存。
3.根据权利要求1所述的基于占用Android系统智能设备内存和CPU的压力测试方法,其特征在于:所述步骤(3)中的agent程序进行占用Android系统CPU行为的实现过程为: Cl)首先解析命令得到需要把CPU占用比例之后,利用java.lang.ProcessBuilder类和java.lang.Process类创建一个进程,执行本地命令“top”并解析其返回结果得到当前的CPU使用率; (2)利用当前CPU使用率和需要的CPU占用比例,计算出需要agent占用的CPU比例,把此比例作为消息参数传递给占用CPU的服务Scpu并启动Sctu ; (3)服务Sepu启动后,首先获得需要占用CPU的比例大小,之后便启动线程占用一定比例的CPU,每个线程中是一个循环,以一定的时间为周期,每个周期分为两段时间,一段时间内线程做空循环以占用CPU,另一段时间调用Thread, sleep O方法睡眠以让出CPU,通过控制每个周期内两段时间的比例决定进程占单个CPU的比例; (4)当agent程序接收到停止占用CPU的命令时,即终止服务Sepu,Sepu在结束前终止所有之前开启的占 用CPU的线程,结束对CPU的占用。
【文档编号】G06F11/36GK103455416SQ201310303706
【公开日】2013年12月18日 申请日期:2013年7月18日 优先权日:2013年7月18日
【发明者】姜博, 沈彦鸣, 高小鹏, 王珂, 陈鹏, 万寒, 龙翔 申请人:北京航空航天大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1