(1996-), 女, 博士生, CCF学生会员, 主要研究领域为软件分析于测试, 强化学习
(1982-), 女, 博士, 副教授, CCF专业会员, 主要研究领域为软件分析与测试, 软件缺陷预测
(1966-), 女, 博士, 教授, 博士生导师, CCF专业会员, 主要研究领域为软件分析与测试, 编译技术
(1982-), 男, 博士, 教授, 博士生导师, CCF高级会员, 主要研究领域为数据挖掘, 软件工程
(1979-), 男, 博士, 副教授, CCF专业会员, 主要研究领域为软件分析与测试, 故障定位
(1973-), 男, 博士, 教授, CCF高级会员, 主要研究领域为形式化验证, 智能安全, VLSI容错
集成测试是软件测试过程中不可缺少的步骤, 针对在集成测试中如何对系统中的类合理排序的问题, 国内外研究者提出了多种生成类集成测试序列的方法, 然而他们大多没有将测试桩复杂度作为评估测试代价的指标. 针对该问题, 提出面向类集成测试序列生成的强化学习研究方法, 以总体测试桩复杂度为评价测试代价的指标, 生成测试代价尽可能低的类集成测试序列. 首先, 定义强化学习任务, 根据任务设定算法的追求目标; 其次, 进行程序的静态分析, 根据分析得到的结果计算测试桩复杂度; 然后, 将测试桩复杂度的计算融入奖励函数的设计中, 为选择下一步动作提供信息和依据; 最后, 通过奖励函数反馈值函数, 通过值函数的设定保证累计奖励最大化. 当智能体完成规定训练次数, 系统会选择获得最大累计奖励值的类集成测试序列进行输出, 即为我们追求的测试代价尽可能低的结果. 实验结果表明, 与现有方法相比, 在以总体测试桩复杂度为评价指标时, 提出的方法结果更优.
Integration testing is an indispensable step in the software testing process. In response to the problem of how to rationally sort the classes in the system in integration testing, researchers worldwide have proposed a variety of methods to generate class integration test orders. However, most of them didn’t take the stubbing complexity as the indicator, which is an important factor in evaluating the test cost. In order to solve this problem, this study proposes a method of generating a class integration test order based on reinforcement learning, using the overall stubbing complexity as the indicator to evaluate the test cost, and generating a class integration test order with the stubbing complexity as low as possible. First, the reinforcement learning task is defined, and the pursuit goal of the algorithm is set according to the task. Second, the static analysis of the program is performed and the stubbing complexity is calculated according to the results of the analysis. Then, the calculation of the stubbing complexity is integrated into the design of the reward function to provide information and basis for choosing the next action. Finally, the value function is fed back through the reward function, and the value function is set to ensure that the cumulative reward is maximized. When the agent completes the specified number of training times, the system will select the class integration test order that obtains the largest cumulative reward value for output, which costs the lowest stubbing complexity pursued. The experimental results show that the results obtained by this method are better than those obtained by other existing methods in terms of the overall stubbing complexity as the evaluation indicator.
软件测试阶段主要包括单元测试、集成测试、系统测试以及回归测试等. 其中, 集成测试是在单元测试的基础上进行的步骤, 主要任务是将所有的软件单元组装成模块、子系统或系统, 检测各部分工作是否达到或实现相应技术指标及要求, 以保证各单元组合之后能够按既定意图协作运行等. 但是, 面向对象的程序没有明显的层次划分, 其间的调用关系表现为错综复杂的网状结构, 传统的集成测试策略并不能很好地应用其中. 因此, 需要提出符合面向对象程序特点的新的集成测试策略[
根据面向对象程序的类间依赖性, 软件工程领域的研究者们提出了基于类集成测试序列的集成策略. 在测试过程中, 这些策略往往需要为面向对象程序中的某些类构造测试桩, 以代替其完成某些功能. 这项任务的代价很大, 并且一般来说没有办法避免. 因此, 如何降低这种代价成为了集成测试中一项关键性的问题. 研究过程中, 学者们通过计算测试桩复杂度衡量测试桩的代价, 对于不同的类集成测试序列, 测试桩复杂度不尽相同, 其测试代价也不相同. 合理地对待测程序中的类进行排序, 得到可行的类集成测试序列, 可以大大降低需要构建的测试桩的总体复杂度, 尽可能地减小测试代价. 总的来说, 提出合理的类集成测试序列生成技术对于集成测试来说具有相当重要的意义.
通过对国内外相关算法的研究, 我们发现目前解决类集成测试序列的生成问题普遍采用基于图论与基于搜索的方法, 极少涉及到强化学习方面的相关知识, 强化学习适用于解决序列决策问题, 已经成功应用于游戏问题(如AlphaGo、AlphaZero在围棋方面的突破)[
针对上述问题, 本文提出了一种面向类集成测试序列生成的强化学习研究方法, 重点探究集成测试中如何生成测试代价最低的类集成测试序列. 该方法通过强化学习中的Q-学习算法[
本文第1节介绍了类集成测试序列生成过程中涉及到的一些基本概念; 第2节介绍了面向类集成测试序列生成的强化学习研究策略, 并给出了一个实例分析; 第3节介绍了为验证本文方法的效果所做的实验设计, 并对设计内容展开实验, 分析实验结果; 第4节总结了近年来国内外研究者在类集成测试序列方面的相关工作; 第5节对本文的研究方法进行总结, 并对未来类集成测试序列生成领域的研究方向进行展望.
类集成测试序列的生成过程中涉及到的基本概念可以概括为3部分, 分别是集成测试相关、类间依赖关系分类以及测试代价度量.
整个软件系统的生命周期都存在测试, 根据在生命周期中所处的阶段, 软件测试可以分为以下几个类别[
(1)单元测试, 存在于软件系统的编码阶段, 针对组成程序的最小单元进行检验;
(2)集成测试, 当上述经过单元测试的程序单元组装到一起, 变为更大的子系统时, 对集成过程进行的测试;
(3)系统测试, 当系统集成完毕, 针对目前软件所处的实际环境进行的测试;
(4)回归测试&β测试, 针对系统后期维护阶段以及后续版本的发布等进行的测试.
其中, 按面向对象程序中的层级划分又可以将集成测试视为类簇级测试. 类簇指一组类的集合, 它们之间由于各种方法的调用往往形成复杂的类间关系, 类簇级测试的功能就是检验系统内的各种关系的实现、消息传递和系统功能正常运作与否.
一个模块单独工作时运行正常, 但是集成之后是否还能完成其功能需要进一步测验, 因此, 为了使单元测试中看不到的问题暴露出来, 类簇级测试应运而生. 经过了初步的单元测试, 类簇级测试需要验证所需单元按照设计需求进行整合、组装成待测子系统的过程是否符合前期设计需求. 并且, 由于在某些开发系统中, 代码的编写与测试都是在不断迭代的过程中完成的, 因此, 作为确保各单元的正常结合、完成所需求的功能的测试步骤, 类簇级测试就彰显了其重要性.
本文研究的类集成测试序列的生成问题属于面向对象的类簇级测试中极为重要的一个环节. 类簇中类间关系复杂, 通过消息传递产生的依赖关系可以抽象为一个复杂的面向对象关系图, 程序中出现的类间关系越复杂, 越使得同时测试完系统中所有的类变的无法实现. 因此, 如何确定测试这些类之间的先后顺序以使测试整个系统的代价降到最低成为了一个关键性问题.
要对待测系统中的类进行排序, 就要先分析类间的各种依赖关系. 类间依赖关系[
类间静态依赖关系主要分为5种, 分别为: 使用(use)、关联(association)、聚合(aggregation)、组合(composition)以及继承/泛化(generalization)[
使用(use): 使用关系也称为依赖关系(dependency), 表示类间某个类依赖于另一个类的关系, 属于依赖强度最弱的类间关系. 类A和类B分别表示两个独立的类, 当由于类A引入了类B时, 称类A依赖于类B, 但是A中不包含B的属性, B的实例以参量形式传入A的方法中. Java中使用关系主要表现为方法形参(B的实例表现为A中的方法或者参数)、局部变量(B的对象视作A的局部变量)以及静态方法的调用(A调用B的静态方法)等.
关联(association): 关联关系的依赖强度稍强于依赖关系, 表示某个类了解另一个类的方法属性, 这种关系可以是单向的也可以是双向的. 单向关联关系可以表示为: 当类A调用了B内某实例, A单方面了解B中的方法属性, 但是B不了解A中的信息, 就称为A单向关联于B. 双向关联关系就是指A和B彼此都知道对方的方法属性. Java中关联关系一般表示为类里的成员变量.
聚合(aggregation): 也称聚集, 属于一种特殊的更强的关联关系, 主要表示整体和部分之间的关系. 类A代表整体, 类B代表部分, B属于A中的一个个体, A中的全局变量存在B中实例的声明, A和B即为一种聚合关系. 这里A和B属于同一级别, 当部分脱离整体仍然可以单独作为一个类存在于整个系统. Java中表现为A将B的已经实例化的部分作参数, 然后将该参数传递给构造函数.
组合(composition): 组合与聚合同属于关联关系的一种形式, 但比聚合关系的依赖强度更深, 因此别名“强聚合”. 同上, 假设类B代表部分, 类A代表整体, B是A的一个个体, 同聚合关系一样, 类B出现在类A的全局变量声明中, 不同的是, 如果B脱离于A, 则B在系统中没有了存在性, 即部分不能脱离整体而存在. Java中表现为B的对象属性创建在A的构造函数中.
继承/泛化(generalization): 继承和泛化同属于子类父类关系的过程, 继承指父类具体出子类的过程, 泛化指子类抽象出父类的过程. 在这种关系里, 以类A代表父类, 类B代表子类, B可以共享A中的部分属性以及方法, 并在重写父类方法的同时重新定义, 实现自己需要的属性以及方法, 这也属于B依赖于A的一种表现. Java中, 某个子类只可以继承单个父类, 继承关系通过extends关键字实现.
如
约减的类间关系图
(1)测试桩
在集成测试中, 测试桩用来模拟某个类所需的仍未被测试的服务组件, 其定义如下.
定义
在生成类集成测试序列的过程中, 测试桩的构建较为复杂, 因此通常用建立测试桩的代价衡量效果优劣, 测试桩一般被分为通用测试桩(generic stub)和特效测试桩(specific stub), 通用测试桩通常用来模拟整个类的行为, 容易增加额外开销, 而特效测试桩模拟类的一部分, 比如如何使用这个类所需的单个方法, 无法重用[
如
四类图
通用测试桩[
特效测试桩[
测试桩并非一个系统中真正的类, 是服务于被测对象的一个组件模块或一段目标代码. 当两个类之间的依赖关系较强时, 测试桩需要模拟的功能就比较多, 构建起来较为复杂; 当关系较弱时, 构建测试桩的难度降低, 代价较小. 因此, 可以通过分析类间依赖关系得到测试代价.
(2)类间耦合度量
构建测试桩的过程中需要考虑类间依赖关系的强弱, 而度量这种依赖关系就需要分析类间的耦合信息, 计算构建测试桩的代价. 经过分析, 耦合度的紧密程度与依赖关系的强弱呈正相关关系, 即耦合度与测试代价呈正相关关系.
根据Briand等人[
定义
定义
根据以上定义, 结合X和Y的耦合信息, 进一步得到X依赖于Y这一步如果构建测试桩分别需要的属性耦合和方法耦合的数量, 具体为: 根据X访问Y的属性个数、X访问Y的方法个数以及X访问Y的返回值个数统计属性耦合; 根据Y向X传递的不同参数的个数统计方法耦合. 进一步计算得到两个指标各自的复杂度, 进而得到集成X时建立Y测试桩需要的测试代价.
(3)测试代价度量方法
针对构建测试桩的代价的度量标准有两个[
测试桩数目[
测试桩复杂度[
首先, 通过属性复杂度计算类间的属性耦合, 使用
对上述二者再分别赋予权重
函数
这种归一化处理计算属性和方法复杂度的方法可能会使计算的测试桩复杂度丧失一部分原有的信息, 但易于实现, 处理方便, 是目前公认的计算测试桩复杂度的策略, 通过线性加权生成类集成测试序列总体测试桩复杂度的方法也普遍出现在各种算法中, 例如遗传算法、蚁群算法等.
类集成测试序列问题本质上是一个NP完全性问题, 近年来, 由于人工智能的崛起, 人们发现其在解决NP完全性问题方面具有一定效用. 目前, 解决该问题普遍采用基于图论与基于搜索的方法, 极少涉及到强化学习方面的知识, 然而又由于强化学习适用于序列决策问题, 而类集成测试序列问题本身属于序列决策问题, 因此本文利用强化学习来解决类集成测试序列的生成问题.
强化学习是机器学习领域的一个重要分支, 其结构如
强化学习结构
强化学习主要由两个交互对象以及3项基本要素[
智能体(agent): 执行动作的载体, 可以与环境交互, 得到环境的状态, 接收反馈的奖励, 进而调整学习策略, 决策出下一步动作的选择.
环境(environment): 系统中不属于智能体的部分, 智能体在这里执行动作, 使自己处于多个状态, 进行探索并获得奖励.
状态(
动作(
奖励(
强化学习是以马尔科夫决策过程(Markov decision process, MDP)[
马尔可夫决策过程
度量类集成测试序列的评价指标有两种, 分别是测试桩数量和测试桩复杂度. 但是, 现有的以测试桩数量作为评价指标的方式将每个测试桩视作等价, 忽略了类间复杂的依赖关系, 因此, 当使用两种方法分别用于度量构建测试桩的测试代价时, 测试桩复杂度更为准确.
基于上述原因, 本文研究了一种从测试桩复杂度的评价角度进一步降低测试代价的类集成测试序列生成方法. 并且, 由于现有的方法中忽略了类间属性复杂度和方法复杂度的权值的区别, 为了使结果更精确, 本方法考虑采用熵权法度量二者权值, 进而计算测试桩复杂度.
评估测试桩复杂度的代价函数
然后, 依据前文中介绍到的公式(1)、公式(2)分别为得到的属性复杂度和方法复杂度的值标准化.
最后, 再对二者进行加权耦合, 计算过程如公式(7)所示. 其中,
通常来说, 为指标赋权的方法可以分为主观与客观两种, 主观方法具有较大的灵活空间, 但这种方法依赖主观因素, 忽略了其他因素(例如随机性等)对评估结果的影响. 信息论的原理中用信息熵表示系统的无序程度, 定量度量信息[
熵权法[
(1)标准化指标
就本文而言, 计算测试桩复杂度有两个指标, 分别是属性复杂度与方法复杂度,
(2)建立评价矩阵
假设待测系统包含
(3)计算信息熵
计算信息熵之前需要首先计算每个类对应每个指标的评价值占比, 以
(4)计算权重
将第
得到属性复杂度和方法复杂度的权重后, 再通过公式(7)得到测试桩复杂度
本文通过强化学习的方法生成类集成测试序列, 目标是进一步降低总体测试桩复杂度. 首先, 将要分析的软件系统视为一组需要进行集成的类的集合; 其次, 保留智能体在路径中执行的动作序列, 作为本文研究问题的候选解决方案; 最后, 从候选方案中选择总体测试桩复杂度最小的动作序列作为类集成测试序列.
如前文第2.1节中所说, 强化学习中通过状态空间
观察
状态变化图
用
强化学习中的奖惩机制是控制智能体探索最佳路径的核心[
智能体经过
本文采用的是强化学习中的Q-学习算法[
强化学习是通过探索和利用选择动作的过程, 为了使智能体避免在学习过程中陷入局部最优, 本文进一步增加探索的比例, 在ε-贪婪方法[
(1)传统的ɛ-贪婪算法[
(2)动态调整ɛ 算法: 首先以公式(16)动态调整ɛ 的值[
通过上述Q-学习算法, 得到智能体从初始到最终状态的路径
综上, 本文改进的Q-学习算法[
算法. 改进的Q-学习算法.
输入: 状态
输出: 一个类集成测试命令.
1. 重复(对每次训练):
2. 初始化
3. 重复(针对每次训练的每个步骤):
4. 使用ε-贪婪策略选择动作
5. 执行动作
6. 获取更新的
7.
8.
9. 直到
10. 结束
本文选择SIR (software-artifact infrastructure repository, 软件工件基础结构存储库)[
elevator系统信息
编号 | 类名 | 编号 | 类名 |
0 | Building | 6 | ElevatorState |
1 | DoorClosedException | 7 | Floor |
2 | Elevator | 8 | Logger |
3 | ElevatorController | 9 | Person |
4 | ElevatorFullException | 10 | PersonState |
5 | ElevatorMovingException | 11 | Simulator |
首先, 通过Soot对待测系统进行静态分析, 对应
elevator系统的类间依赖关系
类间属性依赖值表 | 类间方法依赖值表 | ||||||||||||||||||||||||||
类 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 类 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | ||
0 | 1 | 1 | 2 | 0 | 2 | 7 | 2 | ||||||||||||||||||||
1 | 1 | ||||||||||||||||||||||||||
2 | 2 | 1 | 1 | 2 | 2 | 2 | 1 | 1 | 2 | 2 | 24 | 1 | |||||||||||||||
3 | 4 | 1 | 1 | 1 | 2 | 3 | 25 | 15 | 19 | 2 | |||||||||||||||||
4 | 4 | ||||||||||||||||||||||||||
5 | 5 | ||||||||||||||||||||||||||
6 | 6 | ||||||||||||||||||||||||||
7 | 2 | 2 | 1 | 3 | 7 | 2 | 2 | 9 | 9 | ||||||||||||||||||
8 | 8 | ||||||||||||||||||||||||||
9 | 2 | 2 | 1 | 1 | 1 | 9 | 3 | 6 | 10 | 4 | 2 | ||||||||||||||||
10 | 10 | ||||||||||||||||||||||||||
11 | 11 | 2 | 4 |
接下来, 按第2.3节改进的Q-学习算法输入参数值, 对于elevator系统, 状态值约有10的13次方个, 每一轮选择前都要先初始化
当终止标志为TRUE且每个类均被选择到时, 如
智能体探索失败的某一次选择过程如
假设本文设置的实验次数为两次, 当两次实验完成, 系统从上述两次结果中选择出最大奖励值的动作序列[8, 6, 10, 9, 2, 3, 1, 4, 5, 7, 11, 0], 即为本次训练所求得的最优类集成测试序列.
为验证本文提出的基于强化学习的类集成测试序列生成方法CITO_RL的效果, 本节将对从SIR网站[
elevator执行一次过程(成功)
序号 | 动作选择概率 | 执行动作 | 奖励值 | 下一状态 | 备选动作 | 终态标志 | 序列 |
1 | 0.115170 | 8 | 1 000 | 10 | 6 | FALSE | [8] |
2 | 0.211956 | 6 | 1 000 | 116 | 10 | FALSE | [8, 6] |
3 | 0.538042 | 10 | 1 000 | 1 392 | 9 | FALSE | [8, 6, 10] |
4 | 0.860361 | 9 | 990.36 | 16703 | 2 | FALSE | [8, 6, 10, 9] |
5 | 0.304143 | 2 | 995.78 | 200428 | 3 | FALSE | [8, 6, 10, 9, 2] |
6 | 0.207753 | 3 | 996.06 | 2405129 | 1 | FALSE | [8, 6, 10, 9, 2, 3] |
7 | 0.459753 | 1 | 1 000 | 28861539 | 4 | FALSE | [8, 6, 10, 9, 2, 3, 1] |
8 | 0.224424 | 4 | 1 000 | 346338462 | 5 | FALSE | [8, 6, 10, 9, 2, 3, 1, 4] |
9 | 0.751222 | 5 | 1 000 | 4156061539 | 7 | FALSE | [8, 6, 10, 9, 2, 3, 1, 4, 5] |
10 | 0.160097 | 7 | 1 000 | 49872738465 | 11 | FALSE | [8, 6, 10, 9, 2, 3, 1, 4, 5, 7] |
11 | 0.023287 | 11 | 999.51 | 598472861581 | 0 | FALSE | [8, 6, 10, 9, 2, 3, 1, 4, 5, 7, 11] |
12 | 0.388568 | 0 | 10000 | 7181674338962 | TRUE | [8, 6, 10, 9, 2, 3, 1, 4, 5, 7, 11, 0] |
elevator执行一次过程(失败)
序号 | 动作选择概率 | 执行动作 | 奖励值 | 下一状态 | 备选动作 | 终态标志 | 序列 |
1 | 0.770786 | 6 | 1 000 | 8 | 8 | FALSE | [6] |
2 | 0.302418 | 8 | 1 000 | 94 | 1 | FALSE | [6, 8] |
3 | 0.649659 | 1 | 1 000 | 1 119 | 4 | FALSE | [6, 8, 1] |
4 | 0.687569 | 4 | 1 000 | 13422 | 6 | FALSE | [6, 8, 1, 4] |
5 | 0.972340 | 6 | −2147483648 | 161060 | TRUE | [6, 8, 1, 4, 6] |
实验之前需要为Q-学习算法设置相关参数, 本文的参数设置如
参数设置
Q-学习参数 | 值 |
初始学习率 |
0.9 |
折扣率 |
0.9 |
训练次数 | 2×105 |
探索率ε | 0.8& 动态ε |
100 | |
Max | 1 000 |
将强化函数的参数设置
实验对象信息如
实验程序信息
程序 | 描述 | 类数 | 依赖关系 | 环路数 | 代码行数 |
elevator | 经典电梯调度算法 | 12 | 27 | 23 | 934 |
SPM | 保安巡逻监控系统 | 19 | 72 | 1 178 | 1 198 |
ATM | 自动取款机模拟系统 | 21 | 67 | 30 | 1 390 |
daisy | Unix下的网络文件系统 | 23 | 36 | 4 | 1 148 |
ANT | 基于Java平台的集成包管理系统 | 25 | 83 | 654 | 4 093 |
email_spl | 电子邮件工具 | 39 | 63 | 38 | 2 276 |
BCEL | 创建、分析、操作Java类文件的插桩工具 | 45 | 294 | 416091 | 3 033 |
DNS | 网络域名服务系统 | 61 | 276 | 16 | 6 710 |
notepad_spl | 源代码编辑器 | 65 | 142 | 227 | 2 419 |
为了更精确地评价本文方法的实验效果, 本文采用改进的权值计算法, 即, 使用熵权法[
为了便于更加直观地表现本文提出的面向类集成测试序列生成的强化学习方法CITO_RL的效果, 本节将进行实验, 并和经典的图论算法与搜索算法的实验结果做对比. 为了便于深入地以及有针对性地评估本文方法的效果, 本节针对实验提出了以下几个问题.
问题(1): 使用熵权法计算权值表现如何?
问题(2): 动作选择参数的设计是否合理?
问题(3): 使用强化学习的方法生成类集成测试序列的效果如何?
为了回答以上3个问题, 本文对
本文实验基于强化学习方法生成类集成测试序列, 其参数设置如第3.1节所示. 针对每种算法的每次实验都有一定的随机性的问题, 本文对每次实验重复运行多次, 并对结果取平均值, 来与其他算法的结果进行比较.
回答问题(1)使用熵权法计算权值表现如何.
针对第一个问题, 我们进行了两组对比实验. 首先, 使用本领域最常使用的方法, 即Briand等人[
观察
权值取0.5与熵权法计算权值
程序 | 权值均为0.5 | 熵权法计算权值 | |||||
OCplx | StubsG | StubsS | OCplx | StubsG | StubsS | ||
elevator | 1.713 | 4 | 5 | 4 | 5 | ||
SPM | 5.382 | 14 | 27 | 14 | |||
ATM | 16 | 16 | 2.810 | 16 | 16 | ||
daisy | 0.292 | 4 | 4 | 4 | 4 | ||
ANT | 2.079 | 10 | 16 | 10 | 16 | ||
email_spl | 0.566 | 10 | 9 | 11 | |||
BCEL | 10.862 | 75 | 39 | 75 | |||
DNS | 3.692 | 19 | 20 | 19 | 20 | ||
notepad_spl | 45 | 48 | 4.618 | 45 | 48 |
权值取0.5与熵权法计算权值
综上所述, 本文提出的基于熵权法计算属性和方法复杂度权重的策略, 总体上优于Briand等人[
回答问题(2)动作选择参数的设计是否合理.
强化学习算法着重于两部分, 分别是奖励函数的设计和动作选择策略的设置. 因此, 动作选择参数的取值在强化学习算法中处于重要地位. 为了进一步降低选择参数对本实验的影响, 本节就该参数的取值做了多次对比实验, 使参数分别取0、0.3、0.5、0.7、0.9、1以及动态变化值, 见公式(16). 分析得到的实验结果, 观察参数取值为多少时效果更优. 其中OCplx表示生成类集成测试序列的总体测试桩复杂度, StubsG表示生成通用测试桩的数量, StubsS表示生成特效测试桩的数量.
由于实验中ε取值0.7和0.9时得到的前3个指标基本没有差别, 因此为了进一步探究, 寻找最优的ε取值, 本实验增加了取值0.8和0.85的情况. 以ANT系统为例, 其结果如
根据
ε取值对测试ANT系统的影响
ε | 0.0 | 0.3 | 0.5 | 0.7 | 0.8 | 0.85 | 0.9 | 1.0 | 动态 |
OCplx | 7.91 | 3.83 | 2.40 | 2.11 | 2.04 | 2.01 | 2.72 | 2.72 | |
StubsG | 14 | 15 | 12 | 11 | 11 | 11 | 11 | ||
StubsS | 44 | 26 | 17 | 17 | 17 | 19 | 19 |
ε取值对测试ANT系统的影响
综上, 本文动作选择参数的设计方式更可以适应不同系统需求, 更为合理.
回答问题(3)使用强化学习的方法生成类集成测试序的效果如何.
为了比较实验效果, 本节针对本文方法对9个程序进行了30次实验并取平均值, 并分别选择了基于图论与基于搜索的各3种算法进行对比, 其中图论的三种算法分别是Le Traon等人[
总体测试桩复杂度对比
程序 | 图论 | 搜索 | 强化学习 | ||||||
Le Traon文献[ |
Tai&Daniels文献[ |
Briand文献[ |
GA文献[ |
RIA文献[ |
PSO文献[ |
CITO_RL | |||
elevator | - | - | - | 2.03 | 2.04 | 2.87 | |||
SPM | 8.4 | 8.08 | 5.82 | 3.5 | 3.48 | 5.26 | |||
ATM | 3.37 | 2.99 | 2.7 | 3.09 | 2.59 | 2.81 | |||
daisy | - | - | - | 0.58 | 0.32 | 0.92 | |||
ANT | 3.72 | 3.87 | 3.31 | 2.13 | 2.23 | 2.32 | |||
email_spl | - | - | - | 0.74 | 0.66 | 1.02 | |||
BCEL | 8.23 | 8.68 | 9.7 | 8.71 | 8.61 | 8.58 | |||
DNS | 5.02 | 4.63 | 5.51 | 4.33 | 5.81 | 3.7 | |||
notepad_spl | - | - | - | 1.96 | 4.68 | 4.67 |
观察
测试桩数目对比
程序 | 图论 | 搜索 | 强化学习 | |||||||
Le Traon
|
Tai&Daniels
|
Briand文献[ |
GA文献[ |
RIA文献[ |
PSO文献[ |
RL文献[ |
CITO_RL | |||
elevator | - | - | - | 8 | 8 | 6 | - | |||
SPM | 25 | 20 | 17 | 13 | 14 | 21 | 28 | |||
ATM | 9 | 8 | 11 | 9 | 8 | 7 | 16 | |||
daisy | - | - | - | 7 | 5 | 8 | - | |||
ANT | 18 | 28 | 14 | 13 | 14 | 19 | 16 | |||
email_spl | - | - | - | 15 | 14 | 19 | - | |||
BCEL | 68 | 128 | 70 | 63 | 55 | 88 | 77 | |||
DNS | 11 | 27 | 33 | 27 | 17 | 14 | 20 | |||
notepad_spl | - | - | - | 55 | 49 | 57 | - |
实验结果对比
仍以elevator系统为例, 该系统在3种搜索方法与本文方法得到的结果作比较时, 本文方法得到的总体测试桩复杂度最低, 所需测试桩数目也最少, GA方法[
elevator系统的结果对比
方法 | Order | OCplx | StubsS |
GA文献[ |
[4, 10, 1, 5, 8, 6, 7, 2, 3, 11, 0, 9] | 2.18 | 8 |
RIA文献[ |
[4, 8, 10, 5, 7, 6, 1, 2, 9, 3, 11, 0] | 2.16 | 8 |
PSO文献[ |
[8, 6, 10, 4, 1, 5, 2, 7, 3, 0, 9, 11] | 3.02 | 6 |
CITO_RL | [8, 6, 10, 4, 1, 5, 4, 2, 7, 3, 0, 11] | 1.57 | 5 |
对于elevator系统, 进一步分析得到每种方法所建立的测试桩如
elevator系统的测试桩对比
指标 | GA文献[ |
RIA文献[ |
PSO文献[ |
CITO_RL | |
StubsS | 7<--9(3, 9)
|
7<--9(3, 9)
|
2<--3(2, 1)
|
2<--3(2, 1)
|
|
Acplx | 13 | 13 | 12 | 9 | |
MCplx | 23 | 22 | 17 | 22 |
观察
对于SPM系统, 搜索方法无论是最终生成序列的总体测试桩复杂度还是所需构建的测试桩数目均为最优. 因为SPM系统相比其他程序而言环路更多, 仅次于类数最多的notepad_spl, 有1 178个, 而强化学习并不着重于破环, 更重视在不断的学习中让智能体自己找到一条更合适的类集成测试序列. 本实验选择的训练次数是20万次, 当训练次数达到50万次时, 本文方法得到的总体测试桩复杂度为4.9334. 因此针对SPM系统, CITO_RL算法得到的总体测试桩复杂度仍有降低的空间, 所需构建的测试桩数目也同样如此.
对于ATM系统, RIA方法[
对于BCEL系统, CITO_RL得到的总体测试桩复杂度在7个方法中排名第三, 构建测试桩数目方面排名第六, 两个指标上表现均不理想. 针对该系统, 总体表现最好的是Briand等人的图论算法[
对于DNS系统, 虽然类的数目比BCEL系统还要多, 但是类间依赖关系与环路数量均少于BCEL系统, 因此CITO_RL的总体测试桩复杂度为第二. 表现最好的是Briand等人的图论算法[
对于notepad_spl系统, 总体测试桩复杂度方面RIA随机交互算法[
箱型图
图论方法首先进行破环, 继而生成类集成测试序列, 运行时间大多不过百毫秒, 而本文方法的关键在于智能体依据奖励函数进行的探索, 在训练过程中并不存在破环的行为, 因此, 在时间上, 两类方法并不属于同一量级, 且由于文献[
运行时间对比 (ms)
程序 | 搜索 | 强化学习 | |||
GA文献[ |
RIA文献[ |
PSO文献[ |
CITO_RL | ||
elevator | 1 390 | 1 137 | 2 623 | ||
SPM | 2 210 | 2 994 | 4 739 | ||
ATM | 3 546 | 2 757 | 5 634 | ||
daisy | 3 147 | 1 803 | 5 856 | ||
ANT | 7 165 | 3 655 | 5 796 | ||
email_spl | 10260 | 3 268 | 11675 | ||
BCEL | 22412 | 10645 | 36804 | ||
DNS | 20495 | 8 644 | 61382 | ||
notepad_spl | 58518 | 8 330 | 74094 |
为验证方法的显著性, 我们将基于图论和基于搜索的方法与本文方法得到的各项指标进行统计分析. 每种方法运行30次, 采用非参数检验中的曼惠特尼U检验, 置信度为95%, 统计过程可见Github链接(
本文方法与基于图论方法进行统计分析得到的对比结果如
与图论方法显著性效果对比
程序 | 方法 | OCplx( |
StubsS( |
SPM | Le Traon文献[ |
有显著差异(好) | 有显著差异(差) |
Tai&Daniels文献[ |
有显著差异(好) | 有显著差异(差) | |
Briand文献[ |
有显著差异(好) | 有显著差异(差) | |
ATM | Le Traon文献[ |
有显著差异(好) | 有显著差异(差) |
Tai&Daniels文献[ |
有显著差异(好) | 有显著差异(差) | |
Briand文献[ |
无显著差异(0.633) | 有显著差异(差) | |
ANT | Le Traon文献[ |
有显著差异(好) | 有显著差异(好) |
Tai&Daniels文献[ |
有显著差异(好) | 有显著差异(好) | |
Briand文献[ |
有显著差异(好) | 有显著差异(差) | |
BCEL | Le Traon文献[ |
有显著差异(差) | 有显著差异(差) |
Tai&Daniels文献[ |
有显著差异(好) | 有显著差异(好) | |
Briand文献[ |
有显著差异(差) | 有显著差异(差) | |
DNS | Le Traon文献[ |
有显著差异(好) | 有显著差异(差) |
Tai&Daniels文献[ |
有显著差异(好) | 有显著差异(好) | |
Briand文献[ |
有显著差异(差) | 有显著差异(差) |
在总体测试桩复杂度OCplx方面, 15个结果中有11个显示本文方法具有显著性优势, 对于BCEL系统, 对比Le Traon等人的方法[
在所需构建测试桩数目StubsS方面, 对于所有待测系统, 本文方法仅有4个结果较好, 不具备优势, 这是由于这3种图论算法的目标都是尽量减小测试桩数目, 而本文方法是以总体测试桩复杂度为评价指标, 倾向于构建复杂度更低的测试桩, 造成测试桩数目没有最小化, 并且由于打破不同的依赖关系需要构建不同的特效测试桩, 而构建不同的测试桩所需的复杂度往往也不同, 因此构建更多测试桩的类集成测试序列可能比构建测试桩数目少的序列所花费的总体复杂度更低. 即, 相比于测试桩数目来说, 总体测试桩复杂度的衡量结果准确性更高.
与搜索方法显著性效果对比
程序 | 方法 | OCplx( |
StubsS( |
RT( |
elevator | GA文献[ |
有显著差异(好) | 有显著差异(好) | 有显著差异(差) |
RIA文献[ |
有显著差异(好) | 有显著差异(好) | 有显著差异(差) | |
PSO文献[ |
有显著差异(好) | 有显著差异(好) | 有显著差异(差) | |
SPM | GA文献[ |
有显著差异(差) | 有显著差异(差) | 有显著差异(差) |
RIA文献[ |
有显著差异(差) | 有显著差异(差) | 有显著差异(差) | |
PSO文献[ |
有显著差异(差) | 有显著差异(差) | 有显著差异(差) | |
ATM | GA文献[ |
无显著差异(0.196) | 有显著差异(差) | 有显著差异(差) |
RIA文献[ |
有显著差异(差) | 有显著差异(差) | 有显著差异(差) | |
PSO文献[ |
有显著差异(差) | 有显著差异(差) | 有显著差异(差) | |
daisy | GA文献[ |
有显著差异(好) | 有显著差异(好) | 有显著差异(差) |
RIA文献[ |
有显著差异(好) | 有显著差异(好) | 有显著差异(差) | |
PSO文献[ |
有显著差异(好) | 有显著差异(好) | 有显著差异(差) | |
ANT | GA文献[ |
无显著差异(0.221) | 有显著差异(差) | 有显著差异(好) |
RIA文献[ |
有显著差异(好) | 有显著差异(差) | 有显著差异(差) | |
PSO文献[ |
有显著差异(好) | 有显著差异(差) | 有显著差异(差) | |
email_spl | GA文献[ |
有显著差异(好) | 有显著差异(好) | 有显著差异(差) |
RIA文献[ |
有显著差异(好) | 有显著差异(好) | 有显著差异(差) | |
PSO文献[ |
有显著差异(好) | 有显著差异(好) | 有显著差异(差) | |
BCEL | GA文献[ |
有显著差异(好) | 有显著差异(差) | 有显著差异(差) |
RIA文献[ |
有显著差异(好) | 有显著差异(差) | 有显著差异(差) | |
PSO文献[ |
有显著差异(好) | 有显著差异(差) | 有显著差异(差) | |
DNS | GA文献[ |
有显著差异(好) | 有显著差异(好) | 有显著差异(差) |
RIA文献[ |
有显著差异(好) | 无显著差异(0.630) | 有显著差异(差) | |
PSO文献[ |
有显著差异(好) | 有显著差异(差) | 有显著差异(差) | |
notepad_spl | GA文献[ |
有显著差异(差) | 有显著差异(好) | 有显著差异(差) |
RIA文献[ |
有显著差异(差) | 有显著差异(好) | 有显著差异(差) | |
PSO文献[ |
无显著差异(0.139) | 有显著差异(好) | 有显著差异(差) |
总体来说, 本文提出的面向类集成测试序列生成的强化学习方法在总体测试桩复杂度方面优势显著; 在构建测试桩的数目方面, 与基于图论方法相比较差, 与基于搜索方法相比略有优势; 在运行时间方面, 与基于搜索方法相比劣势较为明显, 需要在未来进一步优化.
本节将分析影响本文实验结果的潜在因素, 进一步从内外两个方面验证实验结果的有效性.
(1)外部有效性分析
受各种外部因素限制, 无论时哪种方法都不可能完全的评测所有程序. 为了进一步说明CITO_RL方法的可行性, 本文从SIR——权威的软件工件基础结构存储库中[
(2)内部有效性分析
本文方法CITO_RL的实验正常运行的内部有效性威胁主要在如何确定智能体完成了一次训练. 为了明确这一点, 本方法给出一个终态标志, 初始时终态标志为FALSE, 当程序中出现重复的类时, 环境会给予智能体一个很小的负值, 告诉它这条序列不能通过, 终止标志置为TRUE, 此次训练完成; 当程序无重复地走完所有类时, 环境会给予智能体一个较大的正值, 告诉它这可以作为一个备选序列, 终止标志置为TRUE, 此次训练完成.
为了尽可能避免随机性数据带来的影响, 本实验选择30次运行对结果取平均值, 并分别从总体测试桩复杂度和构建的测试桩数目两个方面评测本方法的效果, 也进一步证明了本方法的有效性.
目前国内外研究人员针对类集成测试序列生成这一课题已经进行了大量研究, 提出了很多解决该问题的技术, 主要可分为基于图论与基于搜索这两种类别, 随着人工智能、机器学习等一些新兴技术的崛起, 近年来还增加了基于强化学习生成类集成测试序列的方法.
(1)基于图论的方法
图可以分为无环图和有环图两类. 针对有环图, 必须先删除关联边以断开环路, 通过这种方式得到无环图后, 再对其进行逆向拓扑排序; 针对无环图, Kung等人[
后来的研究者提出了多项为有环图的边赋值、依据权值进行破环的方案. Tai和Daniels[
上述方法都在尽量减少测试桩的数目, 然而衡量测试代价高低的因素并非只有这一个. Briand等人[
除此之外, Hewett等人[
(2)基于搜索的方法
搜索可分为无信息搜索和有信息搜索, 其中有信息搜索又被称为启发式搜索. 我们涉及的主要是启发式搜索, 这类方法通常将类集成测试序列问题看作多目标优化问题[
第(1)类使用线性加权模型的启发式搜索算法在类集成测试序列确定问题中应用最为广泛. Briand等人[
国内, 王正山等人[
第(2)类基于帕累托模型近似法的启发式搜索算法将属性复杂度与方法复杂度均视作目标函数, 使其满足帕累托最优, 这种方法也在获得类集成测试序列方面取得了不错效果. Cabral等人[
近十年来, 超启发式算法(hyper-heuristic)得到了越来越多的关注. 该算法主要是通过某种高层策略, 管理操纵一组低层的启发式算法, 进而得到一种新的启发式算法. Guizzo等人[
(3)基于强化学习的方法
当前机器学习是计算机领域研究的热门方向. 研究者发现, 将机器学习中的强化学习应用于解决类集成测试序列问题能得到较好的结果. Czibula等人[
针对已有的面向类集成测试序列生成的强化学习研究方法测试代价的评价指标不够精确的问题, 本文以总体测试桩复杂度作为评价指标, 提出了一种面向类集成测试序列生成的强化学习研究方法CITO_RL. 首先, 结合测试桩复杂度设计奖励函数, 并使用熵权法计算方法复杂度和属性复杂度的权值; 然后, 设计了强化学习中的动作选择策略, 采用了两种动作选择参数方法进行动作的选取, 进一步平衡强化学习中的探索和利用; 最后, 让智能体在环境中训练并最终学习到最优类集成测试序列. 本文选择了9个有代表性的实验对象, 分别从总体测试桩复杂度和测试桩数目两个方面与之前方法进行比较, 最终表明本文方法具有一定的有效性.
虽然我们在不同规模的基准程序上验证了本文方法的有效性, 但与真正应用在不同语言的真实大型程序上开展研究仍有一定距离. 同时本文尚未考虑面向对象程序自身的特性, 例如多态性等, 因此, 如何将本文方法和真正的待测程序结合起来并解决这些问题还有待进一步的探索. 此外, 本文提出的基于强化学习的类集成测试序列生成方法与以往的破环方法相比运行时间会随着类数成倍扩张, 未来可以考虑从软硬件两个方面提升运行效率, 软件方面可以采用多智能体进行任务调度进而优化算法; 硬件方面可以通过引入GPU并行操作来提高硬件利用率的效率和规模, 进一步降低运行时间.
Jiang SJ, Zhang M, Zhang YM, Wang RC, Yu Q, Keung JW. An integration test order strategy to consider control coupling. IEEE Transactions on Software Engineering, 2021, 47(7): 1350–1367. [doi: 10.1109/TSE.2019.2921965]
http://www.jos.org.cn/1000-9825/5714.htm]]>
http://www.jos.org.cn/1000-9825/5714.htm]]>
Czibula G, Czibula IG, Marian Z. An effective approach for determining the class integration test order using reinforcement learning. Applied Soft Computing, 2018, 65: 517–530. [doi: 10.1016/j.asoc.2018.01.042]
张艳梅, 姜淑娟, 张妙, 鞠小林. 集成测试中的类测试顺序生成技术述评. 计算机学报, 2018, 41(3): 670–694. [doi: 10.11897/SP.J.1016.2018.00670]
Zhang YM, Jiang SJ, Zhang M, Ju XL. Survey of class test order generation techniques for integration test. Chinese Journal of Computers, 2018, 41(3): 670–694 (in Chinese with English abstract). [doi: 10.11897/SP.J.1016.2018.00670]
Briand LC, Labiche Y, Wang YH. An investigation of graph-based class integration test order strategies. IEEE Transactions on Software Engineering, 2003, 29(7): 594–607. [doi: 10.1109/TSE.2003.1214324]
Kung DC, Gao J, Hsia P, Lin J, Toyoshima Y. Class firewall, test order, and regression testing of object-oriented programs. Journal of Object Oriented Programming, 1995, 8(2): 51–65.
姜淑娟, 张艳梅, 李海洋, 王庆坛. 一种基于耦合度量的类间集成测试序的确定方法. 计算机学报, 2011, 34(6): 1062–1074. [doi: 10.3724/SP.J.1016.2011.01062]
Jiang SJ, Zhang YM, Li HY, Wang QT. An approach for inter-class integration test order determination based on coupling measures. Chinese Journal of Computers, 2011, 34(6): 1062–1074 (in Chinese with English abstract). [doi: 10.3724/SP.J.1016.2011.01062]
He DY, Xu JQ, Chen XL. Information-theoretic-entropy based weight aggregation method in multiple-attribute group decision-making. Entropy, 2016, 18(6): 171. [doi: 10.3390/e18060171]
胡晓辉. 一种基于动态参数调整的强化学习动作选择机制. 计算机工程与应用, 2008, 44(28): 29–31, 48. [doi: 10.3778/j.issn.1002-8331.2008.28.009]
Hu XH. Action choice mechanism of reinforcement learning based on adjusted dynamic parameters. Computer Engineering and Applications, 2008, 44(28): 29–31, 48 (in Chinese with English abstract). [doi: 10.3778/j.issn.1002-8331.2008.28.009]
https://sir.csc.ncsu.edu/portal/index.php]]>
Traon YL, Jéron T, Jezequel JM, Morel P. Efficient object-oriented integration and regression testing. IEEE Transactions on Reliability, 2000, 49(1): 12–25. [doi: 10.1109/24.855533]
张艳梅, 姜淑娟, 陈若玉, 王兴亚, 张妙. 基于粒子群优化算法的类集成测试序列确定方法. 计算机学报, 2018, 41(4): 931–945. [doi: 10.11897/SP.J.1016.2018.00931]
Zhang YM, Jiang SJ, Chen RY, Wang XY, Zhang M. Class integration testing order determination method based on particle swarm optimization algorithm. Chinese Journal of Computers, 2018, 41(4): 931–945 (in Chinese with English abstract). [doi: 10.11897/SP.J.1016.2018.00931]
Zhang M, Jiang SJ, Zhang YM, Wang XY, Yu Q. A multi-level feedback approach for the class integration and test order problem. The Journal of Systems and Software, 2017, 133: 54–67. [doi: 10.1016/j.jss.2017.08.026]
Kung DC, Gao J, Hsia P, Toyoshima Y, Chen C. On regression testing of object-oriented programs. Journal of Systems and Software, 1996, 32(1): 21–40. [doi: 10.1016/0164-1212(95)00047-X]
Tarjan R. Depth-first search and linear graph algorithms. SIMA Journal on Computing, 1971, 1(2): 146–160.
高海昌, 冯博琴, 李远杰, 曾明. 基于扩展ORD图的类间集成测试顺序改进算法. 小型微型计算机系统, 2007, 28(4): 725–728. [doi: 10.3969/j.issn.1000-1220.2007.04.032]
Gao HC, Feng BQ, Li YJ, Zeng M. Improved inter-class integration testing sequence algorithm based on extended ORD. Journal of Chinese Computer Systems, 2007, 28(4): 725–728 (in Chinese with English abstract). [doi: 10.3969/j.issn.1000-1220.2007.04.032]
李远杰, 周国征, 刘凤晨. 一种类间测试顺序改进算法. 计算机工程, 2010, 36(8): 74–75, 82. [doi: 10.3969/j.issn.1000-3428.2010.08.026]
Li YJ, Zhou GZ, Liu FC. Improved inter-class test sequence algorithm. Computer Engineering, 2010, 36(8): 74–75, 82 (in Chinese with English abstract). [doi: 10.3969/j.issn.1000-3428.2010.08.026]
高建华, 齐丽娜. 基于对象模式关系图的测试顺序生成方法. 上海师范大学学报(自然科学版), 2008, 37(4): 369–376. [doi: 10.3969/j.issn.1000-5137.2008.04.006]
Gao JH, Qi LN. Research of the test order generation based on OMRD. Journal of Shanghai Normal University (Natural Sciences), 2008, 37(4): 369–376 (in Chinese with English abstract). [doi: 10.3969/j.issn.1000-5137.2008.04.006]
Abdurazik A, Offutt J. Using coupling-based weights for the class integration and test order problem. Computer Journal, 2009, 52(5): 557–570. [doi: 10.1093/comjnl/bxm054]
卢炎生, 毛澄映. 面向对象簇级测试中类间测试序确定方法研究. 小型微型计算机系统, 2005, 26(6): 995–999. [doi: 10.3969/j.issn.1000-1220.2005.06.028]
Lu YS, Mao CY. Method of inter-class test order determination for object-oriented cluster level testing. Mini-Micro Systems, 2005, 26(6): 995–999 (in Chinese with English abstract). [doi: 10.3969/j.issn.1000-1220.2005.06.028]
赵玉丽, 王莹, 于海, 朱志良. 基于复杂网络的类间集成测试序列生成方法. 东北大学学报(自然科学版), 2015, 36(12): 1696–1700. [doi: 10.3969/j.issn.1005-3026.2015.12.006]
Zhao YL, Wang Y, Yu H, Zhu ZL. An inter-class integration test order generation method based on complex networks. Journal of Northeastern University (Natural Science), 2015, 36(12): 1696–1700 (in Chinese with English abstract). [doi: 10.3969/j.issn.1005-3026.2015.12.006]
王莹, 于海, 朱志良. 基于软件节点重要性的集成测试序列生成方法. 计算机研究与发展, 2016, 53(3): 517–530. [doi: 10.7544/issn1000-1239.2016.20148318]
Wang Y, Yu H, Zhu ZL. A class integration test order method based on the node importance of software. Journal of Computer Research and Development, 2016, 53(3): 517–530 (in Chinese with English abstract). [doi: 10.7544/issn1000-1239.2016.20148318]
Zhang M, Keung JW, Xiao Y, Kabir MA. Evaluating the effects of similar-class combination on class integration test order generation. Information and Software Technology, 2021, 129: 106438. [doi: 10.1016/j.infsof.2020.106438]
张妙, 姜淑娟, 张艳梅. 多目标优化类集成测试序列确定问题研究进展. 小型微型计算机系统, 2017, 38(8): 1772–1777. [doi: 10.3969/j.issn.1000-1220.2017.08.022]
Zhang M, Jiang SJ, Zhang YM. Research on multi-objective optimization in class integration test order. Journal of Chinese Computer Systems, 2017, 38(8): 1772–1777 (in Chinese with English abstract). [doi: 10.3969/j.issn.1000-1220.2017.08.022]
张悦宁, 姜淑娟, 张艳梅. 基于梦境粒子群优化的类集成测试序列生成方法. 计算机科学, 2019, 46(2): 159–165. [doi: 10.11896/j.issn.1002-137X.2019.02.025]
Zhang YN, Jiang SJ, Zhang YM. Approach for generating class integration test sequence based on dream particle swarm optimization algorithm. Computer Science, 2019, 46(2): 159–165 (in Chinese with English abstract). [doi: 10.11896/j.issn.1002-137X.2019.02.025]
Vergilio SR, Pozo A, Árias JCG, Da Veiga Cabral R, Nobre T. Multi-objective optimization algorithms applied to the class integration and test order problem. International Journal on Software Tools for Technology Transfer, 2012, 14(4): 461–475. [doi: 10.1007/s10009-012-0226-1]
Assunção WKG, Colanzi TE, Vergilio SR, Pozo A. A multi-objective optimization approach for the integration and test order problem. Information Sciences, 2014, 267: 119–139. [doi: 10.1016/j.ins.2013.12.040]
Deb K, Pratap A, Agarwal S, Meyarivan T. A fast and elitist multiobjective genetic algorithm: NSGA-II. IEEE Transactions on Evolutionary Computation, 2002, 6(2): 182–197. [doi: 10.1109/4235.996017]
Knowles JD, Corne DW. Approximating the nondominated front using the Pareto archived evolution strategy. Evolutionary Computation, 2000, 8(2): 149–172. [doi: 10.1162/106365600568167]