韩欣 张毅
(中国移动(深圳)有限公司,广东 深圳 518048)
一种基于用例依赖关系自动生成测试调度的方法
韩欣 张毅
(中国移动(深圳)有限公司,广东 深圳 518048)
本文首先针对自动化测试的现状,分析了自动化测试在深入开展后遇到的问题。通过对测试用例间依赖关系的系统分析,提出基于用例依赖关系的解决方案与应用实现。实验结果表明基于用例依赖关系的应用可以快速生成高可靠性的调度及有效消除缺陷误报。
用例依赖;自动生成调度;误报消除;前置条件
随着近几年互联网业务的发展,软件自动化测试技术越来越受到关注,在回归与迭代测试中广泛应用。特别是自动化测试框架的更完整应用使自动化测试平台可以应用更多其他的测试技术让自动化测试入门更简单,操作更方便,结果查看更清晰。
自动化测试平台的大力推广,大大提高了软件测试工作的效率,尤其在回归测试中,把一些重复的、机械的测试任务交给计算机去做,很大程度上减轻了测试人员的压力,并通过增加测试覆盖率等方式一定程度上提高了回归测试的准确性。
但随着自动化测试平台的深入使用,测试需求日趋复杂,自动化测试用例日趋增多,每日执行的调度与用例均越来越多,一些问题变得日趋严重,亟待解决。
(1)组建一个新的调度比较费时,自动化测试中测试执行人员很多时候不是之前的用例设计人员,所以其有可能不理解测试用例之间的关系,导致面对一个新的测试任务,需要花费时间先去梳理用例与需求及用例之间的关系,然后才能组建一个调度,而目前的用例仅能以目录或用例名去区分测试用例的测试目的,所以有的时候还可能有纰漏,导致某一个依赖用例未在调度中或顺序不对,导致调度执行出现大量用例失败。
(2)重新执行调度与问题定位困难,自动化测试用例虽然执行用例速度很快,但如执行完一个300个用例的调度还是需要耗费上数小时的时间,如何在一个调度执行后快速地执行调度中的失败用例以进行回归测试,以及如何在定位问题时,快速有效执行当前缺陷关联的相关用例,成为需要解决的问题。
(3)自动化测试的大量缺陷误报消除,自动化测试中每个用例失败都会报一个异常,但实际上这些用例失败可能只是部分测试用例执行失败导致的连环失败,大量的缺陷误报必将引起对自动化测试的正确性及有效性怀疑,阻碍自动化测试的继续推广与应用。
这些问题让测试人员感觉本来应该简单快捷的自动化测试,变得日趋繁琐复杂,耗费着他们更多的时间,每日沉溺于调度执行,调度分析让他们没有更多的时间去关注业务本身、用例设计,很大程度阻碍着自动化测试的深入拓展与应用。这就是现在多数企业深入开展自动化测试的现状,也是现阶段自动化测试大规模使用所面临的难题。
针对自动化测试持续深入开展面临的难题,笔者认为应该从用例层出发,最大程度地加强用例与业务、测试数据的关系。具体可以从三个方面来考虑:
(1)在平台上建立用例间的关系,能够让后来的测试人员很快熟悉测试用例设计的思路与测试用例的结构,同时用例间的关系在平台上应提供清晰直观的查看方式及动态调
整方式。
(2)利用用例间的关系,根据关键用例查找出与其有依赖关系的用例,自动生成调度。
(3)基于用例的依赖关系消除缺陷误报,如当前用例所依赖的最弱前置用例执行失败时,则当前用例失败,不生成错误缺陷,以达到消除缺陷误报。
从用例执行顺序上考虑,测试用例间的关系包括前置、后置、可并行,前置与后置是形成测试执行时的串行执行顺序,可并行对执行顺序无特殊影响与要求,对于两个相邻的用例来说,第一条用例的后置条件就是第二用例的前置条件。所以如能解决测试用例的前置关系即可解决自动生成调度及消除缺陷误报的问题。
3.1 前置条件与最弱前置条件
前置条件(Precondition)描述这样一些状态,由这些状态可以成功地执行一个操作。前置条件还是测试用例的一个组成部分,它和由某种测试方法所标志的实际输入一起构成了测试用例的完整输入。在测试过程中,测试人员或自动化工具根据前置条件决定是否执行测试用例,因此对前置条件的分类和参数化有助于提高软件测试的自动化过程[6-8]。
测试用例的前置条件分析需要从需求中去分析,软件功能和使用方式的复杂性决定了前置条件的多样性。软件的某项操作可能要求必须在其他某项或某几项的操作执行完成之后才能进行。这几项操作之前有可能存在前置关系或不存在前置关系即并行关系。这里主要介绍如何分析测试用例的前置用例。
以系统用户管理功能为例,只有登录系统才能进行账号增删改查等操作,如存在以下用例:登录、退出、用户添加、用户修改、新增用户查询,修改后用户查询、用户删除。各功能编写一个用例,预期结果为受理成功。新增用户查询为查询新增后的账号是否存在。修改后用户查询为查询修改用户是否成功。
定义如果操作O在执行之前必须依次执行操作PO1,PO2,…,POi(i≥1),那么就称操作序列PO1,PO2,…,POi (i≥1)是操作O的前置约束,逻辑表达式为
如果在操作O执行前依次执行操作PO1,PO2,…,POi (i≥1),则约束满足,表达式的值为真;反之则约束不满足,表达式的值为假。
以网厅功能为例,可进行以下表示:
表1 用例前置条件表达式
说明:实际需求中用户添加肯定不允许添加两个相同的用户,所以在用户添加之前必须保证没有相同用户名的用例,但在这里我们不会把用户删除或用户修改作为前置用例,因为如作为前置条件,将导致依赖关系存在闭环操作。即前置条件不能形成闭环的操作。
根据最弱前置条件即保证相关后置条件有效的限制最小的前置条件考虑,即如用户添加用例能够执行成功,则当前一定为登录状态,所以基于最弱前置条件考虑优化后的前置条件表达式如下:
表2 用例前置条件表达式
3.2 有向无环图
根据以上的分析研究,用例间的依赖关系有以下特点:(1)存在依赖关系;(2)有至少一个不依赖其他测试用例;(3)不存在闭环的依赖关系。与有向无环图的特点类似。有向无环图(directed acycline graph):无环的有向图,简称DAG图。DAG图是一类较有向树更一般的特殊有向图,基于向无环图的经典算法有拓扑排序。
以上用例关系形成有向无环图如图1:
图1 有向无环图
3.3 拓扑排序
拓扑排序是对有向无环图的顶点的一种排序,它使得如果存在一条从顶点A到顶点B的路径,那么在排序中B出现在A的后面。
具体的算法思想如下:
(1)在有向图中选一个没有前驱的顶点且输出之。
(2)从图中删除该顶点和所有以它为尾的弧。
(3)重复上述两步,直至全部顶点均已输出,或者当前图中不存在无前驱的顶点为止。
图1所示的有向无环图经拓扑排序后可形成以下的几个执行顺序:
以上的执行顺序中,依据实际需求仅第一个顺序所有的用例才能执行成功,原因是,用例2(退出)的执行会导致其他节点依赖的用户1(登录)的状态无效,而5、7用例的执行也会导致4用例依赖的数据变更或消失。故必须对算法与结构图做如下优化:
(1)对节点同顶级节点设置优先级,即在对阶段1排序后,会存在2、3的两个无顶点节点,必须将2的优先级降为最低,最后执行才行。同样对节点4、5、7也设置优先级。
(2)必须遍历一个子节点下的所有无顶级节点后,再返回查找无顶级节点。如必须将3节点下的所有无顶级节点排序后再查找无顶级节点。
由以上得知用例间不止有执行顺序上的依赖关系,还包括用例执行后对记录或数据的影响,所以详细分析后置用例对前置用例执行结果的影响,又可分为以下三种:
(1)无影响,后置用例的执行不影响前置用例的执行结果,如查询、记录查看、修改取消、删除取消等。
(2)数据变更,后置用例的执行会导致前置用例的执行结果数值或记录状态的变更,如:修改、记录锁定等。
(3)结果互斥,后置用例的执行会导致前置用例的执行结果数值或记录的消失或状态结束,如:删除、注销等。
基于以上分析测试用例间关系可归纳为以下四种:1、前置2、前置变更3、前置互斥4、无关。是否存在前置影响用例间执行依赖,当多个用例依赖同一个用例时,前置依赖类型影响用例的执行优先级。其执行优先级为前置>前置变更>前置互斥>无关。即在有向无环图中增加对同顶级节点的优先级定义,假定:前置p=1,前置变更p=2,前置互斥p=3。更新后的有向无环图如图2:
图2 有向无环图
4.1 基于用例依赖关系的自动生成调度
在前部分提到的自动化测试平台上组建调度困难问题,期望能达到的场景为:
测试人员组建调度时,只需根据测试需求,挑选出需求对应的关键用例,平台根据这些用例,自动把这些用例存在前置条件的用例一并加到调度中,并去掉重复的用例,然后根据依赖关系的优先顺序对用例进行排序,即A是B的前置,B是C的前置,B也是D的前置,CD之间没关系,那么如果用户要执行用例C、D,平台需要把A、B都加到调度,并最终形成ABCD或ABDC的执行顺序。目标是保证所有的用例都能够有效地执行。
重新执行调度与问题定位方法类似,平台根据所有失败的用例或缺陷关联的用例找出所有存在依赖关系的测试用例。这里主要涉及到两个问题需要解决:
(1)根据一组用例查找出与这组用例所依赖的前置用例,以及这组用例的存在前置互斥关系的后置用例。保证调度执行后数据或记录状态的恢复。
(2)对第一条中找到的用例按依赖关系进行排序。
4.1.1 查找用例算法
算法思路:根据选择的一个或多个用例节点,依据用例依赖关系图,使用递归算法查找用例的所有的依赖节点并去重。
4.1.2 用例排序算法
算法思路:
(1)查找依赖度为0的节点,如果存在为0的节点,加入栈q,否则该图是有向有图;
(2)取队列栈的最后一个节点V,加入list;
(3)查找对V是互斥依赖且入度为1的节点,加入栈q中;
(4)查找对V是更新依赖且入度为1的节点,加入栈q中;
(5)查找对V是约束依赖且入度为1的节点,加入栈q中;
(6)将V节点从其它节点的依赖表中移除;
(7)如果栈q不为空,转到(2),否则,转到(1)。
4.2 基于用例依赖关系的误报消除
在已有平台执行结果的基础上,根据用例的依赖关系去消除缺陷误报,具体思路为当前用例执行失败时,检测当前用例的前置依赖用例是否执行成功,如成功则生成缺陷,如执行依赖用例中存在用例执行失败,则不生成缺陷。以此达到消除缺陷误报的目的。说明:此处查找当前用例的依赖用例仅需查找一级即可,不需递归循环查询所有前置依赖用例。
本文通过当前测试现状的分析,对自动化测试存在的问题进行了分析,并提出了基于用例依赖关系的解决方案。基于上文的分析可以看出,本文的设计思路是基于笔者当前的自动化测试平台,但存在的问题及解决方案的思路是有共性存在的,希望能对存在类似问题的提供一种解决问题的思路。
[1]Hovemeyer D,Pugh W.Finding more null pointer bugs,but not too many[A].[S.l.]:ACM,2007.9-14.
[2]陈技能.自动化测试实践[M].北京:电子工业出版社.2008.
[3]叶伟.互联网实弹的软件革命:SaaS架构设计[M].北京:电子工业出版社.2009
[4]王奇,曹良帅,赵贤敬,等.基于SaaS的自动化测试云平台研究[J].电信工程技术与标准化,2012,25(10):67-72.
[5]朱菊,王志坚,杨雪.基于数据驱动的软件自动化测试框架[J].计算机技术与发展,2006,16(5):68-70.
[6]严少清,陈革,万年红.软件测试自动化管理系统的设计与实现[J].计算机工程,2002,28(9):152-153.
[7]黄若艺,毛澄映.基于依赖性分析的回归测试用例选择[J].微计算机信息,2005,(23):184-185.
AMethod forAutomatic Generation of Test Scheduling Based on the Dependency Relationships among Use Cases
Han Xin Zhang Yi
(China Mobile Shenzhen Co.,Ltd.,Shenzhen 518048,Guangdong)
tract】 Based on the status of the automatic test,this paper analyzes the problems in it.With the analysis of the dependency relationships among test cases,this paper proposes the solution and implementation based on the dependency relationships of the use cases.Results show that the application of dependency relationships among use cases can generate highly reliable scheduling fast and effectively eliminate defects.
words】 use case dependency;automatic generation of scheduling;defect elimination;precondition
TP311.52
A
1008-6609(2016)09-0043-04
韩欣,女,河南周口人,本科,高级工程师,研究方向:自动化测试、系统分析、测试理论等。