测试用例自动生成工具_测试用例自动生成工具[通俗易懂]

测试用例自动生成工具_测试用例自动生成工具[通俗易懂]摘要测试用例生成本质上是一个多目标问题,因为目标是覆盖多个测试目标

353252828f0c1f67abda2e2a99493349.png

摘要

测试用例生成本质上是一个多目标问题,因为目标是覆盖多个测试目标。现有基于搜索的方法要么一次考虑一个目标,要么将所有目标聚合成一个适应度函数(完整套件方法,whole-suite approach,WS)。多目标优化算法(MOAs)从来没有应用于这个问题,因为现有算法不能根据实际软件中通常存在的覆盖目标数量进行调整。此外,MOAs 的最终目标是在目标空间中寻找替代的折衷解决方案,而在测试生成中,有趣的解决方案只是那些覆盖一个或多个未覆盖目标的测试用例。

本文提出了一种新的多目标求解器 DynaMOSA(dynamic multi-objective sorting Algorithm,DynaMOSA),它是一种新的多目标求解器,专门用来解决覆盖测试环境下的测试用例生成问题。DynaMOSA 通过使用基于控制依赖层次结构的覆盖目标动态选择来扩展作者以前的多目标技术 MOSA(multi-objective Sorting Algorithm)。这种扩展使得该方法在搜索预算有限的情况下更加有效和高效。

我们对 346 个 Java 类进行了实证研究,使用三个覆盖标准(即语句、分支和变异覆盖率)来评估 DynaMOSA 在完整套件方法(WS)、其基于存档的变体(WSA)和 MOSA 方面的性能。结果表明,DynaMOSA 在 28%的分支覆盖率(平均增加 8%的覆盖率)和 27%的突变覆盖率(平均增加 11%)方面优于 WSA。在语句覆盖率方面,它在 51%的类中优于 WS,平均覆盖率提高了 11%。此外,DynaMOSA 在所有三个覆盖率标准上都优于它的前一代 MOSA,其中 19%的类的代码覆盖率平均高出 8%。

简介

基于搜索的测试用例生成器使用元启发式优化算法,从先前生成的测试用例中生成新的,从而减少并最终消除它们与每个尚未发现的目标的距离。这种距离的实际计算取决于所考虑的覆盖标准类型。在传统进化测试中,一个元启发式算法被多次应用以覆盖所有目标,每次使用不同的目标,直到所有目标都被覆盖或搜索总预算被耗尽。因此,最终的测试套件由覆盖一个或多个目标的所有测试用例组成,包括那些意外覆盖先前未覆盖目标的测试用例。

一次搜索一个目标在几个方面是有问题的。在所有目标上统一分配搜索预算可能在很大程度上是次优的,不可行的目标的存在也完全浪费了搜索时间。测试用例生成的完整套件的方法(WS)是最近解决这些问题的一次尝试。在单目标问题中,将一个复杂的单目标问题重新表述为定义在多个但更简单目标上的多目标问题,可以降低搜索陷入局部最优的概率,最终导致更快的收敛。然而当将多目标优化应用于测试用例生成时,有两个主要挑战需要解决:1、没有一个可用的多目标或多目标解算器能够扩展到覆盖测试中常见的目标数量;2、多目标解算器旨在增加解决方案的多样性,而不仅仅是单独地完全实现每个目标。

为克服上述局限性,我们引入了多目标排序算法(MOSA),一种针对测试用例生成问题而定制的多目标遗传算法。MOSA 有三个主要特点:1、它使用一种新的偏好准则,而不是根据解的帕累托最优性对解决方案进行排序;2、它只将搜索集中在尚未发现的覆盖目标上;3、它将满足一个或多个先前未发现的目标的所有测试用例保存到一个存档中,当搜索结束时,该存档包含最终的测试套件。

最近,Rojas 等人开发了带有归档(archive)的完整套件方法(WSA),这是一种混合策略,将 MOSA 的一些例程合并到传统的 WS 方法中。从经验的观点来看,WSA 在统计学上优于 WS 和一次一个目标的方法。但它产生了以下尚未回答的问题:(1)MOSA 的优势在多大程度上是源于对问题的多目标重新表述,或是源于归档机制的使用?(2) 由于两者都实施了一种归档策略,与 WSA 相比,MOSA 的性能如何?

本文中作者回答了前面提到的开放性问题。首先提出了使用动态目标选择的多目标排序算法 DynaMOSA(multi Objective Sorting Algorithm with Dynamic target selection),它扩展了 MOSA 的能力,使其能够在控制依赖层次的基础上,动态地将搜索集中在尚未发现的目标子集上。由于 DynaMOSA 使用相同的多目标算法和偏好准则对 MOSA 考虑的目标子集进行优化,因此确保 DynaMOSA 与 MOSA 具有同等或更高的效率。

问题表述

单目标表述

问题 1:设 U={u1,…,uk}为被测程序的结构测试目标集。找到一个测试套件 T={t1,…,tn},它使适应度函数最小化:

41ddc5d0cd1216fcce40c6a15ee6e2ef.png

其中 d(u,T)表示根据特定距离函数的目标 u 的最小距离。

问题 2:让 B={b1,…,bk}是一个类中的一组分支。找到一个覆盖所有可行分支的测试套件 T={t1,…,tn},即最小化以下适应度函数的测试套件:

279c6cf94672eb0ab8f34950a3f99d14.png

其中|M|是方法总数,|MT|是 T 中所有测试用例执行的方法数,d(b,T)表示分支 b∈B 的最小规范化分支距离。

术语|M|−|MT|说明了未由 T 执行的方法的入口边缘。每个分支 b∈B 的最小正规化分支距离 d(b,T)定义为:

eba63bbeb7e4fead1754cf9c6b2cee6b.png

其中 Dmin(t∈T, b)是最小的非规范化分支距离,根据任何可用的分支距离计算方案进行计算;这里的最小是指控制分支的谓词在一个测试用例中或由不同的测试用例执行多次的可能性。所有此类处决都是最低限度的。

问题 3:让 S={s1,…,sk}是一个类中的语句集。找到一个包含所有可行语句的测试套件 T={t1,…,tn},即最小化以下适应度函数的测试套件:

84ac4df4c7100b4cb95839da80c76f64.png

其中|M|是方法总数,|MT|是 T 中所有测试用例执行的方法的数目;BS 是对 S 中的语句有直接控制依赖关系的分支集;d(b, T)表示分支 b∈BS 的最小规范化分支距离。

问题 4:让 M={m1,…,mk}是一个类的突变集。找到一个测试套件 T={t1,…,tn}杀死所有突变体,也就是说,一个最小化以下适应度函数的测试套件:

2971beecd27cfa1db332a91ae24adfed.png

其中

0d695ec411319ae0b31af0ba161576c6.png

(T)是 T 中所有分支对 M 中的一个突变具有直接控制依赖性的全套适应度函数;di 估计状态感染的距离;dp 表示传播距离。

多目标表述

问题 5:让 U={u1,…,uk}作为要覆盖的测试目标集。找到一组非支配测试用例 T={t1,…,tn},它们最小化所有测试目标 u1,…,uk 的适应度函数,即最小化以下 k 个目标:

c9d479631e8422e2924a91d0c176b74f.png

其中每个 d(ui,t)表示测试用例 t 与覆盖测试目标 ui 之间的距离。向量也被称为适应度向量。

问题 6:设 B={b1,…,bk}为一个类的分支集。找到一组非支配测试用例 T={t1,…,tn},它最小化所有分支 b1,…,bk 的适应度函数,即最小化以下 k 个目标:

68b628571e2ec640b0fa2cd30352ed2e.png

其中,每个 d(bj,t)表示分支的标准化分支距离,由 t 执行,它最接近 bj(即,它是来自 bj 的最小控制依赖数),而 al(bj,t)是相应的接近级别(即最近执行的分支和 bj 之间的控制依赖数)。

问题 7:让 S={s1,…,sk}是一个类中的语句集。找到一组非支配测试用例 T={t1,…,tn},它最小化所有语句 s1,…,sk 的适应度函数,即最小化以下 k 个目标:

b1df229b1afb4e3d0172b5dc5374f159.png

其中每个 d(b(sj),t)表示最接近 b(sj)的分支的测试用例 t 的标准化分支距离,该分支直接控制语句 sj 的执行,而 al(sj,t)是相应的接近级别。

问题 8:让 M={m1,…,mk}是一个类的突变集。找到一组非支配测试用例 T={t1,…,tn},它最小化所有突变体 m1,…,mk 的适应度函数,即最小化以下 k 个目标:

c8499f72f5ac412dc02e799b115b152c.png

式中,d(b(mj),t)和 al(mj,t)分别表示突变 mj 的标准化分支距离和测试用例 t 的接近水平;di(mj,t)是与状态感染的距离,而 dp(mj,t)测量传播距离。

定义 1:当且仅当目标函数向量的值满足以下条件时,一个测试用例 x 支配另一个测试用例 y(也写为 x≺y):

d6bac9c31e771c4b30807198a32c252e.png

定义 2:一个测试用例 x*是 Pareto 最优的当且仅当它在所有可能的测试用例空间(可行域)中不被任何其他测试用例所控制。

作者提出的多目标算法

测试用例生成需要将搜索工作集中在那些更接近程序的一个或多个未覆盖目标的测试用例上。为此我们提出以下偏好准则,以便在非支配测试用例中施加优先顺序:

定义 3:给定一个覆盖目标 ui,当且仅当 ui 的目标函数值满足以下条件时,测试用例 x 优于另一个测试用例 y(也称为

686fde89b4047a638954286fcff8de8a.png

):

91f0a7e1df755f3ab053184519c4c60c.png

其中 fi(x)表示覆盖目标 ui 的测试用例 x 的目标分数(参见第 2 节),size 度量测试用例语句数。给定覆盖率目标 ui 的最佳测试用例是该目标(

aa744ac5c1b44f1db9870f210cb4b783.png

)的最佳测试用例。所有未覆盖目标的最佳测试用例集(

4696cf5c0318c4a3452251f216876870.png

)定义了帕累托前沿的子集,该子集优先于我们算法中的其他非支配测试用例。当给定覆盖率目标 ui 有多个具有相同最小适应值的测试用例时,我们使用测试用例语句数作为次要的首选标准。我们选择了这个次要标准,因为生成的测试需要人工检查候选断言。

简而言之,NSGA-II 从一组初始随机测试用例开始,它表示搜索空间的随机样本(算法 1 第 3 行)。然后,群体通过一系列的世代进化,以找到更好的测试用例。为了生成下一代,NSGA-II 首先创建新的测试用例,称为子代,方法是使用交叉运算符组合当前一代中两个选定测试用例(父代)中的部分,并使用变异运算符随机修改测试用例(函数 GENERATE-depensions,在算法 1 第 5 行)。父母是根据一个选择算子来选择的,该算子使用帕累托最优性来为当前人群中的非支配(最适)测试用例提供更高的繁殖机会。拥挤距离用于决定选择哪个测试用例:远离总体其余部分的非支配测试用例被选中的概率更高(算法 1 第 10-15 行)。此外,NSGA-II 使用快速非支配排序算法来保存下一代中形成当前帕累托边界的测试用例。经过几代之后,NSGA-II 收敛到“稳定”的测试用例,这些测试用例代表了问题的帕累托最优解决方案。

f1f5a62ed402722dbb5a90bb8d7a4e24.png

MOSA:一种多目标搜索算法

多目标排序算法 MOSA 用一种新的基于偏好准则的排序算法取代了传统的非支配排序算法。如算法 2 所示,MOSA 与 NSGA-II 的初始步骤相同:它从一组随机生成的测试用例开始,形成初始总体(算法 2 的第 3 行);然后,它使用交叉和变异创建新的测试用例(在算法 2 的第 6 行函数生成-子代)。

3c9930c98722557a582c7ecba575b3c7.png

选择。与 NSGA-II 不同,在 MOSA 中,选择是通过同时考虑非优势关系和提出的偏好准则(函数偏好排序,在算法 2 第 9 行)来执行的。具体地说,算法 3 提供伪码的偏好排序函数确定每个未覆盖目标 ui∈U 的目标得分最低的测试用例(如分支距离+分支覆盖的接近级别),即最接近覆盖 ui 的测试用例(算法 3 的 2-6 行)。所有这些测试用例都被指定为 rank 0(即它们被插入到第一个非支配前沿面 F0 中),以便使它们有更高的机会存活到下一代。然后,根据 NSGA-II 使用的传统非支配排序算法对剩余的测试用例(未分配到第一个 rank 的测试用例)进行排序,从 rank 等于 1 开始,依此类推(算法 3 第 11-15 行)。为了加快排序过程,只有当 F0 中的测试用例数小于总体规模 M(第 8 行中的条件)时,才使用传统的非支配排序算法。相反,当满足条件|F0|>M 时,PREFERENCE-SORTING 函数只返回两个前端:第一个前端(rank 0),其中所有测试用例都由我们的偏好标准选择;第 1 列包含 T 中的所有剩余测试用例,即 F1=T−F0。

dbae55a0c6953f6dc2b0d2d3dd251843.png

支配性(Dominance)。需要注意的是,常规的 FAST-NONDOMINATED-SORT 只考虑未覆盖目标的非优势关系,即将搜索集中到剩余搜索空间的感兴趣子区域,从而为剩余的测试用例分配等级。这种非优势关系是由一个特定的支配性比较器来计算的,该比较器在决定两个测试用例 t1 和 t2 是否彼此不占优势时,迭代所有未覆盖的目标(例如 t1)支配另一个(例如 t2)。而 Deb 等人定义的原始支配性比较器迭代所有目标(目标),在 MOSA 中我们使用算法 4 中描述的优势比较器。这样的比较器只迭代未覆盖的目标(算法 4 第 4 行的循环条件)。此外,一旦发现两个未覆盖目标,其中两个测试用例 t1 和 t2 互不支配(算法 4 第 11-12 行),迭代将终止,而不分析进一步的未覆盖目标。

fb728d1534cbcd4f6db4cba10974c945.png

拥挤距离。一旦给所有候选测试用例分配了一个等级,则使用拥挤距离为同一战线上的一些测试用例提供更高的被选中概率。作为拥挤距离的度量,对于许多客观优化问题我们使用了 Koppen 等人提出的子向量优势分配。具体地说,算法 2 中第 12 行的循环以及随后的第 16 行和第 17 行将尽可能多的测试用例添加到下一代中,直到达到总体规模。该算法首先从第一前沿面(F0)中选择非支配测试用例;如果所选测试用例的数量小于总体规模 M,则循环从第二个前沿面(F1)中选择更多的测试用例,依此类推。当从当前前沿面 Fd 添加的测试用例超过总体大小 M 时,循环停止。在循环结束时(第 16-17 行),当选择的测试用例数小于总体大小 M 时,算法根据拥挤距离的降序从当前前沿面 Fd 中选择剩余的测试用例。

归档。作为其他许多目标算法的另一个特点,MOSA 使用称为归档(archive)的第二个总体来跟踪覆盖被测程序目标的最佳测试用例。具体地说,无论何时生成新的测试用例(无论是在搜索开始时还是在创建子代时),MOSA 都将满足先前未发现目标的测试作为候选测试用例存储在存档中,以形成最终的测试套件(算法 2 第 4 行和第 7 行)。为此,函数 UPDATE-ARCHIVE(在算法 5 中报告完整性)用新生成的测试用例更新存档中存储的测试用例集。此函数在更新存档时同时考虑覆盖的目标和测试用例的长度:对于每个覆盖的目标 ui,它在存档中存储覆盖 ui 的最短测试用例。

511b9eea5a281043ec3efd69a4b2e07b.png

总而言之,一代一代的 MOSA 将搜索的重点放在测试程序的未覆盖目标上;它还将最短的覆盖测试用例存储在一个外部数据结构(即存档)中,以形成最终的测试套件。最后,由于 MOSA 在选择测试用例时使用拥挤距离,它促进了多样性,这是避免过早收敛到搜索空间的次优区域的一个关键因素。

DynaMOSA:优化目标的动态选择

MOSA 的一个主要限制是,它将所有覆盖目标视为独立目标,从第一代开始进行优化。然而,在决定优化哪些目标时,目标之间存在结构性依赖关系。

为了更好地解释这个概念,让我们考虑图 3 中的示例。要覆盖的四个分支,b1、b2、b3、b4 不是相互独立的。实际上,b2、b3 的覆盖只有在 b1 被覆盖之后才能实现,因为前者的目标由后者控制。换言之,b1 和 b2,b3 之间存在控制依赖关系,这意味着 b2,b3 的执行取决于节点 2 处的条件结果,而该结果仅在目标 b1 被覆盖时才被评估。如果没有测试用例覆盖 b1,则 MOSA 中的排序由适应度函数 f1 = d(b1) 确定。当对两个相依支路 b2 和 b3 评估测试时,各自的适应度函数将等于 f1+1,因为 b1 覆盖范围的唯一差异是更高的接近水平(在这种情况下是+1),而分支距离 d 是相同的。由于 f2 和 f3 的值相对于 f1 只是移动了一个常量(接近水平),所以测试用例的排序与单独考虑 f1 时得到的结果相同。这意味着在偏好排序过程中考虑目标 f2、f3 是无用的,因为它们对最终排名没有贡献。

c8b2042e8f003463d1c8f8e7feaecc44.png

上面所示的例子表明,在标准流程分析中,可以根据以下概念将覆盖目标组织成优先级层次:

定义 4(支配者):如果到 s2 的每个执行路径都经过 s1,则语句 s1 支配另一个语句 s2。

定义 5(后支配者):如果从 s2 到出口点(return 语句)的每个执行路径都经过 s1,则语句 s1 后支配另一个语句 s2。

定义 6(控制依赖):程序语句 s1 和程序语句 s2 之间存在控制依赖,前提是:s2 不是 s1 的后支配者,以及 s1 和 s2 之间的控制流图中存在一条路径,其节点被 s2 后支配。

控制依赖定义中的条件(1)确保 s2 不必在 s1 之后执行。条件(2)确保一旦在 s1 和 s2 之间采取特定路径,s2 的执行就不可避免。因此,s1 是一个决策点,其结果决定了 s2 的不可避免的执行。

定义 7(控制依赖图):由表示程序语句的节点 n∈N 和表示程序语句之间控制依赖的边

543a0fed76f4d547d540927b6fd9b554.png

组成的图

f69d0228b89e1addc980931295ae3185.png

称为控制依赖图。节点 s∈N 表示入口节点,它连接到所有不受另一个节点控制依赖的节点。

上面给出的控制依赖定义可以很容易地从程序语句扩展到任意覆盖目标。例如,给定要覆盖的两个分支,b1,b2,如果 b1 被语句 s1 后控,则 b1 对 b2 具有控制依赖关系,s1 对节点 s2 具有控制依赖关系,而节点 s2 对 b2 具有控制依赖关系。

在 DynaMOSA 中,控制依赖图用于导出哪些目标独立于任何其他目标(没有控制依赖关系的目标),哪些目标只有在满足图中先前的目标后才能被覆盖。算法 6 说明了 DynaMOSA 和 MOSA 的区别。在搜索过程的开始,DynaMOSA 只选择那些不受控制依赖的目标作为初始目标集(第 2 行)。一旦生成随机测试用例的初始总体(第 4 行),则使用算法 7 中突出显示的例程 UPDATE-TARGET 更新当前目标集 U。此例程也在每次迭代时调用,以更新当前的目标集 U以根据执行子代的结果在每一代中考虑(算法 6 第 10 行)。因此,只考虑 U* ⊆ U 中的目标,计算适应度评估(第 8 行)、偏好排序(第 12 行)和拥挤距离(第 16 行)。

6db37782dd368476eb8f1866910b5479.png

例程 UPDATE-TARGET 负责动态更新一组选定的目标 U以便包括依赖于新覆盖目标的任何未覆盖目标。它迭代 U ⊆ U 中的所有目标(算法 7 第 2-6 行中的循环),对于新覆盖的目标(第 3 行中的条件),它访问控制流图以找到所有依赖于控制的目标。实际上,算法 7 使用了一个标准的图访问算法,每当遇到未覆盖的目标时,它就会停止访问(第 7-13 行)。此时遇到的目标被添加到目标集 U中,由 DynaMOSA 在下一代中考虑。如果遇到的目标被覆盖,则访问将递归地继续,直到找到第一个未覆盖的目标或已访问所有目标(第 9-11 行)。这样可以确保只有在访问覆盖目标后遇到的第一个未覆盖目标添加到 U中。以下所有未覆盖的目标都将被忽略,因为图形访问停止。

97bd981431dbe54a5c8de9f7edbbd17b.png

通过这种方式,MOSA 执行的排名保持不变(下面提供了一个正式的证明),同时由于要同时优化的目标数量保持较小,因此更快地实现了最终测试套件的收敛。直观地说,MOSA 的排序不受未覆盖目标控制的目标排除的影响,因为这些排除的目标诱导测试用例的排序与控制节点诱导的排序相同。

为了证明算法 6 的执行产生的目标的动态选择是合理的,必须满足两个主要条件:

1) 由于在每一代,DynaMOSA 使用的集合 U包含所有具有最小接近水平的目标,因此对于 U−U中每个剩余目标 ui,应该存在一个目标 u∈U,使得

c345c8fb207aff7087e8a73bb4e5cb5e.png

2) 与计算所有未覆盖目标的偏好排序和拥挤距离的成本相比,算法 7 中的例行更新获取的计算成本可以忽略不计。

第一个条件由定理 1 确定,如下所示。第二种观点在理论上没有得到保证,但在实践中却被发现是经验性的。

DynaMOSA 生成的测试用例与 U的距离最小,U是一组未覆盖的目标,通过一个或多个测试用例执行跟踪的控制依赖边可以直接到达。另一方面,MOSA 生成的测试用例与全套未覆盖目标 U 的距离最小。当且仅当与 U元素的最小距离处的测试用例也是与 U最小距离处的测试用例时,这两个最小化过程是等价的。以下定理为动态选择算法 7 产生的目标子集提供了理论依据,通过证明 MOSA(Tmin)和 DynaMOSA(T0)分别优化的两组测试用例是相同的。

定理 1:设 U 为所有未覆盖目标的集合;Tmin 为从 U 到 T0 的最小接近水平的测试用例集合;U*是来自一个或多个测试用例 t∈T0 的接近级别为 0 的未覆盖目标集,则两组测试用例 Tmin 和 T0 是相同的,即 Tmin=T0。

证明:由于接近水平总是大于或等于零,所以 T0 元素的接近水平被保证是最小的。因此,T0⊆Tmin。现在让我们矛盾地证明,不可能存在任何与测试用例 t 相关联的未覆盖目标 u,其来自 u 的接近级别严格大于零,以致 t 不属于 T0。让我们考虑控制依赖图中从 t 到 u 的执行轨迹的最短路径。这种路径中的第一个节点 u’属于 U*,因为它是一个未覆盖的目标,并且它从 t 的轨迹接近 0 级。实际上,它是一个未覆盖的目标,因为否则覆盖它的测试用例 t’的执行跟踪将更接近 u 而不是 t。因为它满足关系接近级别(t,u’)=0,测试用例 t 必须是 T0 的一个元素。因此,Tmin 不能包含任何不在 T0 中的测试用例,并且等式 Tmin=T0 必须成立。

由于同一组测试用例与 U 或 U之间的距离最小,因此 MOSA 基于测试用例与 U之间的距离执行的测试用例选择在算法上等同于 DynaMOSA 基于测试用例与 U*之间的距离进行的测试用例选择。

DynaMOSA 迭代的目标数较少(U* ⊆ U),这一事实直接影响到每一代的计算成本。事实上,在每一代中,两个多目标算法共享两个例程:偏好排序和拥挤距离分配例程,如算法 2 和 6 所示。对于第一个排序的前沿,常规的偏好排序依赖于 Deb 等人传统的快速非支配排序,其总体计算复杂度为 O(M2×N),其中 M 为总体规模,N 为目标数。因此,对于 MOSA 来说,这种程序的成本是 O(M2×|U|),其中 U 是给定代中未覆盖目标的集合。对于 DynaMOSA,计算成本降低为 O(M2×|U|),U* ⊆ U 是具有最小进近水平的未覆盖目标集。对于所有目标都没有结构依赖关系的平凡类(即只有无分支方法的类),由于 U* = U,因此优先排序的成本将是相同的。但是,对于非平凡类,我们希望 U* ⊂ U 会降低计算复杂度。

对于其他共享程序,即拥挤-距离分配,也可以进行类似的分析。根据 Koppen 等人,当使用子向量优势分配时,这样一个程序的代价是 O(M2×N),其中 M 是种群的大小,N 是目标的数目。因此,对于 MOSA 来说,这种程序的成本是 O(M2×|U|),其中 U 是给定代中未覆盖目标的集合;而对于 DynaMOSA,则是 O(M2×|U|)。对于非平凡类,只要条件 U*⊂U 成立,DynaMOSA 将迭代较少数量的目标。

此外,MOSA 要求计算所有未覆盖目标 U 和每个新生成的测试用例的适应度得分(例如,分支覆盖中的接近水平和分支距离)。特别是,对于每个测试用例,MOSA 要求计算执行轨迹与 U 中所有目标之间的距离。相反,DynaMOSA 只关注具有最小接近水平的覆盖目标,因此只需要计算 U*⊆U 的适应度得分。

DynaMOSA 对 MOSA 的附加操作是程序内控制依赖图的构造及其对目标选择的访问。对于所有的测试用例生成迭代只需支付一次过程内控制依赖图的构建成本,并且可以在运行该算法之前离线执行该图的计算。对于覆盖目标选择,控制依赖图的访问可以非常有效地执行(对于结构化程序,图是一棵树)。因此,由 DynaMOSA vs.MOSA 在计算偏好排序、拥挤距离分配和适应度得分方面的节省预计将支配这两个算法的总体执行时间,而 DynaMOSA 执行的控制依赖图访问预计会引入可忽略的开销。我们的实验证实了这一点。事实上,在我们的实验中,被测方法的过程内控制依赖图及其访问消耗的执行时间与 MOSA 执行的额外计算所花费的时间相比可以忽略不计。

研究问题与结果

RQ1:与针对分支覆盖的其他方法相比,DynaMOSA 的表现如何?

我们可以得出这样的结论:与 WSA 和 MOSA 相比,DynaMOSA 实现了更高或相等的分支覆盖。此外,DynaMOSA 更快速地收敛到这样的覆盖范围,特别是在搜索时间有限的情况下。最后,与归档策略的使用相比,我们的多目标重新制定为分支覆盖率提供了更多的好处,因为它优于 WSA,后者通过归档策略扩展了 WS。

RQ2:与针对语句覆盖的其他方法相比,DynaMOSA 的表现如何?

我们可以得出这样的结论:与 WS 和 MOSA 相比,DynaMOSA 实现了更高或相等的语句覆盖率。在语句覆盖率没有改善的类上,DynaMOSA 更快地收敛到最终覆盖率,特别是在搜索时间有限的情况下。

RQ3:与针对变异覆盖的其他方法相比,DynaMOSA 的表现如何?

与 WSA 和 MOSA 相比,DynaMOSA 杀死更多或相同数量的突变体。此外,对于突变分数没有改善的类,DynaMOSA 收敛得更快。

RQ4:preference criterion 和 Pareto dominance 是如何影响 DynaMOSA 的有效性的?

我们的偏好准则是 DynaMOSA 的一个重要组成部分,在处理多个目标(RQ4)时,它是提高选择压力的必要条件。事实上,基于帕累托的排名(即使有存档)不足以处理成百上千的目标,就像测试用例生成的情况一样。

致谢

本文由南京大学软件学院 iSE 实验室 2019 级硕士研究生朱晨乾翻译转述。

今天的文章测试用例自动生成工具_测试用例自动生成工具[通俗易懂]分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/89001.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注