一种在测试执行中动态调度并发数量的方法及装置与流程

文档序号:14453257阅读:176来源:国知局
一种在测试执行中动态调度并发数量的方法及装置与流程

技术领域

本申请涉及测试技术,特别是涉及在性能测试中,一种在测试执行中动态调度并发数量的方法及装置。



背景技术:

软件测试就是利用测试工具按照测试方案和流程对产品进行功能和性能测试,甚至根据需要编写不同的测试工具,设计和维护测试系统,对测试方案可能出现的问题进行分析和评估。执行测试用例后,需要跟踪故障,以确保开发的产品适合需求。

软件测试中的性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。在性能测试中,包括并发性能测试、疲劳强度测试、大数据量测试和速度测试等,其中并发性能测试是重点。

并发性能测试的过程是一个负载测试和压力测试的过程,即逐渐增加负载,直到系统的瓶颈或者不能接收的性能点,通过综合分析交易执行指标和资源监控指标来确定系统并发性能的过程。

目前,在并发性能测试中,并发请求的调度在一开始执行性能测试的时候就固定了,用户输入了要生成的并发数后,系统就按照这个固定的值去生成并发。但是实际应用中,系统会有许多不同的情况,例如,某系统在夜晚零点,要求用于测试的并发数达到谷底,而在上午九点和中午十二点,又要求并发数达到两个高峰期,但是上述的调度方法在整个测试过程中并发数的生成是固定的,无法模拟该系统的这种测试情况。

因此,在现有的并发性能测试中,上述这种并发调度方法无法模拟复杂的测试场景,导致测试结果不足以说明测试场景所遇到的问题,甚至可能导致测试出现问题。



技术实现要素:

本申请提供了一种在测试执行中动态调度并发数量的方法及装置,以解决测试中并发数固定的问题。

本申请公开了一种在测试执行中动态调度并发数量的方法,包括:

主进程接收用户的操作请求;主进程用于生成多个子进程,每个子进程用于生成多个子线程;

主进程将共享内存中主进程结构体内的操作变量值设置为代表该操作请求的值,向子进程发送通知信号;

子进程在接收到所述通知信号时,通过判断所述共享内存中主进程结构体内的操作变量值,执行相应的操作;

其中,当用户的操作请求为停止、暂停或恢复子进程执行的请求时,子进程执行的相应操作包括:

子进程将共享内存中该子进程结构体内的操作变量值设置为代表所述操作请求的值;

则所述方法还包括:

子进程的每个子线程循环执行测试代码;

子线程在每次循环执行之前,通过判断共享内存中所属子进程结构体内的操作变量值,执行相应的操作;相应的操作包括:继续执行测试,或者不执行直接进入下一次循环,或者直接退出该子进程。

优选地,当用户的操作请求为强制退出测试执行的请求时,子进程执行的相应操作包括:

子进程退出进程操作。

优选地,当用户的操作请求为停止所有子进程执行的请求时:

每个子进程执行的相应操作包括:子进程将共享内存中该子进程结构体内的操作变量值设置为代表停止执行的值;

每个子进程的每个子线程执行的相应操作包括:子线程执行到下一次循环时,判断共享内存中所属子进程结构体内的操作变量值设置为代表停止执行的值,则退出循环操作;

每个子进程执行的相应操作还包括:子进程等到该子进程的每个子线程都退出循环操作后,分析该子进程的测试数据并生成测试报告。

优选地,当用户的操作请求为暂停所有子进程执行的请求时:

每个子进程执行的相应操作包括:子进程将共享内存中该子进程结构体内的操作变量值设置为代表暂停执行的值;

每个子进程的每个子线程执行的相应操作包括:子线程执行到下一次循环时,判断共享内存中所属子进程结构体内的操作变量值设置为代表暂停执行的值,则停止执行该次循环操作,并跳入下一次循环。

优选地,当用户的操作请求为恢复所有子进程执行的请求时:

每个子进程执行的相应操作包括:子进程将共享内存中该子进程结构体内的操作变量值设置为代表继续执行的值;

每个子进程的每个子线程执行的相应操作包括:子线程执行到下一次循环时,判断共享内存中所属子进程结构体内的操作变量值设置为代表继续执行的值,则继续执行循环操作。

优选地,当用户的操作请求为选择性暂停部分子进程执行的请求时,

还包括:主进程遍历共享内存中每个子进程结构体,根据子进程结构体内的操作变量值判断子进程是否正在执行,并将正在执行的子进程标识发给用户;

主进程接收用户选择暂停的子进程标识,将共享内存中主进程结构体内的操作变量值设置为代表选择性暂停部分子进程执行的值,然后向用户选择暂停的子进程发送通知信号;

所述用户选择暂停的子进程执行的相应操作包括:子进程将共享内存中该子进程结构体内的操作变量值设置为代表暂停执行的值;

所述用户选择暂停的子进程的每个子线程执行的相应操作包括:子线程执行到下一次循环时,判断共享内存中所属子进程结构体内的操作变量值设置为代表暂停执行的值,则停止执行该次循环操作,并跳入下一次循环。

优选地,当用户的操作请求为选择性恢复部分子进程执行的请求时,

还包括:主进程遍历共享内存中每个子进程结构体,根据子进程结构体内的操作变量值判断子进程是否暂停执行,并将暂停执行的子进程标识发给用户;

主进程接收用户选择恢复的子进程标识,将共享内存中主进程结构体内的操作变量值设置为代表选择性恢复部分子进程执行的值,然后向用户选择恢复的子进程发送通知信号;

所述用户选择恢复的子进程执行的相应操作包括:子进程将共享内存中该子进程结构体内的操作变量值设置为代表继续执行的值;

所述用户选择恢复的子进程的每个子线程执行的相应操作包括:子线程执行到下一次循环时,判断共享内存中所属子进程结构体内的操作变量值设置为代表继续执行的值,则继续执行循环操作。

优选地,所述主进程接收用户的操作请求之前,还包括:

主进程接收用户发来的调度控制信号,并向用户返回操作菜单;

主进程接收所述操作菜单中用户选择的操作选项,所述操作菜单中的每个操作选项对应一个操作请求。

本申请还公开了一种在测试执行中动态调度并发数量装置,包括:

用户交互单元,用于主进程接收用户的操作请求;主进程用于生成多个子进程,每个子进程用于生成多个子线程;

主进程调度单元,用于主进程将共享内存中主进程结构体内的操作变量值设置为代表该操作请求的值,向子进程发送通知信号;

子进程调度单元,用于子进程在接收到所述通知信号时,通过判断所述共享内存中主进程结构体内的操作变量值,执行相应的操作;

其中,当用户的操作请求为停止、暂停或恢复子进程执行的请求时:

所述子进程调度单元用于子进程将共享内存中该子进程结构体内的操作变量值设置为代表所述操作请求的值;

则所述装置还包括:

子线程调度单元,用于子进程的每个子线程循环执行测试代码;子线程在每次循环执行之前,通过判断共享内存中所属子进程结构体内的操作变量值,执行相应的操作;相应的操作包括:继续执行测试,或者不执行直接进入下一次循环,或者直接退出该子进程。

优选地,当用户的操作请求为强制退出测试执行的请求时,所述子进程调度单元包括:

强制退出子单元,用于子进程退出进程操作。

优选地,当用户的操作请求为停止所有子进程执行的请求时:

所述子进程调度单元包括:进程停止子单元,用于每个子进程执行如下的相应操作:子进程将共享内存中该子进程结构体内的操作变量值设置为代表停止执行的值;

所述子线程调度单元包括:线程停止子单元,用于每个子进程的每个子线程执行如下的相应操作:子线程执行到下一次循环时,判断共享内存中所属子进程结构体内的操作变量值设置为代表停止执行的值,则退出循环操作;

所述子进程调度单元还包括:报告生成子单元,用于子进程等到该子进程的每个子线程都退出循环操作后,分析该子进程的测试数据并生成测试报告。

优选地,当用户的操作请求为暂停所有子进程执行的请求时:

所述子进程调度单元包括:进程暂停子单元,用于每个子进程执行如下的相应操作:子进程将共享内存中该子进程结构体内的操作变量值设置为代表暂停执行的值;

所述子线程调度单元包括:线程暂停子单元,用于每个子进程的每个子线程执行如下的相应操作:子线程执行到下一次循环时,判断共享内存中所属子进程结构体内的操作变量值设置为代表暂停执行的值,则停止执行该次循环操作,并跳入下一次循环。

优选地,当用户的操作请求为恢复所有子进程执行的请求时:

所述子进程调度单元包括:进程恢复子单元,用于每个子进程执行如下的相应操作:子进程将共享内存中该子进程结构体内的操作变量值设置为代表继续执行的值;

所述子线程调度单元包括:线程恢复子单元,用于每个子进程的每个子线程执行如下的相应操作:子线程执行到下一次循环时,判断共享内存中所属子进程结构体内的操作变量值设置为代表继续执行的值,则继续执行循环操作。

优选地,当用户的操作请求为选择性暂停部分子进程执行的请求时:

所述用户交互单元还用于主进程遍历共享内存中每个子进程结构体,根据子进程结构体内的操作变量值判断子进程是否正在执行,并将正在执行的子进程标识发给用户;

所述主进程调度单元用于主进程接收用户选择暂停的子进程标识,将共享内存中主进程结构体内的操作变量值设置为代表选择性暂停部分子进程执行的值,然后向用户选择暂停的子进程发送通知信号;

所述子进程调度单元包括:进程选择性暂停子单元,用于所述用户选择暂停的子进程执行如下的相应操作:子进程将共享内存中该子进程结构体内的操作变量值设置为代表暂停执行的值;

所述子线程调度单元包括:线程选择性暂停子单元,用于所述选择暂停的子进程的每个子线程执行如下的相应操作:子线程执行到下一次循环时,判断共享内存中所属子进程结构体内的操作变量值设置为代表暂停执行的值,则停止执行该次循环操作,并跳入下一次循环。

优选地,当用户的操作请求为选择性恢复部分子进程执行的请求时:

所述用户交互单元还用于主进程遍历共享内存中每个子进程结构体,根据子进程结构体内的操作变量值判断子进程是否暂停执行,并将暂停执行的子进程标识发给用户;

所述主进程调度单元用于主进程接收用户选择恢复的子进程标识,将共享内存中主进程结构体内的操作变量值设置为代表选择性恢复部分子进程执行的值,然后向用户选择恢复的子进程发送通知信号;

所述子进程调度单元包括:进程选择性恢复子单元,用于所述用户选择恢复的子进程执行如下的相应操作:子进程将共享内存中该子进程结构体内的操作变量值设置为代表继续执行的值;

所述子线程调度单元包括:线程选择性恢复子单元,用于所述用户选择恢复的子进程的每个子线程执行如下的相应操作:子线程执行到下一次循环时,判断共享内存中所属子进程结构体内的操作变量值设置为代表继续执行的值,则继续执行循环操作。

优选地,所述用户交互单元还用于主进程接收用户的操作请求之前,接收用户发来的调度控制信号,并向用户返回操作菜单,接收在所述操作菜单中用户选择的操作选项,其中每个操作选项对应一个操作请求。

本申请实施例包括以下优点:

首先,本申请实施例提出一种基于多进程多线程的测试执行的调度方法,在性能测试的过程中,主进程接收用户的操作请求,然后将共享内存中主进程结构体内的操作变量值设置为代表该操作请求的值,再向子进程发送通知信号,子进程接收到所述通知信号后,通过判断所述共享内存中主进程结构体内的操作变量值,执行相应的操作。通过所述的方法,可以根据用户的操作请求,通过改变主进程结构体内的操作变量值,动态的改变进程的执行,控制每一组进程的执行状态,实现几种进程状态之间的转换,从而可以丰富测试场景,相应的也可以制作复杂的测试曲线。

而且,本申请实施例中主进程向子进程发送通知信号时,无论何种操作请求,均发送同种信号,因为该信号起到通知子进程的作用,并没有代表具体的哪种操作请求,因此使用一种信息可以节约可使用的信号量,而且不受限于操作系统的信号量数量,适合在各种实际系统中应用。

其次,本申请实施例还可以实现用户与进程之间的交互,当用户由于某种需求想要改变进程时,可以向主进程发送信号,通过主进程的反馈,选择要改变的进程。由此可使用户与进程之间有一个交互的过程,从而可以改变这些进程的执行状态,调节进程生成的策略和频率,满足用户的各种需求。

再次,本申请实施例可以在不中断测试执行过程的情况下,排查被测系统的性能问题。例如,在压力测试执行过程中,某一时刻发现被测系统有内存溢出状况,通过本申请可以暂停压力的生成,然后由开发人员去排查该溢出问题,观察在压力暂停时溢出是否继续,或者收缩,通过不断的恢复和暂停,降低和升高压力,在不中断整个性能测试执行过程的情况下,完成被测系统问题的排查。

当然,实施本申请的任一产品不一定需要同时达到以上所述的所有优点。

附图说明

图1是本申请实施例的一种在测试执行中动态调度并发数量的方法流程图;

图2是本申请优选实施例的一种在测试执行中动态调度并发数量的方法流程图;

图3是本申请优选实施例的一种在测试执行中动态调度并发数量的方法中主进程的流程图;

图4是本申请优选实施例的一种在测试执行中动态调度并发数量的方法中子进程的流程图;

图5是本申请优选实施例的一种在测试执行中动态调度并发数量的方法中子进程子线程的流程图;

图6是本申请实施例的一种在测试执行中动态调度并发数量的装置结构图。

具体实施方式

为使本申请的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本申请作进一步详细的说明。

为了动态的改变测试过程中的并发数量,本申请提供了一种测试执行的调度方法,用于在性能测试的过程中,通过用户与进程之间的交互,动态的改变进程的执行,控制每一组进程的执行状态。本申请主要适用于各种并发性能测试中。

下面通过实施例对本申请的内容进行详细的说明。

参照图1,是本申请实施例的一种在测试执行中动态调度并发数量的方法流程图。

在本实施例中,所使用的是多进程多线程的执行过程,所述的多线程多进程是指当运行并发操作时,主进程生成多个子进程,每个子进程又生成多个子线程。而且,在主进程初始化的过程中,会生成进程共享的内存区域,在测试执行过程中,所有的进程及其子线程都可以访问共享内存区域,并从中读取变量。

所述方法主要用于在测试执行过程中动态的改变进程的执行,包括以下步骤:

步骤101,主进程接收用户的操作请求;

在性能测试的执行过程中,用户与进程之间可以实现交互,主进程可以通过某种方式,接收用户的操作请求。

本实施例中,一种优选的方式是,在性能测试系统执行时,如果用户想要执行某种操作,可以对主进程发送一个信号,主进程接收到该信号后,返回给用户一个可操作的菜单,用户选择该菜单中某一操作选项并输入给主进程。由于每个操作选项对应一个操作请求,因此用户选择某一操作选项并输入给主进程,即相当于向主进程发送一个操作请求。由此可见,用户可以根据自己的需求,选择相应的操作,控制测试状态。

步骤102,主进程将共享内存中主进程结构体内的操作变量值设置为代表该操作请求的值,向子进程发送通知信号;

主进程在接收到操作请求后,会将共享内存中主进程结构体内的操作变量值,设置为代表该操作请求的值,再向正在执行的子进程发送通知信号。

本实施例中,一种优选的方式是,主进程在接收到选项操作时,会将代表该操作请求的值,赋值给位于共享内存中的主进程结构体内的操作变量,再向每个正在执行测试的子进程发送一个信号。这样就可以动态的改变进程的执行,控制进程执行状态。

步骤103,子进程接收到所述通知信号后,通过判断所述共享内存中主进程结构体内的操作变量值,执行相应的操作。

每个正在执行测试的子进程接收到该信号后,会检查共享内存中的主进程结构体内的操作变量,通过判断该操作变量的值来决定执行怎样的操作,如进程退出、进程暂停、进程恢复等等操作。

综上所述,图1实施例中所述的方法在多进程多线程测试执行过程中,主进程接收用户的操作请求,然后将共享内存中主进程结构体内的操作变量值设置为代表该操作请求的值,再向子进程发送通知信号,子进程接收到所述通知信号后,通过判断所述共享内存中主进程结构体内的操作变量值,执行相应的操作。通过所述的方法,可以根据用户的操作请求,通过改变主进程结构体内的操作变量值,动态的改变进程的执行,控制每一组进程的执行状态,实现几种进程状态之间的转换,从而可以丰富测试场景,相应的也可以制作复杂的测试曲线。

而且,主进程向子进程发送通知信号时,无论何种操作请求,均发送同种信号,因为该信号起到通知子进程的作用,并没有代表具体的哪种操作请求,因此使用一种信息可以节约可使用的信号量,而且不受限于操作系统的信号量数量,适合在各种实际系统中应用。

在实际应用中,性能测试在软件的质量保证中起着重要的作用,它包括的测试内容丰富多样。性能测试包括三个方面:应用在客户端性能的测试、应用在网络上性能的测试和应用在服务器端性能的测试。通常情况下,三方面有效、合理的结合,可以达到对系统性能全面的分析和瓶颈的预测。

其中,服务端性能测试区别于UI性能测试、客户端性能测试等,通过产生大量高请求频率高并发的访问请求对服务端进行访问,让服务端在长时间高负载情况下运行,检查系统运行正确性、稳定性的测试方法。

在服务端性能测试中,负载测试和压力测试都属于性能测试,两者可以结合进行。通过负载测试,确定在各种工作负载下系统的性能,目标是测试当负载逐渐增加时,系统各项性能指标的变化情况。压力测试是通过确定一个系统的瓶颈或者不能接收的性能点,来获得系统能提供的最大服务级别的测试。

为了使本领域技术人员进一步了解本申请的内容,下面以服务端的压力测试为例进行更加详细的说明。

以Xnix系统(Unix及Linux系统,并包括他们的衍生版本)为例,当然所述方法同样适用于Windows等其他操作系统。

下面为本申请的一种优选的实施例,给出了Xnix系统的性能测试系统在压力测试执行中,一种测试系统和用户可交互的压力调度方法。

首先,确定测试系统和用户的交互方式:

主进程接收用户的操作请求之前,主进程会接收用户发来的调度控制信号,并向用户返回操作菜单,用户选择所述操作菜单中的操作选项并发送给主进程,所述操作菜单中的每个操作选项对应一个操作请求。

在性能测试系统执行时,若用户想要执行强制退出测试、停止测试、暂停全部测试压力、恢复全部测试压力、暂停部分测试压力或者恢复部分测试压力的操作,用户可以对主进程发送某一个信号(比如本系统采用SIGINT信号,也即Ctrl+C),主进程接收到该信号后,返回给用户一个可操作的菜单,用户选择该菜单中某一操作选项并输入给主进程,主进程再根据该选项进行操作,达到控制子进程的效果。

其次,信号和共享内存结构体共同决定要执行的操作:

当用户向主进程发送了一个操作请求后,主进程将代表该操作请求的值,赋值给位于共享内存中的主进程结构体bench的childsigopt元素,再向每个正在执行压力测试的子进程发送某一个信号(比如本系统采用SIGUSR1信号),子系统的信号量处理函数接收到该信号后,会检查共享内存中的主进程结构体bench的childsigopt元素,通过判断该元素的值来决定执行怎样的操作。例如,子进程将共享内存中该子进程结构体内的操作变量值设置为代表所述操作请求的值。

在实施例所述的多进程多线程测试执行过程中,子进程的每个子线程循环执行测试代码,子线程在每次循环执行之前,通过判断共享内存中所属子进程结构体内的操作变量值,执行相应的操作。例如,每个子进程的每个子线程中执行的压力测试业务逻辑函数,被放置在一个循环代码体内,每次执行前会判断一个位于进程共享内存中属于该子进程的结构体bench_child的一个元素switcher的状态,该元素有三种状态,分别为:

i.CONTINUE:运行中状态,默认状态,运行中或者恢复运行后,switcher元素的值都是该状态;

ii.BREAK:停止状态,当switcher的值是该状态时,下一次循环会跳出循环体,从而停止执行性能测试的压力生成;

iii.SUSPEND:暂停状态,当switcher的值是该状态时,该次循环不执行,跳入下一次循环。

主进程在收到用户发来的操作请求后,通过信号告知子进程有请求处理,子进程通过判断主进程结构体bench的childsigopt元素,来决定将本进程结构体bench_child的switcher元素赋以何值。而当该子进程的每个子线程循环体内的压力测试业务逻辑函数在下一次执行前,通过判断该switcher元素,来决定是否是继续执行,或者不执行直接进入下一次循环,或者直接退出该进程。主进程可以通过发送信号给每一个子进程或者部分子进程,来达到控制全部或者部分子进程的压力测试执行状况。

在本实施例中,用户可选择的操作选项包括:

1)强制退出;

用户由于某种原因不希望测试继续执行并且不需要已执行的测试结果,期望立刻退出,则可以通过所述的交互方式告知主进程,要求强制退出性能测试系统。

当用户的操作请求为强制退出测试执行的请求时,子进程执行的相应操作为退出进程操作。

例如,主进程收到请求后将设置共享内存中的主进程结构体bench的childsigopt元素,将其值设置为0,再给各个执行中的子进程发送SIGUSR1信号。子进程收到该信号后判断共享内存中的主进程结构体bench的childsigopt元素是否为0,如果是,则执行退出进程(exit)操作。

2)停止所有测试;

用户由于某种原因希望测试结束并立刻给出测试报告数据(比如:已经性能测试运行了若干小时,可以基于截至目前的测试过程,分析出所需要的数据),则可以通过所述的交互方式告知主进程,要求停止性能测试压力生成,

当用户的操作请求为停止所有子进程执行的请求时,每个子进程将共享内存中该子进程结构体内的操作变量值设置为代表停止执行的值,每个子进程的每个子线程执行到下一次循环时,判断共享内存中所属子进程结构体内的操作变量值设置为代表停止执行的值,则退出循环操作。并且,每个子进程等到该子进程的每个子线程都退出循环操作后,分析该子进程的测试数据并生成测试报告。

例如,主进程收到请求后将设置共享内存中的主进程结构体bench的childsigopt元素,将其值设置为1,再给各个执行中的子进程发送SIGUSR1信号。子进程收到该信号后判断共享内存中的主进程结构体bench的childsigopt元素是否为1,如果是,则在进程共享内存中找到属于本进程的bench_child结构体,并且对该结构体的switcher元素赋值为BREAK。当每个子进程中每个子线程的循环体执行到下一次循环时,判断到bench_child结构体的switcher元素值为BREAK,则执行跳出循环操作(break),之后该子进程等到每个子线程都退出后,再执行分析该进程的性能测试数据工作,以生成性能测试报告。

3)暂停全部测试;

用户由于某种原因希望测试暂停(比如:目前被压系统发现性能异常,需要停止压力进行调试分析),则可以通过所述的交互方式告知主进程,要求暂停性能测试压力生成。

当用户的操作请求为暂停所有子进程执行的请求时,每个子进程将共享内存中该子进程结构体内的操作变量值设置为代表暂停执行的值,每个子进程的每个子线程执行到下一次循环时,判断共享内存中所属子进程结构体内的操作变量值设置为代表暂停执行的值,则停止执行该次循环操作,并跳入下一次循环。

例如,主进程收到请求后将设置共享内存中的主进程结构体bench的childsigopt元素,将其值设置为2,再给各个执行中的子进程发送SIGUSR1信号。子进程收到该信号后判断共享内存中的主进程结构体bench的childsigopt元素是否为2,如果是,则在进程共享内存中找到属于本进程的bench_child结构体,并且对该结构体的switcher元素赋值为SUSPEND。当每个子进程中每个子线程的循环体执行到下一次循环时,判断到bench_child结构体的switcher元素值为SUSPEND,则不执行任何压力测试业务逻辑函数,休息若干毫秒后,进入下一次循环,直到bench_child结构体的switcher元素值被改变为其他状态。

4)恢复全部测试;

在性能测试所有进程的压力生成被暂停后,用户由于某种原因希望测试恢复运行,则可以通过所述的交互方式告知主进程,要求恢复性能测试压力生成。

当用户的操作请求为恢复所有子进程执行的请求时,每个子进程将共享内存中该子进程结构体内的操作变量值设置为代表继续执行的值,每个子进程的每个子线程执行到下一次循环时,判断共享内存中所属子进程结构体内的操作变量值设置为代表继续执行的值,则继续执行循环操作。

例如,主进程收到请求后将设置共享内存中的主进程结构体bench的childsigopt元素,将其值设置为3,再给各个执行中的子进程发送SIGUSR1信号。子进程收到该信号后判断共享内存中的主进程结构体bench的childsigopt元素是否为3,如果是,则在进程共享内存中找到属于本进程的bench_child结构体,并且对该结构体的switcher元素赋值为CONTINUE。当每个子进程中每个子线程的循环体执行到下一次循环时,判断到bench_child结构体的switcher元素值为CONTINUE,则继续执行压力测试业务逻辑函数,从而恢复压力的生成。

5)暂停部分测试;

用户由于某种原因希望通过改变压力并发的大小,来模拟某种环境下真实用户访问的行为(比如某主站WEB服务器在下午6点到9点并发访问压力很高,而在晚上10点以后,并发请求数量逐渐降低),则可以通过所述的交互方式告知主进程,要求暂停某些进程的性能测试压力生成。

当用户的操作请求为选择性暂停部分子进程执行的请求时,主进程遍历共享内存中每个子进程结构体,根据子进程结构体内的操作变量值判断子进程是否正在执行,并将正在执行的子进程标识发给用户;然后,主进程接收用户选择暂停的子进程标识,将共享内存中主进程结构体内的操作变量值设置为代表选择性暂停部分子进程执行的值,然后向用户选择暂停的子进程发送通知信号;用户选择暂停的子进程接收到所述通知信号后,将共享内存中该子进程结构体内的操作变量值设置为代表暂停执行的值;用户选择暂停的子进程的每个子线程执行到下一次循环时,判断共享内存中所属子进程结构体内的操作变量值设置为代表暂停执行的值,则停止执行该次循环操作,并跳入下一次循环。

例如,主进程通过遍历共享内存中每个子进程的bench_child结构体,判断该进程结构体的switcher元素状态是否为正在运行即CONTINUE,将这些处于运行中状态的子进程的进程标识PID发给用户,让用户进行选择。用户将需要暂停的进程PID发送给主进程,主进程收到请求后将设置共享内存中的主进程结构体bench的childsigopt元素,将其值设置为4,再给用户指定的几个子进程发送SIGUSR1信号。这些子进程收到该信号后判断共享内存中的主进程结构体bench的childsigopt元素是否为4,如果是,则在进程共享内存中找到属于本进程的bench_child结构体,并且对该结构体的switcher元素赋值为SUSPEND。当这批子进程的每个子线程的循环体执行到下一次循环时,判断到本进程bench_child结构体的switcher元素值为SUSPEND,则不执行任何压力测试业务逻辑函数,休息若干毫秒后,进入下一次循环,直到bench_child结构体的switcher元素值被改变为其他状态。

6)恢复部分测试。

在某些性能测试进程被暂停后,用户由于某种原因希望恢复某些被暂停进程的压力测试执行,则可以通过所述的交互方式告知主进程,要求恢复某些进程的性能测试压力生成。

当用户的操作请求为选择性恢复部分子进程执行的请求时,主进程遍历共享内存中每个子进程结构体,根据子进程结构体内的操作变量值判断子进程是否暂停执行,并将暂停执行的子进程标识发给用户。然后,主进程接收用户选择恢复的子进程标识,将共享内存中主进程结构体内的操作变量值设置为代表选择性恢复部分子进程执行的值,然后向用户选择的子进程发送通知信号。然后用户选择恢复的子进程接收到所述通知信号后,将共享内存中该子进程结构体内的操作变量值设置为代表继续执行的值。用户选择恢复的子进程的每个子线程执行到下一次循环时,判断共享内存中所属子进程结构体内的操作变量值设置为代表继续执行的值,则继续执行循环操作。

例如,主进程通过遍历共享内存中每个子进程的bench_child结构体,判断该进程结构体的switcher元素状态是否为已暂停即SUSPEND,将这些处于暂停状态的子进程的进程PID发给用户,让用户进行选择。用户将需要恢复运行的进程PID发送给主进程,主进程收到请求后将设置共享内存中的主进程结构体bench的childsigopt元素,将其值设置为5,再给用户指定的几个子进程发送SIGUSR1信号。这些子进程收到该信号后判断共享内存中的主进程结构体bench的childsigopt元素是否为5,如果是,则在进程共享内存中找到属于本进程的bench_child结构体,并且对该结构体的switcher元素赋值为CONTINUE。当这批子进程的每个子线程的循环体执行到下一次循环时,判断到本进程bench_child结构体的switcher元素值为CONTINUE,则继续执行压力测试的业务逻辑函数,从而使得被测系统得到更大的并发压力。

综上所述,本实施例还可以实现用户与进程之间的交互,当用户由于某种需求想要改变进程时,可以向主进程发送信号,通过主进程的反馈,选择要改变的进程。由此可使用户与进程之间有一个交互的过程,从而可以改变这些进程的执行状态,调节进程生成的策略和频率,满足用户的各种需求。并且,动态的改变进程,可以实现几种进程状态之间的转换,丰富进程了的测试场景,相应的也可以提供复杂的压力曲线。

而且,在本实施例所述的方法中,主进程向子进程发送通知信号时,无论何种请求,均发送同种信号,因为该信号起到通知子进程的作用,并没有代表具体的哪种操作请求,因此使用一种信息可以节约可使用的信号量,而且不受限于操作系统的信号量数量,适合在各种实际系统中应用。

并且,本实施例所述的方法,可以在不中断测试执行过程的情况下,排查被测系统的性能问题,例如,在压力性能测试执行过程中,某一时刻发现被测系统有内存溢出状况,通过本申请可以暂停压力的生成,然后由开发人员去排查该溢出问题,观察在压力暂停时溢出是否继续,或者收缩,通过不断的恢复和暂停,降低和升高压力,在不中断整个性能测试执行过程的情况下,完成被测系统问题的排查。因而,有很强的实用性。

基于上述内容,下面通过图2至图5,详细的介绍本申请一种优选实施例的流程。在实施例所述的多进程多线程测试执行过程中,可以动态的改变进程的执行,满足用户的各种需求。

本实施例以Xnix系统(Unix及Linux系统,并包括他们的衍生版本)为例,当然所述方法同样适用于Windows等其他操作系统。

参照图2,是本申请优选实施例的一种在测试执行中动态调度并发数量的方法流程图。

步骤201,启动压力测试,主进程注册接收SIGINT及SIGUSR1信号;

信号处理机制为:signal(SIGNT,cb_trap);signal(SIGUSR1,cb_trap).

步骤202,初始化进程共享内存,初始化主进程结构体,并为各个子进程结构体分配空间,将共享内存的指针保存到全局变量mbp中;

其中包括,主进程的结构体和子进程结构体,如图所示。

步骤203,通过函数fork()生成指定数量的子进程;

步骤203之后,可以进入步骤204,也可以进入流程B,参照图5。

步骤204,主进程生成定时器线程,使得Cbenchmark主进程的执行次数可以通过时间控制;

若控制时间,执行步骤205,若不控制时间,等待所有子进程执行完毕。

步骤205,指定时间,开始计时;

通过定时线程,由函数pthread_create(),指定时间。

步骤206,计时结束后,通过mbp变量找到主进程的bench结构体,赋值childsigopt元素为1,并通过SIGUSR信号让每个子进程进行处理。

主进程发送SIGUSRI信号给每个子进程,进入流程C,参照图4。

参照图3,是本申请优选实施例的一种在测试执行中动态调度并发数量的方法中主进程的流程图。

步骤301,用户对Cbenchmark主进程发送Ctrl+C信号;

在性能测试系统执行时,如果用户想要执行某种操作,可以通过对主进程发送Ctrl+C信号。

步骤302,主进程向用户返回可操作的菜单;

主进程接收到该信号量后,返回给用户一个可操作的菜单,用户可输入的操作包括:0:强制推出性能测试;1:停止执行但统计测试数据;2:暂停所有虚拟用户;3:恢复所有虚拟用户;4:暂停指定测试进程;5:恢复指定测试进程。

步骤303,要求用户输入操作ID;

用户根据自己的需求,确定要执行的操作,输入相应的操作ID。

步骤304,用户选择要操作的选项,发送给主进程;

用户选择要操作的选项对应的操作数,主进程通过确定操作数n,确定相应要操作的选项。

步骤305,选择操作数n,将共享内存中bench结构体中childsigopt元素设置为n;

即主进程在接收到选项操作时,会将代表该操作请求的值,赋值给位于共享内存中的主进程结构体内的操作变量,再向每个正在执行测试的子进程发送信号。

步骤306,判断操作数n的取值;

若n为0至3任一数值,选择步骤307;若n为4或5任一数值,选择步骤308。

步骤307,遍历共享内存中的子进程链表,获得子进程pid,给每个pid发送SIGUSRI信号;

主进程发送SIGUSRI信号给每个子进程,进入流程C,参照图4。

步骤308,遍历共享内存中的子进程结构体的switcher,获得其当前状态,并将处于某种状态进程的pid返回给用户以供选择;

主进程确定某几个进程pid并输出。

步骤309,用户选择欲暂停或者恢复等操作的指定进程;

步骤310,用户输入选择的进程pid,主进程判断输入的pid是否为本进程的子进程pid;

若是,执行步骤311,若不是,返回步骤308,重新输入;

步骤311,通过输入的pid得到共享内存中该子进程的结构体bench_child;

步骤312,判断该子进程结构体bench_child的switcher元素状态是否可操作;

若是,执行步骤313,若不是,返回步骤308,重新输入;

步骤313,通过pid向该子进程发送SIGUSRI信号。

主进程发送SIGUSRI信号给每个子进程,进入流程C,参照图4。

参照图4,是本申请优选实施例的一种在测试执行中动态调度并发数量的方法中子进程的流程图。

每个子进程的执行步骤如下:

步骤401,接收SIGUSRI信号,通过mbp指针在共享内存中找到属于本进程的子进程bench_child结构体和主进程结构体bench;

步骤402,判断主进程结构体childsigopt元素的值;

步骤403,判断bench结构体childsigopt元素是否等于0,即是否强制退出;

若为0,执行exit()退出本子进程,若不为0,执行步骤404;

步骤404,判断bench结构体childsigopt元素是否等于1,即是否停止执行本进程;

若为0,执行步骤405,若不为0,执行步骤406;

步骤405,对本子进程的bench_child结构体的siwtcher元素赋值为BREAK;

该子进程的所有子线程在下一次循环时退出循环体,然后执行退出操作,该子进程等到每个子线程都退出后,再执行分析该进程的性能测试数据工作,以生成性能测试报告。

步骤406,判断bench结构体childsigopt元素是否等于2或4,即是否暂停执行本进程;

若为2或4,执行步骤407,若不为2或4,执行步骤408;

步骤407,对本子进程的bench_child结构体的siwtcher元素赋值为SUSPEND;

该子进程的所有子线程,在下一次循环时会不执行压力测试函数,而直接进入再下一次循环。

步骤408,判断bench结构体childsigopt元素等于3或5,即是否恢复执行本进程;

若为3或5,执行步骤409,若不为3或5,出错,结束。

步骤409,对本子进程的bench_child结构体的siwtcher元素赋值为CONTINUE。

该子进程的所有子线程在下一次循环时会继续执行压力测试函数。

参照图5,是本申请优选实施例的一种在测试执行中动态调度并发数量的方法中子进程子线程的流程图。

所述流程包括两部分,分别是子进程执行的流程和子线程执行的流程,下面分别介绍。

首先,每个子进程执行如下步骤:

步骤501,子进程继承了主进程的信号处理机制,并得到共享内存的指针变量mbp;

步骤502,通过mbp指针在共享内存中找到属于本进程的子进程bench_child结构体,进行初始化,switcher元素赋值为CONTINUE,表示运行中;

步骤503,生成指定数量的线程;

每个线程就是一个并发虚拟用户。

步骤504,等待本进程生成的所有子线程执行完毕;

步骤505,判断是否本进程所有线程都已退出;

可根据步骤516进行判断,若是,执行步骤506,若否,返回执行步骤504。

步骤506,收集、统计测试数据,生成测试报告;

步骤507,执行exit()退出本子程序。

在上述步骤502中,通过函数d_create()生成线程,然后可进入步骤508。

每个子进程的每个子线程执行如下步骤:

步骤508,多个进程的多个线程并行执行生成并发压力;

本线程将执行一个循环结构,结构中被执行的是压力测试的业务函数;

步骤509,判断本子进程的bench_child结构体的siwtcher元素是否为CONTINUE;

若是,执行步骤510,若否,执行步骤512。

步骤510,判断是否执行指定次数;

若是,执行步骤516,若否,执行步骤511。

步骤511,执行压力测试的业务逻辑函数;

CONTINUE表示需要执行压力,所以执行压力测试的业务逻辑函数,返回步骤509;

步骤512,判断本子进程的bench_child结构体的switcher元素是否为SUSPEND;

若是,执行步骤513,若否,执行步骤514;

步骤513,不执行压力测试的业务逻辑函数,休眠若干时间后,再进行下一次循环;

SUSPEND表示需要暂停该压力的生成,所以不执行压力测试的业务逻辑函数,休眠若干时间后,再进行下一次循环。

步骤514,判断本子进程的bench_child结构体的switcher元素是否为BREAK;

若是,执行步骤515;若否,出错,结束。

步骤515,直接执行break跳出循环;

BREAK表示需要停止该压力的生成,所以这里直接执行break跳出循环。

步骤516,退出本线程;

退出本线程后,可进入步骤505。

由以上可知,在性能测试中,用户可以根据需求改变进程的状态,主进程根据用户的选择,改变主进程结构体内的操作变量值,子进程判断主进程结构体内的操作变量值,执行相应的操作。

在实际应用中,上述方法可以由C语言实现,可以达到很好的效果。而且,所述方法不依赖于特定的操作系统或硬件,还可跨平台执行。

上述实施例是以压力测试为例进行说明,但具体应用中也可以应用到其他的性能测试中,其实施原理与上述实施例相似,故不再赘述。

需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请并不受所描述的动作顺序的限制,因为依据本申请,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作并不一定是本申请所必须的。

基于上述方法实施例的说明,本申请还提供了相应的控制测试的调度执行的装置实施例,来实现上述方法实施例所述的内容。

参照图6是本申请实施例的一种在测试执行中动态调度并发数量的装置结构图。

所述装置可以包括用户交互单元61,主进程调度单元62,子进程调度单元63。其中,

用户交互单元61,用于主进程接收用户的操作请求;主进程用于生成多个子进程,每个子进程用于生成多个子线程;

主进程调度单元62,用于主进程将共享内存中主进程结构体内的操作变量值设置为代表该操作请求的值,向子进程发送通知信号;

子进程调度单元63,用于子进程在接收到所述通知信号时,通过判断所述共享内存中主进程结构体内的操作变量值,执行相应的操作。

除以上主要单元设置以外,根据不同的操作请求,本装置还可以包括:

当用户的操作请求为强制退出测试执行的请求时,所述子进程调度单元63进一步可包括:

强制退出子单元631,用于子进程退出进程操作。

当用户的操作请求为停止、暂停或恢复子进程执行的请求时:

所述子进程调度单元63用于子进程将共享内存中该子进程结构体内的操作变量值设置为代表所述操作请求的值。

进一步,所述的装置还包括:

子线程调度单元64,用于子进程的每个子线程循环执行测试代码;子线程在每次循环执行之前,通过判断共享内存中所属子进程结构体内的操作变量值,执行相应的操作;相应的操作包括:继续执行测试,或者不执行直接进入下一次循环,或者直接退出该子进程。

当用户的操作请求为停止所有子进程执行的请求时:

所述子进程调度单元63包括:

进程停止子单元632,用于每个子进程执行如下的相应操作:子进程将共享内存中该子进程结构体内的操作变量值设置为代表停止执行的值;

报告生成子单元633,用于子进程等到该子进程的每个子线程都退出循环操作后,分析该子进程的测试数据并生成测试报告。

所述子线程调度单元64包括:

线程停止子单元641,用于每个子进程的每个子线程执行如下的相应操作:子线程执行到下一次循环时,判断共享内存中所属子进程结构体内的操作变量值设置为代表停止执行的值,则退出循环操作;

当用户的操作请求为暂停所有子进程执行的请求时:

所述子进程调度单元63包括:

进程暂停子单元634,用于每个子进程执行如下的相应操作:子进程将共享内存中该子进程结构体内的操作变量值设置为代表暂停执行的值;

所述子线程调度单元64包括:

线程暂停子单元642,用于每个子进程的每个子线程执行如下的相应操作:子线程执行到下一次循环时,判断共享内存中所属子进程结构体内的操作变量值设置为代表暂停执行的值,则停止执行该次循环操作,并跳入下一次循环。

当用户的操作请求为恢复所有子进程执行的请求时:

所述子进程调度单元63包括:

进程恢复子单元635,用于每个子进程执行如下的相应操作:子进程将共享内存中该子进程结构体内的操作变量值设置为代表继续执行的值;

所述子线程调度单元64包括:

线程恢复子单元643,用于每个子进程的每个子线程执行如下的相应操作:子线程执行到下一次循环时,判断共享内存中所属子进程结构体内的操作变量值设置为代表继续执行的值,则继续执行循环操作。

当用户的操作请求为选择性暂停部分子进程执行的请求时:

所述用户交互单元61还用于主进程遍历共享内存中每个子进程结构体,根据子进程结构体内的操作变量值判断子进程是否正在执行,并将正在执行的子进程标识发给用户;

所述主进程调度单元62用于主进程接收用户选择暂停的子进程标识,将共享内存中主进程结构体内的操作变量值设置为代表选择性暂停部分子进程执行的值,然后向用户选择暂停的子进程发送通知信号;

所述子进程调度单元63包括:

进程选择性暂停子单元636,用于所述用户选择暂停的子进程执行如下的相应操作:子进程将共享内存中该子进程结构体内的操作变量值设置为代表暂停执行的值;

所述子线程调度单元64包括:

线程选择性暂停子单元644,用于所述用户选择暂停的子进程的每个子线程执行如下的相应操作:子线程执行到下一次循环时,判断共享内存中所属子进程结构体内的操作变量值设置为代表暂停执行的值,则停止执行该次循环操作,并跳入下一次循环。

当用户的操作请求为选择性恢复部分子进程执行的请求时:

所述用户交互单元61用于主进程遍历共享内存中每个子进程结构体,根据子进程结构体内的操作变量值判断子进程是否暂停执行,并将暂停执行的子进程标识发给用户;

所述主进程调度单元62用于主进程接收用户选择恢复的子进程标识,将共享内存中主进程结构体内的操作变量值设置为代表选择性恢复部分子进程执行的值,然后向用户选择恢复的子进程发送通知信号;

所述子进程调度单元63包括:

进程选择性恢复子单元637,用于所述用户选择恢复的子进程执行如下的相应操作:子进程将共享内存中该子进程结构体内的操作变量值设置为代表继续执行的值;

所述子线程调度单元64包括:

线程选择性恢复子单元645,用于所述用户选择恢复的子进程的每个子线程执行如下的相应操作:子线程执行到下一次循环时,判断共享内存中所属子进程结构体内的操作变量值设置为代表继续执行的值,则继续执行循环操作。

优选的,所述用户交互单元61还用于主进程接收用户的操作请求之前,接收用户发来的调度控制信号,并向用户返回操作菜单,供用户在所述操作菜单中选择的操作选项,其中每个操作选项对应一个操作请求。

上述控制测试的调度装置可用于多进程多线程的并发测试中,可以根据的用户的操作请求,通过主进程结构体内的操作变量值,动态的改变进程的执行,控制每一组进程的执行状态。

而且,本装置中用户在向主进程发送操作请求时,无论何种操作请求,均发送同种信号,因而可以节约可使用的信号量,而且不受限于操作系统的信号量数量,适合在各种实际系统中应用。

对于上述在测试执行中动态调度并发数量的装置实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见图1至图5所示方法实施例的部分说明即可。

本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。

本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。

本领域内的技术人员应明白,本申请实施例的实施例可提供为方法、装置、或计算机程序产品。因此,本申请实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。

在一个典型的配置中,所述计算机设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非持续性的电脑可读媒体(transitory media),如调制的数据信号和载波。

本申请实施例是参照根据本申请实施例的方法、终端设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理终端设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理终端设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理终端设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理终端设备上,使得在计算机或其他可编程终端设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程终端设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

尽管已描述了本申请实施例的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请实施例范围的所有变更和修改。

最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者终端设备中还存在另外的相同要素。

以上对本申请所提供的一种在测试执行中动态调度并发数量的方法及装置,进行了详细介绍,文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1