一种基于强化学习的类集成测试序列生成方法

文档序号:26589840发布日期:2021-09-10 20:33阅读:267来源:国知局

1.本发明属于软件测试技术领域,且特别是有关于一种基于强化学习的类集成测试序列生成方法。


背景技术:

2.软件测试阶段主要包括单元测试、集成测试、系统测试、验证和确认以及回归测试等。其中,集成测试是在单元测试的基础上,将所有的软件单元组装成模块、子系统或系统,检测各部分工作是否达到或实现相应技术指标及要求,以保证各单元组合之后能够按既定意图协作运行,确保增量的行为正确。但是,面向对象的程序没有明显的层次划分,其间的调用关系表现为错综复杂的网状结构,传统的集成测试策略并不能很好地应用其中。所以,需要提出符合面向对象程序特点的新的集成测试策略,这种新的策略以类为对象,以生成最优的类集成测试序列为目的,进而确定测试方式。
3.根据面向对象程序的类间依赖性,软件工程领域的研究者们提出了基于类集成测试序列的集成策略。在测试过程中,这些策略往往需要为面向对象程序中的某些类构造所需的测试桩,以代替其完成某些功能。这项任务的代价很大,并且一般来说没有办法避免,因而如何降低代价成为了集成测试中的一项关键性的问题。研究过程中,学者们通过计算测试桩复杂度衡量测试桩的代价,不同的类集成测试序列,它们的测试桩复杂度不尽相同,测试代价也不相同。合理地对测试程序中的类进行排序,得到可行的类集成测试序列,可以大大降低需要构建的测试桩的总体复杂度,进而尽可能使测试代价减小。
4.已有的基于强化学习的类集成测试序列生成方法忽略了测试桩复杂度这一评价指标,这些方法假设每个类间依赖关系依赖程度相同,即,每个测试桩具有相同的复杂度。然而,不同的测试桩具有不同的复杂度,测试桩越少不能表示确定一个类集成测试序列花费的测试桩代价越低。因此,已有的基于强化学习的类集成测试序列生成方法以类测试桩数量作为衡量标准,来确定类集成测试序列需要花费的总体代价,这种指标不够精确。所以,提出合理的类集成测试序列生成技术以及将评价指标精确化对于集成测试来说具有相当重要的意义。


技术实现要素:

5.本发明的目的在于提供一种基于强化学习的类集成测试序列生成方法,解决已有的基于强化学习的类集成测试序列生成方法评估确定类集成测试序列花费的总体代价的指标不够精确的问题。这可以为实际生产生活中测试人员开展测试工作提供更为准确的度量方法,进而提升集成测试的效率。
6.本发明按以下技术方案实现:一种基于强化学习的类集成测试序列生成方法,具体过程为:步骤1、定义强化学习任务:强化学习的任务就是使智能体在环境中不断地进行尝试,根据获得的奖励值不断调整策略,最终生成一个较好策略,智能体根据这个策略便能够
知道在什么状态下应该执行什么动作;步骤2、程序静态分析:对源程序进行静态分析,将获取的信息用于计算类间的属性和方法复杂度,通过属性复杂度计算类间的属性耦合,通过方法复杂度计算类间的方法耦合;步骤3、度量测试桩复杂度:依据前面得到的属性和方法复杂度计算测试桩复杂度,为后面奖励函数的设计提供信息;步骤4、设计奖励函数:将测试桩复杂度的计算融入奖励函数的设计中,指导智能体向测试桩复杂度更低的方向学习;步骤5、设计值函数:通过奖励函数反馈值函数,通过值函数的设定保证累计奖励最大化;步骤6、生成类集成测试序列:当智能体完成设定的训练次数,选出整体奖励值最大的动作路径,即为本次学习得到的类集成测试序列。
7.具体的方案,步骤1的具体步骤如下:1.1、将要分析的软件系统视为一组在测试时进行需要进行集成的类的集合;1.2、保留智能体在路径中执行的动作序列,即动作历史,作为集成测试类序列的候选解决方案;1.3、从候选解决方案中找到一条总体奖励最大的动作历史,即为本次学习过程所求的类集成测试序列。
8.具体的方案,步骤2的具体步骤如下:2.1、分析类间关系,通过属性复杂度计算类间的属性耦合,使用a(i, j)代表,i,j分别表示程序中的类,属性复杂度数量上等于i调用j的成员变量数、方法参数类型与方法的返回值数目三者之和;2.2、通过方法复杂度计算类间的方法耦合,使用m(i, j)代表,方法复杂度数目上等于i调用j中方法的数目。
9.2.3、对属性和方法复杂度进行标准化。
10.具体的方案,步骤3的具体步骤如下:3.1、通过熵权法计算类间的属性和方法复杂度的权值;3.2、结合属性和方法复杂度计算得到测试桩复杂度;3.3、当得到类集成测试序列时,对过程中产生的测试桩复杂度进行累加,得到总体测试桩复杂度。
11.进一步的方案:测试桩复杂度其中,,,a(i, j)代表类i和j之间的属性复杂度,m(i, j)代表类i和j之间的方法复杂度,熵权法最先进行的就是对连个指标进行标准化,这样得到的结果均在0到1之间,标准化之后的类间的属性复杂度是,方法复杂度是。
12.具体的方案,步骤4的具体步骤如下:
4.1、设计当智能体探索并集成到的类越优,其得到奖励值越高的奖励函数;4.2、当过程中任意一个动作类重复出现两次,给予这条路径一个最小值

∞,以便继续探索时进行避免;4.3、通过以上两点结合测试桩复杂度,设计奖励函数。
13.进一步的方案:其中,智能体经过i

1次状态变换到达σ
i
,σ
i
表示状态路径,r(σ
i
)表示该状态路径会得到的奖励值,max表示最大奖励值,这里取1000,c为一个正整数值,这里取100,a
σi
表示与状态路径对应的动作历史,scplx()表示测试桩复杂度。当过程中出现任何不符合要求的情况,则环境会赋予智能体一个惩罚值。
14.具体的方案,步骤5的具体步骤如下:5.1、根据环境的交互产生的状态和选择的动作,得到一个即时回报的q值,用q(s, a)表示,其中,s表示状态,a表示动作;5.2、根据下一个状态s’选择最大的q(s’, a’)并将其乘以一个折扣因子γ;5.3、再加上智能体在状态s下执行动作a得到的奖励值r;5.4、整体乘以一个学习率α;5.5、再加上刚才即时回报的q值得到现在的q值。
15.进一步的方案:其中,α表示学习率,r表示智能体在状态s下执行动作a得到的奖励值,γ表示折扣因子。
16.具体的方案,步骤6的具体步骤如下:6.1、智能体根据动作选择机制选择动作;6.2、智能体完成训练次数的时候,系统选择最大整体奖励值的动作序列返回,即为所求的最优类集成测试序列。
17.与现有技术相比,本发明有益效果:本发明解决了目前已有的基于强化学习的类集成测试序列生成方法评估确定类集成测试序列花费的总体代价的指标不够精确的问题,为实际生产生活中测试人员开展测试工作提供了更为准确的度量方法,提升了集成测试的效率,进而更好地控制产品的质量。
附图说明
18.附图作为本发明的一部分,用来提供对本发明的进一步的理解,本发明的示意性实施例及其说明用于解释本发明,但不构成对本发明的不当限定。显然,下面描述中的附图仅仅是一些实施例,对于本领域普通技术人员来说,在不付出创造性劳动的前提下,还可以根据这些附图获得其他附图。
19.在附图中:图1为本发明实例的一种基于强化学习的类集成测试序列生成方法的流程图;图2为定义强化学习任务的流程图;图3为程序静态分析的流程图;
图4为度量测试桩复杂度的流程图;图5为设计奖励函数的流程图;图6为设计值函数的流程图;图7为生成类集成测试序列的流程图。
20.需要说明的是,这些附图和文字描述并不旨在以任何方式限制本发明的构思范围,而是通过参考特定实施例为本领域技术人员说明本发明的概念。
具体实施方式
21.为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对实施例中的技术方案进行清楚、完整地描述,以下实施例用于说明本发明,但不用来限制本发明的范围。
22.图1为本发明实例的一种基于强化学习的类集成测试序列生成方法的流程图。
23.s1定义强化学习任务。强化学习是以马尔科夫决策过程为理论基础的,即智能体选择动作发生的条件概率只和当前事务所处状态相关,但同时,当前的动作会以一定概率影响到下一状态的转变,智能体根据状态和动作得到奖励值。假设路径动作历史共有n个动作。在既定的策略条件下,定义强化学习任务的目标就是找到一组最优的序列,使所获得的总体奖励最大化。
24.s2程序静态分析。对源程序进行静态分析,获取一系列信息,如:类间依赖关系类型、属性依赖信息(如成员变量依赖信息、参数传递信息和返回值信息等)和方法调用信息等,将这些信息用于计算类间的属性和方法复杂度。类间依赖关系可以依据程序运行与否分为类间静态依赖关系与类间动态依赖关系。当程序无需运行即可进行分析的称为类间静态依赖,当程序运行时形成的关系称为类间动态依赖关系。本发明涉及的主要是静态依赖关系。构建测试桩的过程需要考虑类间依赖关系的强弱,而度量这种依赖关系就需要分析类间的耦合信息,进而计算构建测试桩的代价。经过分析,耦合度的紧密程度与依赖关系的强弱呈正相关关系,即耦合度与测试代价呈正相关关系。
25.s3度量测试桩复杂度。测试桩并非一个系统中真正的类,是服务于被测对象的一个组件模块或一段目标代码。当两个类之间的依赖关系较强时,测试桩需要模拟的功能就比较多,构建起来较为复杂,测试桩复杂度就比较高;当关系较弱时,构建测试桩的难度降低,代价较小,测试桩复杂度就较低,所以就可以通过类间关系的强弱计算测试桩复杂度,进而得到测试代价。
26.s4设计奖励函数。当智能体在状态s下采取动作a时,环境会综合给予智能体一个奖励r,当智能体获得的r为正向时,智能体会加强相关方向动作的选择,同时也会影响下一状态。奖励函数就是计算奖励值r的一个函数。
27.s5设计值函数。奖励函数用来使智能体从一个状态转移到下一个状态时所获得的奖惩值最大,为了保证到达目标状态时累计奖励值最大,设计值函数来表示累计回报值,q表就用来存储这样的q值。假设已经知道了前t次动作之后得到的平均奖励值与第t+1次的奖励值,那就可以预测出第t+1次选择动作后的累计奖励q值来进行更新,值函数表现了强化学习中预测和更新反馈的过程。
28.s6生成类集成测试序列。通过智能体在学习过程中的动作选择以及奖励反馈,一
次选择合适的动作加入动作序列中,在这个过程中通过衡量构建测试桩的复杂度设计奖励函数,以及设计值函数保证动作序列的累计奖励值也是最大的,最终选择出合适的动作序列即为该方法得到的最优的类集成测试序列。
29.图2为定义强化学习任务的流程图。通过了解强化学习的构造,结合对类集成测试序列的相关研究,制定以测试桩复杂度尽可能低为目标的强化学习策略,以智能体选择的动作序列累计奖励值最优作为学习目标。具体步骤如下:首先,将要分析的软件系统视为一组在测试时进行需要进行集成的类的集合;然后,保留智能体在路径中执行的动作序列,即动作历史,作为集成测试类序列的候选解决方案;最后,从候选解决方案中找到一条总体奖励最大的动作历史,即为本次学习过程所求的类集成测试序列。
30.图3为程序静态分析的流程图。通过对程序中类与类间的依赖关系进行分析,得到属性和方法耦合度,为下一步计算测试桩复杂度做准备。具体步骤如下:首先,通过分析程序间的具体语句分析类间关系;然后,通过属性复杂度计算类间的属性耦合,通过方法复杂度计算类间的方法耦合;最后,为了方便下一步计算,对属性和方法复杂度分别进行标准化。
31.图4为度量测试桩复杂度的流程图。测试桩复杂度是衡量测试代价的重要指标,主要是通过类间的属性和方法复杂度计算得到。具体步骤如下:首先,确定属性和方法复杂度的权值,采用熵权法计算类间的二者权重;然后,结合上一步标准化后的属性和方法复杂度计算得到测试桩复杂度;最后,当得到类集成测试序列时,对过程中产生的测试桩复杂度进行累加,得到总体测试桩复杂度,以便对本方法进行评估。
32.实施方式:为了更准确得到测试桩复杂度,采用熵权法来计算属性和方法复杂度的权值w
a
和w
m

33.熵权法计算测试桩复杂度的步骤如下:(1)标准化指标计算测试桩复杂度有两个指标,分别是属性复杂度与方法复杂度,a(i, j)代表类i和j之间的属性复杂度,m(i, j)代表类i和j之间的方法复杂度,熵权法最先进行的就是对连个指标进行标准化,这样得到的结果均在0到1之间,标准化之后的类间的属性复杂度是,方法复杂度是。计算公式如下:;。
34.(2)建立评价矩阵假设待测系统包含m个类,则可以构造一个m*2的矩阵表示类间的两种关系,其中以第一列表示在属性复杂度的指标下的评价值,第二列表示在方法复杂度的指标下的评价值。两列共同构成一个评价矩阵r,计算公式如下:
计算信息熵计算信息熵之前需要首先计算每个类分别对每个指标的评价值占比,以p
ij
表示第j个指标的比重,然后根据得到的比重计算第j个指标的信息熵e
j
,其中k为一个常数,公式如下:如下:如下:计算权重将第j个指标的权重表示为w
j
,其中j为1时代表属性复杂度权重,j为2时代表方法复杂度权重,公式如下:最终得到属性复杂度和方法复杂度得权重,进而得到测试桩复杂度scplx(i, j)。
35.。
36.图5为设计奖励函数的流程图,奖励函数是指导智能体进行探索的重要指标,智能体倾向于探索奖励值更大的动作路径,所以为了得到测试代价尽可能低的类集成测试序列,本发明结合测试桩复杂度对奖励函数进行改进。具体步骤如下:首先,设计当智能体探索并集成到的类越优,其得到奖励值越高的奖励函数;然后,当过程中任意一个动作类重复出现两次,给予这条路径一个最小值

∞,以便继续探索时可以对这种情况进行避免;最后,通过以上两点结合测试桩复杂度,设计奖励函数,训练智能体倾向于探索测试桩复杂度更低的路径。
37.实施方式:假设智能体在第一个状态到第f个状态中,共经历了n+1个状态,选择了n个动作,则认为第f个状态s
f
即为最终态,从s1到s
f
之间的状态变化函数的公式如下所示,
s’为状态s的下一状态。
38.用表示从最初状态到最终状态s
f
的状态路径,其中σ0表示初始状态s1,。智能体按照该路径执行的n个动作序列即可以表示为,即与状态路径对应的动作历史。如果该路径不包含重复动作,则可以认为即为一条可供选择的类集成测试序列。
39.强化学习中的奖惩机制是控制智能体探索最佳路径的核心,当智能体探索并集成到的类越优,其得到奖励值越高。为了进一步降低类集成测试序列的总体测试代价,本发明结合测试桩复杂度设计强化函数,定义公式如下所示:智能体经过i

1次状态变换到达σ
i
,σ
i
表示状态路径,r(σ
i
)表示该状态路径会得到的奖励值,max表示最大奖励值,这里取1000,c为一个正整数值,这里取100,a
σi
表示与状态路径对应的动作历史,scplx()表示测试桩复杂度。当智能体进行探索的过程中出现任何不符合要求的情况,环境会赋予智能体一个惩罚值。例如,过程中任意一个动作类重复出现两次,即给予这条路径一个最小值

∞,后面继续探索时可以对这种情况进行避免。当该路径中没有出现重复类则可认为此条路径可行,环境会赋予智能体一个奖励值,此处c是一个正整数。当到达终态仍没有重复类出现,即可以认为已经找到一条备选路径并计算其整体测试代价。假如当前得到的类集成测试序列的测试代价小于前面所得到的所有序列的测试代价,则可以给予其一个较高的奖励值。按照这种路径动作历史的顺序进行集成,可以使生成的类集成测试序列整体测试桩复杂度最小化,最大程度的节约测试成本。
40.图6为设计值函数的流程图,值函数更注重智能体探索过程中得到的累计奖励值,可以和奖励函数相辅相成,共同促使智能体向测试代价更低的方向探索。具体步骤如下:首先,根据环境的交互中产生的状态和选择的动作,得到一个即时回报的q值,用q(s, a)表示;然后,根据下一个状态s’选择最大的q(s’, a’)并将其乘以一个折扣因子;之后,再加上智能体在状态s下执行动作a得到的奖励值并整体乘以一个学习率;最后,加上刚才即时回报的q值得到现在的q值。
41.计算公式如下:其中,表示学习率,表示智能体在状态下执行动作得到的奖励值,表示折扣因子。
42.图7为生成类集成测试序列的流程图,本发明采用强化学习方法,训练智能体向测试代价更低的方向学习,其过程中选择动作得到的动作序列即为所求的类集成测试序列。具体步骤如下:首先,智能体根据动作选择机制选择动作;然后,智能体完成训练次数的时候,系统选择最大整体奖励值的动作序列返回,即为所求的最优类集成测试序列。
43.实施方式:强化学习是通过探索和利用选择动作的过程,为了在学习过程避免陷入局部最优,进一步增加智能体探索的比例,在ε

贪婪方法的基础上,采取两种选择机制:传统的ε

贪婪算法:以1

ε的概率选择当前状态下q值最大对应的动作;以ε的概率随机选择动作。
44.动态调整ε算法:首先动态调整ε的值,公式如下所示,其中times表示训练次数。
45.。
46.通过上述q

学习算法,得到智能体从初始到最终状态的路径σ,如果所有状态下的所有动作均被访问到,则智能体得到的q值达到最佳值。最后得到的与状态路径相关联的动作历史,其对应的动作序列即为本方法得到的最佳的类集成测试序列。
47.以下给出上述的一种基于强化学习的类集成测试序列生成方法的实验数据:实验对象为sir网站中的elevator、spm、atm、daisy、ant、bcel、dns、email_spl和notepad_spl等9个程序。本方法30次实验结果的平均值表明对于这9个程序中的elevator、daisy、ant、email_spl和notepad_spl这5个程序,与采用粒子群算法和随机算法生成类集成测试序列时花费的最低总体测试桩复杂度相比,由本方法生成最优的类集成测试序列时所花费的总体测试桩复杂度最低,分别降低了39.4%,33.3%,7.6%,37.9%和17.8%。
48.综上,本发明解决了当下已有的基于强化学习的类集成测试序列生成方法评估确定类集成测试序列花费的总体代价的指标不够精确的问题,不但可以进一步完善类集成测试序列生成领域的研究,还可以进一步降低测试代价,为实际生产生活中测试人员开展测试工作提供更为准确的度量方法,提升软件测试环节的效率,保证软件产品的质量。
49.在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
50.此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包含的某些特征而不是其它特征,但是不同实施例的特征的组合同样意味着处于本发明的保护范围之内并且形成不同的实施例。例如,在上面的实施例中,本领域技术人员能够根据获知的技术方案和本技术所要解决的技术问题,以组合的方式来使用。
51.以上所述仅是本发明的较佳实施例而已,并非对本发明作任何形式上的限制,虽然本发明已以较佳实施例揭露如上,然而并非用以限定本发明,任何熟悉本专利的技术人员在不脱离本发明技术方案范围内,当可利用上述提示的技术内容做出些许更动或修饰为等同变化的等效实施例,但凡是未脱离本发明技术方案的内容,依据本发明的技术实质对以上实施例所作的任何简单修改、等同变化与修饰,均仍属于本发明方案的范围内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1