6.1.1 相关技术研究

更新于 2026年10月10日 版权声明
6.1.1 相关技术研究

1.回归测试

在软件周期的任何阶段,软件一旦发生了改变,就有可能出现问题。软件的改变往往源于两种情况,即旧问题的修复和新模块的增加。而当开发人员对软件出现的错误理解不全面或者软件的管理系统不完善时,往往可能会导致错误没有在根源上进行修正,甚至有新的错误产生。所以,每当软件产生了变化,都要对现有的功能进行重新测试,以确定这些改动是否达到了预期效果和是否对原有功能产生了不利影响,同时还要针对新增加或者修改后的功能添加新的测试用例。因此,为了保证软件在迭代过程中的正确性和稳定性,回归测试是软件开发中一个至关重要的环节。

(1)回归测试的基本概念

定义6-1 回归测试是指对旧的代码进行修改后,对修改后的代码重新测试以确认修改是否引入了新的错误或者导致其他代码产生了错误[1]。

作为软件生命周期的重要组成部分,回归测试会出现在软件开发的各个阶段。在渐进和快速的迭代开发中,往往版本更迭较快,每一次新版本的发布都要进行回归测试,这使得回归测试非常频繁。因此,设计合适的策略来提高回归测试的效率和有效性以及降低回归测试成本有着非常重要的意义。

(2)回归测试的方法

回归测试主要关注的是效率和有效性这两个方面。常用的回归测试方法为以下几种。

①再测试全部用例

在这种方法中,回归测试包是基准测试用例库中所有的测试用例,属于最安全的一种方法,遗漏错误风险的可能性是最小的,但是因为要执行所有测试用例,其成本也是最高的。随着软件开发进程的延续,执行全部测试用例的难度和成本甚至会超出预期。

②基于风险选择测试

除了运行全部的测试用例之外,也可以基于一定的风险标准从基准测试用例库中选择测试用例,组成回归测试包。跳过那些非关键、高稳定和优先级别低的测试用例,选择运行关键、重要和可疑的测试用例,这些用例会有很大可能检测到缺陷。一般而言,往往是从主要特征再到次要特征检测的。

③基于操作剖面选择测试

如果测试用例是基于软件可靠性工程中的操作剖面开发的,就可以预测到测试用例的实际测试情况,这种情况下可以优先选择软件中使用最频繁或者最重要部分的测试用例,这样可以优先考虑、测试到最高级别的风险。这种方法可以在控制成本的情况下,最高效地检测和提高系统稳定性,但是往往在实际应用中较为困难。

④再测试修改的部分

当测试者对软件的变动比较熟悉时,可以使用相依性来对软件的修改状况进行分析,预测软件改动后的影响,因此可以将测试的范围缩小,只针对有变动和受影响的模块。

在以上4种方法中,再测试全部用例是最安全的,但是由于每次改动不一定会影响软件的所有部分,因此运行多次的回归测试往往是无效的操作,难以发现新的故障,从而对人力、时间等造成浪费。一般测试人员会根据实际情况来选择策略,执行缩减的回归测试[1]。

(3)测试用例

测试用例是指对一个待测软件的测试任务的描述,总体包含了测试的方案设计、测试的方法、测试的技术以及测试的策略,在实际的测试操作中,具体表现为测试的目标、环境、输入的数据、步骤、预期的结果以及执行测试的脚本等,经过一系列操作后,最后得到相关的测试文档。

测试用例的定义如下。

定义6-2 测试用例是根据所需要的测试目标来设计的一组测试输入、执行环境和预期得到的结果,其主要目的是检测软件是否到达所需的质量要求[2]。

①测试用例的主要作用

a.指导测试的实施

测试用例的应用往往不局限于回归测试,在系统测试和集成测试中也有很广泛的应用。针对不同的场景,测试用例的设计都有明确的规定,测试人员不得随意改动。在进行测试任务的过程中,测试用例作为测试的标准,测试人员必须严格按照测试用例要求和步骤进行测试,并根据要求对测试的情况进行记录,生成得到测试的结果。

b.规划测试用例的准备

在设计测试中,一般会按照测试用例来准备一组或多组测试的原始数据,以及对应的标准测试结果。除正常的数据外,还必须根据测试用例设计一些边缘的数据和错误的数据,用来检测是否有边缘问题和软件的鲁棒性。

c.评估测试结果的度量基准

测试完成后,会得到相应的测试结果,而如何对测试结果进行评估是生成测试报告的关键。由于需要编制测试报告,因此需要对一些指标进行量化。常见的测试指标有测试用例的分支覆盖率和语句覆盖率、测试的合格率等。过去使用的统计基准往往是软件的模块或者功能点,这样虽然能总体满足需求,但是这样的结果对于软件测试来说显得过于粗糙,因此相较于传统的统计基准,使用测试用例作为测试基准,是一种更为准确有效的方法。

d.分析缺陷的标准

进行测试的主要的目的就是分析软件是否有缺陷,因此在得到测试结果报告后,使用得到的数据与测试用例和缺陷数据库进行比较,分析我们得到的结果,总体来说主要有两类问题:一类问题是漏测,即表示测试用例不能满足覆盖率等要求,在这种情况下需要补充测试用例,完善软件测试的质量;另一类问题是缺陷复现,在这种情况下并不缺少测试用例,因此表示测试过程或者软件开发变更出现问题,需要进行相应的排查,完善软件的质量[3]。

②测试用例的设计

测试用例的质量会直接影响软件测试的效果,而软件测试的质量直接关系着软件产品的质量,因此设计好的测试用例,对软件产品的质量有着至关重要的作用。一方面,好的测试用例可以节约软件测试的资源;另一方面,好的测试用例可以更有效地检测出软件开发过程中出现的问题和缺陷,从而提高测试的效率。

测试用例设计一般遵循以下原则。

a.正确性(https://www.daowen.com)

正确性主要是指测试用例首先要满足覆盖需求规格说明书的基本要求,即测试点可以测试到各项功能,并且判断是否正常运行。

b.全面性

除了对测试点基本功能的测试外,还要考虑一些更复杂的情况,如用户实际使用时可能的情况、与其他功能进行关联的情况、当出现非法操作时的情况和非正常环境设置的情况等,因此设计测试用例时要覆盖所有的需求功能项。

c.连贯性

设计测试用例时应保证条理清晰、主次分明,特别是在测试业务方面。从执行粒度来讲,最基本的是要保持每个测试用例都有测试点,但是为了保证测试执行的简洁,减小测试时的牵连,尽量不要同时覆盖多个测试点,因此测试用例之间保持连贯性是至关重要的。

d.可判定性

为了便于判断测试结果和生成测试结果,每一个测试用例都要有其对应的测试结果,防止测试完之后无法判断测试点执行的正确与否。

e.可操作性

测试用例要对测试步骤有明确的规范,写明不同的测试操作对测试结果的影响[4]。

综上所述,测试用例的设计会对测试的效率及结果产生直接的影响,因此设计测试用例时有以下几点需要注意。

·根据软件测试的需求来设计测试用例的数目,因为大量的测试用例可能会导致测试用例出现冗余,使得测试的成本增加。

·尽量避免在测试的过程中,多个测试用例只对同一个测试点进行测试。

·由于软件更迭较快,因此复用性是在设计测试用例的过程中不能忽视的一点,良好的复用性能够明显地缩短测试周期,对提高测试的效率有着至关重要的作用。

·软件往往比较复杂,除了功能之外还要考虑边界等问题,因此在设计测试用例的时候,要进行全面而细致的考虑,内容一定要完整。

2.测试用例集约简相关技术

(1)测试用例集约简的定义

定义6-3(测试用例集约简) 测试用例集约简旨在最大限度地减少执行的测试用例的数量,为了有效约简测试用例集,约简后的测试用例集必须与原始测试用例集具有相同的覆盖率,例如,语句覆盖率,即测试执行过程中覆盖语句的比例,是现实世界中最常见的测试需求[5]。

(2)传统的约简方法

最初的测试用例约简方法是贪心算法(greedy algrithm),之后出现了GRE算法、H算法和整数规划法,下面对这些方法及特点进行逐一介绍。

①贪心算法

贪心算法是最早被提出的约简方法之一,该方法首先创建一个新的测试用例集,在旧的测试用例集中寻找当前能最大化满足尚未被覆盖的测试需求的测试用例,将其加入新的测试用例集中,并将其从旧的测试用例集中删除,同时将其所覆盖的所有的测试需求标记为已覆盖,然后重复此操作,当所有的测试需求都被满足后,停止该操作。这时新的测试用例集就是约简后的测试用例集。该算法的最坏时间复杂度为O(mn min(m,n))[6]。

②GRE算法

Chen和Lau在贪心算法的基础上进行了改进,提出了一种新的启发式算法——GRE算法。它的核心是3种策略:必不可少策略、冗余策略和贪心策略[7]。其中必不可少策略是最关键的一部分,它的意义是:在测试用例集中,有一些测试需求只能被某些特定的测试用例满足,因此这些测试用例经过约简后一定会被保存,因此要从测试用例集中选出这些必不可少的测试用例。冗余策略是指在测试用例集中删除冗余的测试用例。

GRE算法的基本思路是:首先,使用必不可少策略,从测试用例集中选出一个必不可少的测试用例;然后,根据选出的测试用例删除对应的测试需求,并采用冗余策略,去掉冗余的测试用例,这一步可能会导致测试需求发生变化;最后,循环使用这两种策略,直到没有必不可少的测试用例为止。这时可能会出现两种情况,第一种情况是此时已经满足了所有的测试需求,即得到了约简后的测试用例集,算法结束,这种情况是最优情况;另一种情况是剩余的测试用例集没有必不可少的测试用例,但目前选出的测试用例尚无法覆盖所有的测试需求,则对剩下的测试用例集利用贪心算法选出可以满足剩余的测试需求的测试用例。该算法最坏的时间复杂度为O(min(m,n)(m+n 2k)),其中k表示一个测试用例最多能覆盖的测试需求数量[8]。

③H算法

区别于前面两种算法,Harrold等人提出了一种根据测试用例的重要性来进行约简的启发式算法,其主要思想是通过重要性来对测试用例进行排序,从中选出重要程度高的测试用例,组成约简后的测试用例集,该算法被称作H算法[9]。

该算法的基本思路是根据可以覆盖需求的测试用例数目对测试用例的重要性进行设置,即如果可以覆盖该测试需求的测试用例数量越少,那么这些测试用例的重要性越高,反之则重要性越低。先选择重要性最高的测试用例,并对该测试用例覆盖的测试进行标记,再从剩下的测试需求中找到重要性次高的测试用例,并进行相同的操作,依此类推,当所有的测试需求都被覆盖时结束算法。该算法最坏的时间复杂度为O((n(m+n)d)。

④整数规划法

与传统方法不同,Lee等人将测试用例集约简问题转化为整数规划问题,因此可以使用求解整数规划问题的方法进行求解,找到最好的约简后的测试用例子集[6]。这种方法的优点是:在理论上可以获得覆盖所有测试需求的最小测试用例集子集,而且具有很好的适应性,一方面可以很好地应用于初始测试、回归测试等,另一方面对各种条件都有很好的适应性,如多种约束条件、适应度函数以及测试充分性准备等。但是却存在一个难以忽视的缺点,即该算法的时间复杂度过高,当测试用例集规模和测试需求集规模增大时,运算开销也会随之呈指数型增长。这样会导致难以在实际测试工作中进行应用,因为往往会得不偿失。

(3)经典群智能算法的约简方法

全军林提出的基于遗传算法的测试用例极小化研究[10]是一个比较早期的基于智能算法的测试用例约简方法,该算法以随机的方式产生一个初始种群,将种群中的个体通过遗传算法中的变异、融合、杂交等方法进行转化,得到可行个体,并根据个体的适应度选取最优的覆盖测试用例子集,得到约简后的测试用例子集。其整个算法的过程如下。

图示

图示

↑上一章 ↓下一章
关注公众号获取验证码
复制内容需要验证码(7.99元/天)