一种测试用的压力生成方法及装置的制作方法

文档序号:6430917阅读:144来源:国知局
专利名称:一种测试用的压力生成方法及装置的制作方法
技术领域
本申请涉及服务端性能测试的技术领域,特别是涉及一种测试用的压力生成方法,以及,一种测试用的压力生成装置。
背景技术
性能测试是指,通过生成大量并发和高频率的请求,发送给服务端处理,以使服务器的系统资源处于高压、高饱和状态,从而判断该系统的稳定性和处理能力,并产生数据以供分析。服务端是一种以接口或协议的形式对外提供服务的系统或装置,比如,HTTP服务器 HTTPD, Nginx,或如,数据库服务器 Oracle, Couchdb, Redis 等。服务端的性能测试是指,通过压力生成装置产生大量高并发高频率的访问请求对服务端进行访问,让服务端在长时间高负载情况下运行,检查系统运行正确性、稳定性以及系统资源消耗的测试方法。其区别于UI性能测试、客户端性能测试等。服务端的性能测试一个重要的纬度就是被测试服务器能够支持最高的并发访问数,即在同一个时间点上,大量的请求同时到达,此时服务端处理这些请求的能力,具体可以表现为处理速度,响应时间以及出错率。假设被测试服务端比较慢,但足够稳定,那么理论上的测试结果应该是,处理速度不够快导致高并发请求没有马上都得到反馈,而是每个请求陆续收到应答包,并且导致每个请求的响应时间长短不一,但出错率很低或者为零。以上结果是通过一个性能测试系统来执行测试所得到的结果,因此这个性能测试系统必须能够在理论上同一时间点发出大量请求,以形成高并发的压力。然而现有技术中的性能测试系统存在如下问题第一,现有的性能测试通常采用单进程单线程方式,或单进程多线程方式,生成的并发要么不是真正的并发,要么效率很低无法生成很高的并发,比如I、单进程单线程这种压力生成模型都是通过在一个线程中,通过循环多次建立起多个测试系统和被测试服务端的socket连接,把这些连接放到一个数组中,再遍历这个数组,每次得到一个socket后,对这个socket发送业务请求。这种模型产生的压力在一个时间点上其实只有一个并发,因为它的socket建立以及请求的发送都是顺序的,所以不是真正意义上的高并发压力生成模型。2、单进程多线程这种压力生成模型是在一个进程中生成多个子线程,每个子线程执行建立socket然后发送业务请求,理论上这些子线程是并发生成的请求,但由于压力的生成是在一个进程内完成的,所以无法生成很高的并发。因此,目前需要本领域技术人员解决的一个技术问题就是,如何创造性地提出一种测试用的压力生成机制,用以形成真正的高并发的压力,为服务端性能测试提供高并发高频率的访问请求
发明内容
本申请所要解决的技术问题是提供一种测试用的压力生成方法,用以形成真正的高并发的压力,为服务端性能测试提供高并发高频率的访问请求。本申请还提供了一种测试用的压力生成装置,用以保证上述方法在实际中的应用及实现。为了解决上述问题,本申请公开了一种测试用的压力生成方法,包括获取测试参数信息,所述测试参数信息包括测试需求信息和测试业务逻辑;主进程根据所述测试需求信息产生相应数量的子进程;各子进程分别生成指定数量的子线程;各子线程同时执行所述测试业务逻辑。优选的,所述测试需求信息包括预设的并发数NUM和预先配置的子进程所含子线程数m,所述主进程根据所述测试需求信息产生相应数量的子进程的步骤包括主进程根据所述预设的并发数NUM和预配置的子进程所含子线程数m,通过以下公式计算需要产生的子进程数量η :n = NUM/m ; 判断η是否为整数,若是,则确定所述子进程数量为η ;若否,则确定所述子进程数量为η+1,并配置所述新增子进程中所含子线程数为NUM/m的余数;主进程依据所述确定的子进程数量,生成相应数量的子进程。优选的,所述各子进程分别生成指定数量的子线程的步骤为各子进程依据所述预先配置的子线程数或主进程配置的子线程数,对应生成相应数量的子线程。优选的,所述测试业务逻辑中包括测试业务逻辑函数,所述测试业务逻辑函数包括初始化init函数,执行act函数和结束end函数;所述子线程通过以下子步骤执行所述测试业务逻辑执行init函数,完成当前子线程的初始化操作;执行act函数,由当前子线程循环产生业务请求;在当前产生业务请求的时间达到了预置的业务执行时长,或者,当前产生的业务请求达到了预置的请求次数时,则执行end函数结束当前子线程,并通知相应的子进程当前子线程执行完毕。优选的,所述的方法,还包括主进程等待其所产生的每个子进程结束后,根据所述子进程的运行结果数据生成测试报告。优选的,所述的方法,还包括各子进程等待其所生成的每个子线程结束后,获取各子线程的测试业务逻辑的执行状态,并依据所述执行状态生成子进程的运行结果数据。优选的,所述主进程和子进程共享同一内存空间,并通过所述共享内存空间进行通信。优选的,所述子线程位于其所属子进程的私有内存空间,子线程之间通过其所属子进程的私有内存空间进行通信。本申请实施例还公开了一种测试用的压力生成装置,包括
测试参数获取模块,用于获取测试参数信息,所述测试参数信息包括测试需求信息和测试业务逻辑; 主进程处理模块,用于由主进程根据所述测试需求信息产生相应数量的子进程;子进程处理模块,用于由各子进程分别生成指定数量的子线程;子线程处理模块,用于由各子线程同时执行所述测试业务逻辑。优选的,所述的装置,还包括测试报告生成模块,用于由主进程等待其所产生的每个子进程结束后,根据所述子进程的运行结果数据生成测试报告。与现有技术相比,本申请具有以下优点首先,本申请在测试时使用多进程多线程的压力生成机制,可以利用多个进程的资源,在每个进程内部再生成大量的线程,从而能为服务端性能测试提供高并发高频率的访问请求,实现真正的高并发策略。其次,现有的性能测试机制将并发的生成和压力业务逻辑的实现绑定在一起,导致用户必须要负责实现高并发的代码,也要实现业务逻辑的代码,增加了工作量和学习成本。而本申请将高并发生成的代码抽象出来,成为一个独立的模型。用户仅需通过几个函数指针,将实现的业务逻辑提交至本模型,本模型就可以将这些业务逻辑代码变成高并发的请求,实现压力的生成。在实际应用中,本申请可以使用户不必关注并发压力的生成逻辑,而只需关注如何实现业务逻辑,大大简化了用户的使用成本。最后,基于本申请可以实现一种通用的服务端性能测试机制,该机制无需关心业务的实现细节,可以将测试系统与被测试业务解藕,使得用户不必每次做一个性能测试就要实现一套性能测试系统,而仅需关注于业务的实现和场景的设计,并发压力的生成则由这套通用的测试机制来完成,从而提高了代码重利用率。


图I是本申请的一种测试用的压力生成方法实施例一的流程图;图2是本申请中所指主进程、子进程和子线程的关系示意图;图3是本申请中所指进程内存空间的示意4是本申请的一种测试用的压力生成方法实施例二的流程图;图5是本申请的一种测试用的压力生成装置实施例的结构框图。
具体实施例方式为使本申请的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式
对本申请作进一步详细的说明。本申请的主要思想包括使用多进程多线程的机制,利用多个进程的资源,在每个进程内部生成大量的线程,从而实现真正的高并发。参考图1,其示出了本申请的一种测试用的压力生成方法实施例一的步骤流程图,具体可以包括如下步骤步骤101、获取测试参数信息,所述测试参数信息包括测试需求信息和测试业务逻辑;
在具体实现中,所述测试参数信息可以为用户(如测试人员)输入的测试参数信息,这些信息可以由主进程获取。具体而言,所述测试需求信息可以包括,预设的并发数,预先配置的子进程所含子线程数等;所述测试业务逻辑中可以包括每个虚拟用户执行的时长或者次数,测试业务逻辑函数和函数指针的映射等信息。需要说明的是,所述虚拟用户是指每一个单独的压力源。在本申请实施例中,一个子进程可以看作一组压力源,一个子线程也可以看作一个压力源,也就是说,一个虚拟用户可以理解为一个子线程。步骤102、主进程根据所述测试需求信息产生相应数量的子进程;在本申请的一种优选实施例中,所述测试需求信息可以包括预设的并发数NUM和预先配置的子进程所含子线程数m,在这种情况下,所述步骤102具体可以包括如下子步骤子步骤S11、主进程根据所述预设的并发数NUM和预配置的子进程所含子线程数m,通过以下公式计算需要产生的子进程数量η :n = NUM/m ;子步骤S 12、判断η是否为整数,若是,则执行子步骤S 13;否则,执行子步骤S14 ;子步骤S13、确定所述子进程数量为η ;子步骤S14、确定所述子进程数量为η+1,并配置所述新增子进程中所含子线程数为NUM/m的余数;子步骤S15、主进程依据所述确定的子进程数量,生成相应数量的子进程。例如,假设预设的并发数NUM = 2020,预先配置的子进程所含子线程数m = 50,通过NUM/m取整确定子进程数量η = 40,由于NUM/m还有余数20,于是可新增一个子进程,并配置所述新增的子进程中包含20个子线程。在具体实现中,主进程可以通过执行fork函数循环生成子进程,并在每次循环的时候,分配给每个子进程一个序号。步骤103、各子进程分别生成指定数量的子线程;由于子进程在生成的时候得到了自己所要生成的线程数,所以在具体实现中,各子进程会依据所述预先配置的子线程数或主进程配置的子线程数,对应生成相应数量的子线程。如参考上例,有40个子进程会各自生成50个子线程,新增的I个子进程会生成20个子线程。步骤104、各子线程同时执行所述测试业务逻辑。在本申请的一种优选实施例中,所述测试业务逻辑中包括测试业务逻辑函数,所述测试业务逻辑函数包括初始化init函数,执行act函数和结束end函数;所述子线程通过以下子步骤执行所述测试业务逻辑子步骤S21、执行init函数,完成当前子线程的初始化操作;子步骤S22、执行act函数,由当前子线程循环产生业务请求;子步骤S23、在当前产生业务请求的时间达到了预置的业务执行时长,或者,当前产生的业务请求达到了预置的请求次数时,则执行end函数结束当前子线程,并通知相应的子进程当前子线程执行完毕。参考图2所示的主进程、子进程和子线程的关系示意图,应用本申请实施例,主进程生成11个子进程0 1,0 2,0 3,.. . ,CPn ;每个子进程又各自生成相应数量的子线程,如子进程CPl又生成m个子线程CP1T1,CP1T2,. . .,CPlTm,在执行服务器端性能测试时,通过触发主进程,即可利用多个子进程下各个子线程的资源,每个子线程代表一个并发,也就是虚拟用户,假设每个子进程都生成了 m个子线程,那么本实施例中生成的并发数为m*n。在每个子线程内,都会同时执行性能测试业务逻辑的函数,从而提供高并发高频率的访问请求,实现真正的高并发策略。在本申请实施例中,所述主进程和子进程共享同一内存空间,通过所述内存空间进行通信;所述子线程位于其所属子进程的私有内存空间,子线程之间通过其所属子进程的私有内存空间进行通信。具体可以参考图3所示的进程内存空间的示意图,在具体实现中,主进程会开辟一块进程共享的内存空间,用全局变量mbp来保存指向这个空间的指针,这块内存空间主要用来保存主进程的信息以及每个子进程的信息。在本申请的一种优选实施例中,所述主进程的信息可以保存在一块由bench指针指向的结构体中,而每个子进程的信息可以保存在一块由bench_child指针指向的结构体中。主进程通过mbp计算某个子进程结构体bench_child的偏移量,就可以得到任意一个子进程结构体的信息,这也就完成了主进程与子进程基于所述共享内存空间的通信。在具体实现中,子进程在主进程执行fork O函数(生成子进程)时,获得主进程的一份内存备份,从而得到该子进程所要生成的子线程数,并得到主进程生成的共享内存空间的指针mbp。如前所述,主进程可以通过循环来生成子进程的,每次循环的时候给每个子进程分配一个序号,子进程在被生成后可以继承主进程的变量,从而可以得到这个序号。子进程通过mbp指针和这个序号,再通过计算偏移量,就可以找到自己的bench_child结构体在进程共享内存中的位置,找到后就可以将其初始化。为使本领域技术人员更好地理解本申请,以下对所述共享内存空间中的数据结构进一步说明。( 一 ) bench 结构体I、bench结构体位于进程共享内存空间;2、bench结构体只有一个,由主进程生成;3、主进程在执行时读取测试参数信息,将这些参数信息保存到bench结构体中;4、bench结构体中包括param元素,该元素是一个void* (表示声明一个指针类型变量,该指针为空,不指向任何类型数据。)类型的指针,用途是在每个子进程中传递全局的数据,每个子进程通过该指针和其它子进程进行通讯,例如,某个子进程自己开辟一块进程共享内存,把指针传给param参数,其他子进程通过bench拿到param的值后,就可以对这个内存进行读写操作了。5、bench结构体中包括script元素,该元素指向script结构体,所述script结构体中有若干个函数指针,指向的是测试业务逻辑函数,在测试执行时,每个子线程都可以通过bench结构体得到script的每个元素,然后执行其中的方法以实现测试业务逻辑。主进程在加载时,会获取相应的测试业务逻辑函数,并映射到所述script结构体。
( 二)bench_child 结构体I、bench_child结构体位于进程共享内存空间;2、bench_child结构体的数量与子进程的数量对应,即每个子进程都拥有一个属于自己的bench_child,该结构体由拥用它的子进程生成;3、子进程在生成后将子进程的信息写入到bench_child结构体中;4、每个bench_chiId结构体代表一组并发(一组压力源),该结构体拥有vuser (虚拟用户)的链表指针,通过该链表指针能够得到该子进程下面的每一个子线程的vuser数据结构;5、每个子进程的子线程执行完测试后通知当前子进程,这个通知机制可以通过bench_child结构体中的互斥锁mutex和条件变量cond完成。所述bench_child结构体中有一个count元素,该元素可以理解为一个计数器,代表已完成测试的子线程的数量,如果该元素等于该子进程所包含的子线程数,则代表该子进程的所有子线程已经完成测试任务,子进程可以准备退出了。6、bench_child结构体中包括group元素,该元素代表该子进程在父进程生成时的序号。(三)vuser(虚拟用户)结构体Uvuser结构体位于每个子进程的私有空间;2,vuser结构体代表虚拟用户,或者代表一个并发。也就是说,测试需要多少个并发就会有多少个vuser,每个子进程的每一个子线程都会拥有一个vuser结构体。每个子线程在执行测试业务逻辑函数时,都会传递该结构体指针给这些函数,所以用户提供的测试业务逻辑代码可以读写该结构体,从而实现压力业务逻辑和压力测试逻辑的交互;3、子线程在生成后产生vuser结构体,并且保存到所属子进程bench_child结构体的vuser链表之后;4、vuser结构体中包括统计事件的指针,用以在测试结束后统计每一个虚拟用户的执行状态,从而生成子进程运行结果数据,以用于生成最终的测试报告。子进程可以通过bench_child的vuser元素得到其下每个子线程的vuser信息,所以可以统计这些数据;5、vuser结构体中包括id元素,该元素代表该子线程在所属子进程生成时的序号,表示所属子线程的所有子线程的生成次序;6、vuser结构体中包括group元素,该元素和bench_child的group元素相同。通过组合group和id两个元素,就可以得到该子进程或者vuser的唯一值,这个值可以用于区分本虚拟用户和其他虚拟用户的不同,从而可以实现每个虚拟用户的差异化执行。比如,用不同的用户帐号实现登陆的测试场景要求账号不同,那么可以根据这两个元素的组合找到参数列表中属于该vuser的测试账号,这样就可以实现相应测试场景的测试;7、vuser结构体中包括verb元素,该元素是一个void*类型的指针,每个虚拟用户在执行时可以将要保留的数据分配到堆中,并将堆内存的指针保存到verb元素。之后其他的函数或者下一次执行本函数时,就可以通过vuser结构体的verb元素得到上次的执行结果。例如,通过用init函数执行完登陆后,保存得到的cookie等状态信息,以供act函数构造以登陆状态的请求使用。这就实现了用户提供的测试业务逻辑函数之间的相互通讯机制。
(四)script结构体I、script结构体位于进程共享内存空间;2、script结构体只有一个,由主进程生成;3、主进程在加载时,将用户实现的测试业务逻辑函数映射到script结构体的各个元素,以供每个子进程的每一个子线程访问;4、该结构体的三个元素init, act, end都是函数指针,类型是void*(*fun)(void*);分别映射到用户实现的三个测试业务逻辑函数。执行时会将这些指针函数的线程的vuser结构体指针传入;5、script中包括init元素,该元素用来保存测试业务逻辑的初始化函数指针。性能测试的初始化函数一般用来完成资源的初始化操作,或者完成迭代测试执行的前置步骤,比如注册,登陆等操作,只执行一次,并通过每个虚拟用户的vuser结构体的verb指针,将得到的信息传递给之后执行的业务逻辑函数,比如act和end ;6、script中包括act元素,该元素用来保存测试业务逻辑不断执行的请求函数。在测试执行时会不停的产生压力,就是通过一个循环代码模块来控制该函数执行的,循环条件可以是按次数执行,也可以是按时间执行。当然,上述数据结构的定义仅仅用作示例,本领域技术人员根据实际情况任意增加或减少元素均是可行的,例如,可以在bench_chiId结构体中设置指向主进程结构体bench的指针元素b,通过该元素可以快速访问主进程结构体bench ;或者,还可以在vuser结构体中设置指向子进程结构体bench_child的指针元素b,通过该元素可以快速访问子进程结构体bench_child,以使子线程快速访问子进程。参考图4,示出了本申请的一种测试用的压力生成方法实施例2的步骤流程图,具体可以包括如下步骤步骤401、获取测试参数信息,所述测试参数信息包括测试需求信息和测试业务逻辑;步骤402、主进程根据所述测试需求信息产生相应数量的子进程;步骤403、各子进程分别生成指定数量的子线程;步骤404、各子线程同时执行所述测试业务逻辑;步骤405、各子进程等待其所生成的每个子线程结束后,获取各子线程的测试业务逻辑的执行状态,并依据所述执行状态生成子进程的运行结果数据;步骤406、主进程等待其所产生的每个子进程结束后,根据所述子进程的运行结果数据生成测试报告。为使本领域技术人员更好地理解本申请,以下通过一些具体实例进一步说明用于性能测试的压力生成过程中主进程、子进程和子线程所执行的操作。一、主进程I、获取用户输入的测试参数信息,完成测试业务逻辑函数的映射,并将这些信息保存到bench结构体中。2JARdispatchO函数,计算子进程数量,并且分配每个子进程需要产生的并发子线程数。作为本申请实施例具体应用的一种示例,可以通过并发子线程总数NUM和每个子进程的最大子线程数(假设为m)相除并取整,得到n-Ι个子进程,每个子进程有m个子线程;再判断NUM和m相除是否由余数,如果有,则再生成一个子进程,该子进程的线程数是NUM除以m的余数。3、通过forkO函数生成子进程后,主进程等待每个子进程的结束。例如,在Linux操作系统下可以通过wait O方法等待某个子进程结束,然后计数器加一,继续等待,直到计数器和子进程总数相等为止。4、子进程全部结束后,主进程在通过bench结构体以及每个子进程的bench_child结构体中提供的子进程运行信息分析出数据,生成测试报告。二、子进程I、以子进程CPl为例,在子进程生成前,先初始化该子进程的bench_child结构体
及其元素。比如初始化互斥锁pthread_mutex_init(&bench_child_ > mutex),初始化条件变量 pthread_cond_init (&bench_child_ > cond),子线程计数器清零 i = O 等。2、生成多个子线程,之后通过条件变量等到子线程结束。例如,通过pthread_create O函数生成一个子线程,通过pthread库的pthread_cond_wait函数等待条件变量的信号(可以理解为当前子线程执行完成的信号),得到信号后子线程计数器加1,然后判断子线程计数器和子线程总数是否相等,如果相等则表明子线程都执行完成,否则继续等待。应用本例的优点是,使用条件变量比使用sleep或者空循环策略要有更高的性能,占用极少的Cpu使用率。三、子线程I、子线程生成后,先获得bench结构体指向的script结构体,得到其中的init,act和end三个函数指针;2、执行init函数,并将该子进程的vuser结构体指针传递给它。执行一次;3、执行act函数,并将该子进程的vuser结构体指针传递给它,通过一个循环模块控制执行次数,循环条件可以是用户指定的执行次数或者用户指定的执行时长。在具体实现中,可以通过一个计数器判断是否到达用户指定的执行次数,或者,通过计时器判断是否到达用户指定的执行时长;若否,则记录act函数当前的执行次数或执行时长,若已到达用户指定的执行次数或者用户指定的执行时长;则执行下一步。4、执行end函数,并将该子进程的vuser结构体指针传递给它。5、init, act, end三个测试业务逻辑函数执行完毕后,通过vuser的b指针得到所属子进程的bench_child结构体,对该结构体的count计数器加I (即子线程加I),通过互斥锁加锁保护该变量,防止其他子线程也在对其进行操作。在当前子线程执行完成后,将互斥锁解锁,向条件变量发送信号以通知子进程当前子线程已经执行完毕。需要说明的是,对于前述方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请并不受所描述的动作顺序的限制,因为依据本申请,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本申请所必须的。
参考图5,示出了本申请的一种测试用的压力生成装置实施例的结构框图,具体可以包括如下模块测试参数获取模块501,用于获取测试参数信息,所述测试参数信息包括测试需求信息和测试业务逻辑;主进程处理模块502,用于由主进程根据所述测试需求信息产生相应数量的子进子进程处理模块503,用于由各子进程分别生成指定数量的子线程;子线程处理模块504,用于由各子线程同时执行所述测试业务逻辑。在本申请的一种优选实施例中,所述测试需求信息可以包括预设的并发数NUM和预先配置的子进程所含子线程数m,所述主进程处理模块具体可以包括以下子模块子进程数量计算子模块,用于由主进程根据所述预设的并发数NUM和预配置的子进程所含子线程数m,通过以下公式计算需要产生的子进程数量η n = NUM/m ;子进程数量确定子模块,用于判断η是否为整数,若是,则确定所述子进程数量为η ;若否,则确定所述子进程数量为η+1,并配置所述新增子进程中所含子线程数为NUM/m的余数;子进程生成子模块,用于由主进程依据所述确定的子进程数量,生成相应数量的子进程。在本申请的一种优选实施例中,所述子进程处理模块具体可以包括如下子模块第一子线程生成子模块,用于由各子进程依据所述预先配置的子线程数,对应生成相应数量的子线程;或者,第二子线程生成子模块,用于由各子进程依据所述预先配置的子线程数或主进程配置的子线程数,对应生成相应数量的子线程。在具体实现中,所述测试业务逻辑中可以包括测试业务逻辑函数,优选的是,所述测试业务逻辑函数可以包括初始化init函数,执行act函数和结束end函数;在本实施例中,所述子线程处理模块具体可以包括如下子模块初始化操作子模块,用于执行init函数,完成当前子线程的初始化操作;业务执行子模块,用于执行act函数,由当前子线程循环产生业务请求;业务执行条件判断子模块,用于在当前产生业务请求的时间达到了预置的业务执行时长,或者,当前产生的业务请求达到了预置的请求次数时,则调用结束子模块;结束子模块,用于执行end函数结束当前子线程,并通知相应的子进程当前子线程执行完毕。在实际中,本申请实施例还可以包括子进程运行结果获取模块,用于由各子进程等待其所生成的每个子线程结束后,获取各子线程的测试业务逻辑的执行状态,并依据所述执行状态生成子进程的运行结果数据。以及,测试报告生成模块,用于由主进程等待其所产生的每个子进程结束后,根据所述子进程的运行结果数据生成测试报告。作为实现本申请实施例的一种优选示例,所述主进程和子进程可以共享同一内存空间,并通过所述共享内存空间进行通信。所述子线程位于其所属子进程的私有内存空间,子线程之间通过其所属子进程的私有内存空间进行通信。在具体实现中,本申请可以适用于采用Unix、Linux系统以及它们的衍生版本的服务端的性能测试系统中,在性能测试时,压力生成装置模拟用户的某种业务操作,并将该操作或请求通过多进程多线程的压力生成方法变成高并发高频率的请求,以达到让服务端 受压的目的,并且压力生成装置生成的压力是可控的,比如主控程序可以让每个压力执行指定时间、暂停、恢复、停止、退出等。通过生成大量并发和高频率的请求,发送给服务端(以接口或协议的形式对外提供服务的系统或装置,比如HTTP服务器HTTPD、Nginx或者数据库服务器Oracle、Couchdb、Redis等。)处理,以使服务器的系统资源处于高压高饱和状态,让服务端在长时间高负载情况下运行,从而检查系统运行正确性、稳定性以及系统资源消耗,或判断该系统的稳定性和处理能力,并产生数据以供分析。由于本实施例基本相应于前述图I和图4所不的方法实施例,故本实施例的描述中未详尽之处,可以参见前述实施例中的相关说明,在此就不赘述了。需要说明的是,本申请装置实施例和系统实施例中所涉及的模块、子模块和单元可以为软件,可以为硬件,也可以为软件和硬件的组合。本申请可用于众多通用或专用的计算系统环境或配置中。例如个人计算机、服务器计算机、手持设备或便携式设备、平板型设备、多处理器系统、基于微处理器的系统、置顶盒、可编程的消费电子设备、网络PC、小型计算机、大型计算机、包括以上任何系统或设备的分布式计算环境等等。本申请可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本申请,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或
者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个......”限定的要素,
并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。以上对本申请所提供的一种测试用的压力生成方法,以及,一种测试用的压力生成装置进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式
及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。
权利要求
1.一种测试用的压力生成方法,其特征在于,包括获取测试参数信息,所述测试参数信息包括测试需求信息和测试业务逻辑;主进程根据所述测试需求信息产生相应数量的子进程;各子进程分别生成指定数量的子线程;各子线程同时执行所述测试业务逻辑。
2.如权利要求I所述的方法,其特征在于,所述测试需求信息包括预设的并发数NUM和预先配置的子进程所含子线程数m,所述主进程根据所述测试需求信息产生相应数量的子进程的步骤包括主进程根据所述预设的并发数NUM和预配置的子进程所含子线程数m,通过以下公式计算需要产生的子进程数量η n = NUM/m ;判断η是否为整数,若是,则确定所述子进程数量为η ;若否,则确定所述子进程数量为η+1,并配置所述新增子进程中所含子线程数为NUM/m的余数;主进程依据所述确定的子进程数量,生成相应数量的子进程。
3.如权利要求2所述的方法,其特征在于,所述各子进程分别生成指定数量的子线程的步骤为各子进程依据所述预先配置的子线程数或主进程配置的子线程数,对应生成相应数量的子线程。
4.如权利要求2或3所述的方法,其特征在于,所述测试业务逻辑中包括测试业务逻辑函数,所述测试业务逻辑函数包括初始化init函数,执行act函数和结束end函数;所述子线程通过以下子步骤执行所述测试业务逻辑执行init函数,完成当前子线程的初始化操作;执行act函数,由当前子线程循环产生业务请求;在当前产生业务请求的时间达到了预置的业务执行时长,或者,当前产生的业务请求达到了预置的请求次数时,则执行end函数结束当前子线程,并通知相应的子进程当前子线程执行完毕。
5.如权利要求1、2或3所述的方法,其特征在于,还包括主进程等待其所产生的每个子进程结束后,根据所述子进程的运行结果数据生成测试 艮告。
6.如权利要求5所述的方法,其特征在于,还包括各子进程等待其所生成的每个子线程结束后,获取各子线程的测试业务逻辑的执行状态,并依据所述执行状态生成子进程的运行结果数据。
7.如权利要求1、2或3所述的方法,其特征在于,所述主进程和子进程共享同一内存空间,并通过所述共享内存空间进行通信。
8.如权利要求7所述的方法,其特征在于,所述子线程位于其所属子进程的私有内存空间,子线程之间通过其所属子进程的私有内存空间进行通信。
9.一种测试用的压力生成装置,其特征在于,包括测试参数获取模块,用于获取测试参数信息,所述测试参数信息包括测试需求信息和测试业务逻辑;主进程处理模块,用于由主进程根据所述测试需求信息产生相应数量的子进程;子进程处理模块,用于由各子进程分别生成指定数量的子线程;子线程处理模块,用于由各子线程同时执行所述测试业务逻辑。
10.如权利要求9所述的装置,其特征在于,还包括测试报告生成模块,用于由主进程等待其所产生的每个子进程结束后,根据所述子进程的运行结果数据生成测试报告。
全文摘要
本申请提供了一种测试用的压力生成方法及装置,其中,所述方法包括获取测试参数信息,所述测试参数信息包括测试需求信息和测试业务逻辑;主进程根据所述测试需求信息产生相应数量的子进程;各子进程分别生成指定数量的子线程;各子线程同时执行所述测试业务逻辑。本申请可以形成真正的高并发的压力,为服务端性能测试提供高并发高频率的访问请求。
文档编号G06F11/36GK102955721SQ20111023526
公开日2013年3月6日 申请日期2011年8月16日 优先权日2011年8月16日
发明者崔峥 申请人:阿里巴巴集团控股有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1