基于代码变更分析的测试方法及装置与流程

文档序号:11620489阅读:289来源:国知局
基于代码变更分析的测试方法及装置与流程

本发明涉及计算机领域,尤其涉及一种基于代码变更分析的测试方法及装置。



背景技术:

随着市场竞争的日趋激烈,对产品开发的速度要求越来越高。产品在开发过程中,往往需要经过各种各样的测试。针对产品的测试,开发人员一般会开发很多的测试用例,以覆盖尽可能多的场景。产品在开发过程中,可能会涉及到源代码文件的变更,此时需要对该变更进行分析,然后基于分析结果选择测试用例进行针对性的测试。

目前,测试方法可以包括:自动监控源代码文件,如果源代码文件发生变更,如源代码文件的时间戳发生了变更,则认为该源代码文件对应的类发生变化,然后针对该类进行测试,即从测试用例库中筛选出该类对应的所有测试用例,并执行这些测试用例以完成测试。其中,类是指由该源代码文件编译生成的文件。

在实现本发明的过程中,发明人发现现有技术至少存在以下问题:

上述技术通过监控源代码文件的方式来进行代码变更分析,可以监控的粒度局限在类的级别上,只能分析出类发生了变更,不能精确地反映出该类中的哪些代码发生了变更,基于类选取的测试用例针对性差,导致测试效率低。



技术实现要素:

为了解决现有技术的问题,本发明实施例提供了一种基于代码变更分析的测试方法及装置。所述技术方案如下:

第一方面,提供了一种基于代码变更分析的测试方法,所述方法包括:

根据当前编译生成的多个类class文件和当前编译之前任一次编译生成的多个class文件,分部生成树状结构的第一元数据集和第二元数据集,该两个元数据集均包括多个class节点,及所述多个class节点下的多个method节点,每个class节点对应一个class文件,每个method节点对应一个成员函数;

以所述第一元数据集和所述第二元数据集的差异分析,获取代码发生变更的多个成员函数;

基于与所述多个成员函数一一对应的测试用例生成的测试用例集进行测试。

在第一方面的第一种实现方式中,对于所述第一元数据集和所述第二元数据集中,任一元数据集的生成过程包括:

解析编译生成的多个class文件,得到所述多个class文件的名称和摘要信息、以及每个class文件包含的多个成员函数的名称和字节码序列;

基于所述多个class文件的名称和摘要信息,构成多个class节点,对于每个class文件,基于所述class文件包含的多个成员函数的名称和字节码序列,构成多个method节点,并将所述多个method节点作为所述class文件对应的class节点的子节点。

在第一方面的第二种实现方式中,所述以所述第一元数据集和所述第二元数据集的差异分析,具体包括:

对于所述第一元数据集中的任一class节点,读取所述class节点的名称,在所述第二元数据集中查找目标class节点,所述目标class节点与所述class节点的名称相同;

如果查找不到所述目标class节点,则将所述class节点下所有成员函数的变更属性标记为第一属性,所述第一属性用于指示发生代码变更。

在第一方面的第三种实现方式中,所述在所述第二元数据集中查找目标class节点之后,所述方法还包括:

如果查找到所述目标class节点,则比较所述class节点的摘要信息和所述目标class节点的摘要信息是否相同;

如果相同,将所述class节点下所有成员函数的变更属性标记为第二属性,所述第二属性用于指示未发生代码变更;

如果不同,则对所述class节点下的method节点和所述目标class节点下的method节点进行差异分析。

在第一方面的第四种实现方式中,所述对所述class节点下的method节点和所述目标class节点下的method节点进行差异分析包括:

对于所述class节点下的每个method节点,读取所述method节点的名称,在所述第二元数据集中查找目标method节点,所述目标method节点与所述method节点的名称相同;

如果查找不到所述目标method节点,则将所述method节点对应的成员函数的变更属性标记为所述第一属性。

在第一方面的第五种实现方式中,所述在所述第二元数据集中查找目标method节点之后,所述方法还包括:

如果查找到所述目标method节点,则根据所述method节点的字节码序列和所述目标method节点的字节码序列,计算莱文斯坦距离;

如果所述莱文斯坦距离大于或者等于预设门限值,则将所述method节点对应的成员函数的变更属性标记为所述第一属性;

如果所述莱文斯坦距离小于预设门限值,则将所述method节点对应的成员函数的变更属性标记为所述第二属性。

第二方面,提供了一种基于代码变更分析的测试装置,所述装置包括:

生成模块,用于根据当前编译生成的多个类class文件和当前编译之前任一次编译生成的多个class文件,分别生成树状结构的第一元数据集和第二元数据集,该两个元数据集均包括多个class节点,及所述多个class节点下的多个method节点,每个method节点对应一个成员函数;

分析模块,用于以所述第一元数据集和所述第二元数据集的差异分析,获取代码发生变更的多个成员函数;

测试模块,用于基于与所述多个成员函数一一对应的测试用例生成的测试用例集进行测试。

在第二方面的第一种实现方式中,所述分析模块包括:

查找子模块,用于对于所述第一元数据集中的任一class节点,读取所述class节点的名称,在所述第二元数据集中查找目标class节点,所述目标class节点与所述class节点的名称相同;

标记子模块,用于如果查找不到所述目标class节点,则将所述class节点下所有成员函数的变更属性标记为第一属性,所述第一属性用于指示发生代码变更。

在第二方面的第二种实现方式中,所述查找子模块,还用于如果查找到所述目标class节点,且所述class节点的摘要信息和所述目标class节点的摘要信息相同,则对于所述class节点下的每个method节点,读取所述method节点的名称,在所述第二元数据集中查找目标method节点,所述目标method节点与所述method节点的名称相同;

标记子模块,还用于如果查找不到所述目标method节点,则将所述method节点对应的成员函数的变更属性标记为所述第一属性。

在第二方面的第三种实现方式中,所述分析模块还包括计算子模块:

所述计算子模块,用于如果查找到所述目标method节点,则根据所述method节点的字节码序列和所述目标method节点的字节码序列,计算莱文斯坦距离;

所述标记子模块,还用于如果所述莱文斯坦距离大于或者等于预设门限值,则将所述method节点对应的成员函数的变更属性标记为所述第一属性;

所述标记子模块,还用于如果所述莱文斯坦距离小于预设门限值,则将所述method节点对应的成员函数的变更属性标记为所述第二属性。

本发明实施例提供的技术方案带来的有益效果是:

通过对第一元数据集中的class节点和第二元数据集中的class节点进行差异分析,来获取代码发生变更的多个成员函数,进而针对该多个成员函数,获取与该多个成员函数一一对应的测试用例,并根据这些测试用例生成测试用例集进行测试。上述技术方案可以精确地反映出哪些成员函数发生了代码变更,根据这些成员函数选取的测试用例针对性强,可以实现成员函数级别的针对性测试,提高了测试效率。

附图说明

为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1是本发明实施例提供的一种测试系统的结构示意图;

图2是本发明实施例提供的一种基于代码变更分析的测试方法的流程图;

图3是本发明实施例提供的一种基于代码变更分析的测试方法的流程图;

图4是本发明实施例提供的一种树状结构的元数据集的示意图;

图5是本发明实施例提供的一种基于代码变更分析的测试方法的流程图;

图6是本发明实施例提供的一种基于代码变更分析的测试装置的结构示意图;

图7是本发明实施例提供的一种分析模块602的结构示意图;

图8是本发明实施例提供的又一种分析模块602的结构示意图;

图9是本发明实施例提供的一种基于代码变更分析的测试置的框图。

具体实施方式

为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。

图1是本发明实施例提供的一种测试系统的结构示意图。该测试系统包括代码编译单元101、class文件存储单元102、class文件库103、class文件读取单元104、class文件解析单元105、测试用例筛选单元106和测试用例库107。

其中,该代码编译单元101负责每次编译工作,包括将java文件编译生成对应的class文件;class文件存储单元102负责将代码编译单元101生成的class文件存储至class文件库103的指定目录;class文件读取单元104负责从指定目录读取编译生成的class文件,供class文件解析单元104进行处理;class文件解析单元105负责按照java虚拟机的规范,解析class文件,得到该class文件的相关信息,并基于该相关信息,生成树状结构的元数据集;测试用例筛选单元106负责对树状结构元数据集进行差异分析,获取代码发生变更的成员函数,然后根据这些成员函数,从测试用例库中筛选出这些成员函数对应的测试用例;测试用例库107用于提供多个测试用例。

在下述的本发明实施例中,各个步骤实际上可能是由该测试系统的某个或多个单元协作完成,具体情况将在后续实施例的步骤中进行说明。

图2是本发明实施例提供的一种基于代码变更分析的测试方法的流程图。参见图2,该方法包括:

201、根据当前编译生成的多个类class文件和当前编译之前任一次编译生成的多个class文件,分别生成树状结构的第一元数据集和第二元数据集,该两个元数据集均包括多个class节点,及所述多个class节点下的多个method节点,每个class节点对应一个class文件,每个method节点对应一个成员函数。

202、以该第一元数据集和该第二元数据集的差异分析,获取代码发生变更的多个成员函数。

203、基于与该多个成员函数一一对应的测试用例生成的测试用例集进行测试。

本发明实施例提供的方法,通过对第一元数据集中的class节点和第二元数据集中的class节点进行差异分析,来获取代码发生变更的多个成员函数,进而针对该多个成员函数,获取与该多个成员函数一一对应的测试用例,并根据这些测试用例生成测试用例集进行测试。上述技术方案可以精确地反映出哪些成员函数发生了代码变更,根据这些成员函数选取的测试用例针对性强,可以实现成员函数级别的针对性测试,提高了测试效率。

可选地,对于该第一元数据集和该第二元数据集中,任一元数据集的生成过程集包括:

解析编译生成的多个class文件,得到该多个class文件的名称和摘要信息、以及每个class文件包含的多个成员函数的名称和字节码序列;

基于该多个class文件的名称和摘要信息,构成多个class节点,对于每个class文件,基于该class文件包含的多个成员函数的名称和字节码序列,构成当前编译生成的多个method节点,并将该多个method节点作为该class文件对应的class节点的子节点;

可选地,该以该第一元数据集和该第二元数据集的差异分析,具体包括:

对于该第一元数据集中的任一class节点,读取该class节点的名称,在该第二元数据集中查找目标class节点,该目标class节点与该class节点的名称相同;

如果查找不到该目标class节点,则将该class节点下所有成员函数的变更属性标记为第一属性,该第一属性用于指示发生代码变更。

可选地,该在该第二元数据集中查找目标class节点之后,该方法还包括:

如果查找到该目标class节点,则比较该class节点的摘要信息和该目标class节点的摘要信息是否相同;

如果相同,将该class节点下所有方法的变更属性标记为第二属性,该第二属性用于指示未发生代码变更;

如果不同,则对该class节点下的method节点和该目标class节点下的method节点进行差异分析。

可选地,对该class节点下的method节点和该目标class节点下的method节点进行差异分析包括:

对于该class节点下的每个method节点,读取该method节点的名称,在该第二元数据集中查找目标method节点,该目标method节点与该method节点的名称相同;

如果查找不到该目标method节点,则将该method节点对应的成员函数的变更属性标记为该第一属性。

可选地,该在该第二元数据集中查找目标method节点之后,该方法还包括:

如果查找到该目标method节点,则根据该method节点的字节码序列和该目标method节点的字节码序列,计算莱文斯坦距离;

如果该莱文斯坦距离大于或者等于预设门限值,则将该method节点对应的成员函数的变更属性标记为该第一属性;

如果该莱文斯坦距离小于预设门限值,则将该method节点对应的成员函数的变更属性标记为该第二属性。

上述所有可选技术方案,可以采用任意结合形成本发明的可选实施例,在此不再一一赘述。

图3是本发明实施例提供的一种基于代码变更分析的测试方法的流程图。本发明实施例可以应用于图1所示的测试系统中,本发明实施例中的各个步骤可以由图1所示的测试系统中的某个或多个单元协作完成。参见图3,该方法包括:

301、对java文件进行编译,生成多个class(类)文件,并将当前编译生成的多个class文件存储至指定目录。

本发明实施例中,java文件为源代码文件,class文件为可执行文件。代码编译单元可以通过执行预先配置的编译脚本,将java文件编译生成多个class文件。每次编译完成后,class文件存储单元可以将当前编译生成的该多个class文件存储至class文件库的指定目录,并将该指定目录作为当前编译生成的指定目录,该指定目录的名称可以按照当前编译时间来进行标记。通过编译时间对每次编译生成的指定目录进行标记,可以便于确认每个指定目录中存储的是哪一次编译生成的class文件,从而方便对这些class文件进行相应操作,包括查询或处理class文件。

302、根据当前编译生成的多个class文件和当前编译之前任一次编译生成的多个class文件,分别生成树状结构的第一元数据集和第二元数据集,该两个元数据集均包括多个class节点,及所述多个class节点下的多个method节点,每个class节点对应一个class文件,每个method节点对应一个成员函数。

本发明实施例中,由于每次编译生成的class文件所存储的指定目录的名称均按照编译时间进行了标记,因此,class文件读取单元可以通过比较每个指定目录所指示的编译时间,将编译时间最晚的指定目录确定为当前编译生成的指定目录。进而class文件读取单元可以根据当前编译生成的指定目录所指示的编译时间,查找目标指定目录,并读取得到该目标指定目录中存储的多个class文件,该多个class文件即为当前编译之前任一次编译生成的多个class文件,该目标指定目录的名称所指示的编译时间在当前编译时间之前。

本发明实施例中,为了确定当前编译生成的多个class文件中哪些成员函数发生了代码变更,可以对当前编译生成的多个class文件和当前编译之前任一次编译生成的多个class文件进行差异分析。而为了便于该差异分析,可以分别根据当前编译生成的多个class文件和当前编译之前任一次编译生成的多个class文件,生成树状结构的第一元数据集和第二元数据集。参见图4,图4是本发明实施例提供的一种树状结构的元数据集的示意图,该元数据集的最上一层是目录节点,下一层是多个class节点,再下一层是每个class节点包括的多个method节点。

其中,第一元数据集中的每个class节点对应当前编译生成的一个class文件,第二元数据集中的每个class节点对应当前编译之前任一次编译生成的一个class文件。由于元数据集为树状结构的组织形式,可以清楚地区分每个class节点以及每个class节点下的method节点,因而通过该第一元数据集和第二元数据集,可以方便测试用例筛选单元对当前编译生成的多个class节点和当前编译之前任一次编译生成的多个class节点进行差异分析,也即对当前编译生成的多个class文件和当前编译之前任一次编译生成的多个class文件进行差异分析。

本发明实施例中,该第一元数据集和第二元数据集的生成过程可以包括以下步骤a至d:

a、解析当前编译生成的多个class文件,得到当前编译生成的多个class文件的名称和摘要信息、以及每个class文件包含的多个成员函数的名称和字节码序列。

本发明实施例中,由于每次编译生成的class文件分别存储在各个指定目录中,因此,class文件读取单元可以读取当前编译生成的指定目录,得到当前编译生成的多个class文件,再由class文件解析单元按照java虚拟机的规范,解析该多个class文件,得到该多个class文件的相关信息,包括该多个class文件的名称和摘要信息、以及每个class文件包含的多个成员函数的名称和字节码序列。

需要说明的是,class文件读取单元读取当前编译生成的指定目录,还可以得到当前编译生成的指定目录的名称。

b、基于当前编译生成的多个class文件的名称和摘要信息,构成当前编译生成的多个class节点,对于当前编译生成的每个class文件,基于该class文件包含的多个成员函数的名称和字节码序列,构成当前编译生成的多个method节点,并将该多个method节点作为该class文件对应的class节点的子节点,每个class节点对应一个class文件,每个method节点对应一个成员函数。

本发明实施例中,class文件解析单元通过上述步骤a解析得到当前编译生成的多个class文件的名称和摘要信息等文件信息后,可以基于该文件信息,构成第一元数据集中的多个class节点。当然,class文件解析单元通过上述步骤a解析得到每个class文件包含的多个成员函数的名称和字节码序列等成员函数信息后,可以基于该成员函数信息,构成每个class节点下的多个method节点。

其中,每个class节点包含该class节点的名称(即该class节点对应的class文件的名称)、摘要信息(如md5信息)以及该class节点下的多个成员函数(即该class节点下的多个method节点对应的成员函数)。每个method节点包含该method节点的名称(即该method节点对应的成员函数的名称)和字节码序列(如code属性的字节码序列code[code_length])。

需要说明的是,class文件解析单元还可以基于步骤a得到的当前编译生成的指定目录的名称,构成第一元数据集中的目录节点,该目录节点包括目录节点的名称(即当前编译生成的指定目录的名称)。

为了提高查询效率,上述图4中树状结构的元数据集可以采用hashmap进行存储,格式如下:

通过步骤a至步骤b可以得到当前编译生成的多个class节点以及每个class节点下的多个method节点,即生成第一元数据集。

c、解析当前编译之前任一次编译生成的多个class文件,得到当前编译之前任一次编译生成的多个class文件的名称和摘要信息、以及每个class文件包含的多个成员函数的名称和字节码序列。

d、基于当前编译之前任一次编译生成的多个class文件的名称和摘要信息,构成当前编译之前任一次编译生成的多个class节点,对于当前编译之前任一次编译生成的每个class文件,基于该class文件包含的多个成员函数的名称和字节码序列,构成当前编译之前任一次编译生成的多个method节点,并将当前编译之前任一次编译生成的多个method节点作为该class文件对应的class节点的子节点。

与步骤a至步骤b同理,通过步骤c至步骤d可以得到当前编译之前任一次编译生成的多个class节点以及每个class节点下的多个method节点,即生成第二元数据集。

需要说明的是,本发明实施例是以先生成第一元数据集(即执行步骤a至步骤b),再生成第二元数据集(即执行步骤c至步骤d)为例进行说明,实际上,也可以先生成第二元数据集,再生成第一元数据集,本发明实施例对此不做限定。

通过步骤301至步骤302生成第一元数据集和第二元数据集后,测试用例筛选单元可以对树状结构的第一元数据集和第二元数据集进行差异分析,即对第一元数据集中的多个class节点和第二元数据集中的多个class节点进行差异分析,以获取代码发生变更的成员函数。该差异分析的过程将在后续步骤303至步骤304中进行说明。

303、对于第一元数据集中的每个class节点,读取该class节点的名称,在第二元数据集中查找目标class节点,目标class节点与该class节点的名称相同,如果查找不到目标class节点,则将该class节点下所有成员函数的变更属性标记为第一属性,该第一属性用于指示发生代码变更,如果查找到目标class节点,则执行步骤304。

本发明实施例中,由于第一元数据集中包括多个class节点,每个class节点下有多个method节点,而每个method节点对应一个成员函数,为了确定当前编译生成的多个class文件中哪些成员函数发生了代码变更,可以对该多个class节点依次进行分析。

对于第一元数据集中的每个class节点,以class节点1为例,测试用例筛选单元可以在第二元数据集中查找与该class节点1同名的目标class节点,如果在第二元数据集中查找不到该目标class节点,则说明该class节点1是当前编译生成的全新class节点,即该class节点1下的所有成员函数均发生了代码变更。此时,测试用例筛选单元可以将该class节点下所有成员函数的变更属性标记为第一属性(如true)。以class节点1包括成员函数a和成员函数b为例,可以标记成员函数a和成员函数b的变更属性为true。通过第一属性对代码发生变更的成员函数进行标记,可以便于后续获取对这些成员函数的确认和获取。

而如果在第二元数据集中查找到目标class节点,则说明该class节点1下至少有一个成员函数未发生代码变更。此时,测试用例筛选单元可以通过执行步骤304,进一步对该class节点1进行分析,以确定代码变更的情况。

304、如果查找到目标class节点,则比较该class节点的摘要信息和目标class节点的摘要信息是否相同,如果相同,将该class节点下所有成员函数的变更属性标记为第二属性,该第二属性用于指示未发生代码变更,如果不同,则对该class节点下的method节点和目标class节点下的method节点进行差异分析。

本发明实施例中,测试用例筛选单元在确定第二元数据集中存在与class节点1同名的目标class节点后,可以比较该class节点1包含的摘要信息和目标class节点包含的摘要信息是否相同,如果相同,说明该class节点1与该目标class节点完全相同,也即说明该class节点1下的所有成员函数均未发生代码变更。此时,测试用例筛选单元可以将该class节点下所有成员函数的变更属性标记为第二属性(如false)。以class节点1包括成员函数a和成员函数b为例,可以标记成员函数a和成员函数b的变更属性为false。

而如果该class节点1包含的摘要信息和目标class节点包含的摘要信息不同,则说明该class节点1下至少有一个成员函数发生了代码变更。此时,测试用例筛选单元可以进一步对该class节点1下的所有method节点进行分析,以确定是哪些成员函数发生了代码变更。

本发明实施例中,对该class节点1下的method节点和该目标class节点下的method节点进行差异分析的过程可以包括以下步骤a至b:

a、对于该class节点1下的每个method节点,读取该method节点的名称,在该第二元数据集中查找目标method节点,该目标method节点与该method节点的名称相同;如果查找不到该目标method节点,则将该method节点对应的成员函数的变更属性标记为该第一属性;

本发明实施例中,由于每个class节点下有多个method节点,而每个method节点对应一个成员函数,为了确定该class节点1下哪些成员函数发生了代码变更,可以对该class节点1下的多个method节点依次进行分析。

对于该class节点1下的每个method节点,以method节点1为例,测试用例筛选单元可以在第二元数据集中查找与该method节点1同名的目标method节点,如果在第二元数据集中查找不到该目标method节点,则说明该method节点1对应的成员函数发生了代码变更。此时,测试用例筛选单元可以将该method节点1对应的成员函数的变更属性标记为第一属性(如true)。以该method节点1对应成员函数a为例,可以标记成员函数a的变更属性为true。

而如果在第二元数据集中查找到目标method节点,则说明该method节点1对应的成员函数有可能发生了代码变更。此时,测试用例筛选单元可以通过执行步骤b,进一步确定该method节点1对应的成员函数是否发生了代码变更。

b、如果查找到该目标method节点,则根据该method节点的字节码序列和该目标method节点的字节码序列,计算莱文斯坦距离,如果该莱文斯坦距离大于或者等于预设门限值,则将该method节点对应的成员函数的变更属性标记为该第一属性,如果该莱文斯坦距离小于预设门限值,则将该method节点对应的成员函数的变更属性标记为该第二属性。

本发明实施例中,莱文斯坦距离可以用于衡量两个字节码序列之间的相似度。测试用例筛选单元在确定第二元数据集中存在与method节点1同名的目标method节点后,可以按照指定算法,计算method节点1的字节码序列和目标method节点的字节码序列之间的莱文斯坦距离d。

如果d大于或者等于预设门限值,则说明method节点1的字节码序列和目标method节点的字节码序列之间相似度较低,可以认为该method节点1对应的成员函数发生了代码变更。此情况下,测试用例筛选单元可以将该method节点1对应的成员函数的变更属性标记为第一属性(如true)。

而如果d小于预设门限值,则说明method节点1的字节码序列和目标method节点的字节码序列之间相似度较高,可以认为该method节点1对应的成员函数未发生代码变更,此情况下,测试用例筛选单元可以将该method节点1对应的成员函数的变更属性标记为第二属性(如false)。

需要说明的是,步骤a至步骤b是以class节点1下的method节点1为例,对该method节点1进行代码变更分析的过程。本发明实施例中,测试用例筛选单元需要对class节点1下的每个method节点均进行代码变更分析,即执行步骤a至步骤b,直至该class节点1下的多个method节点全部遍历,才完成对该class节点1进行代码变更分析的过程。

步骤303至步骤304是对第一元数据集和第二元数据集进行差异分析的过程。为了体现每个class节点的具体分析过程,在上述步骤中,以第一元数据集中的class节点1为例,对该class节点1的分析过程进行了说明,该第一元数据集中其他节点的分析过程与该class节点1的分析过程同理。测试用例筛选单元需要对第一元数据集中的每个class节点均进行分析,即执行步骤303至步骤304,直至第一元数据集中的多个class节点全部遍历后,再执行后续步骤305。由于每个class节点下包括多个成员函数,通过遍历第一元数据集中的所有class节点,可以获取当前编译生成的多个class节点中代码发生变更的所有成员函数。

需要说明的是,步骤303至步骤304的差异分析过程只是本发明实施例的一个示例,当然,还可以通过其他方式实现对第一元数据集中的class节点和第二元数据集中的class节点进行差异分析的过程,本发明实施例对此不做限定。

305、将当前编译生成的多个class节点中变更属性标记为第一属性的所有成员函数,获取为代码发生变更的多个成员函数,并基于与该多个成员函数一一对应的测试用例生成的测试用例集进行测试。

本发明实施例中,测试用例筛选单元通过上述步骤303至步骤304,对该第一元数据集中的class节点和该第二元数据集中的class节点进行了差异分析,并用第一属性对代码发生变更的成员函数进行了标记。因此,测试用例筛选单元可以将用第一属性标记的所有成员函数,获取为代码发生变更的多个成员函数。

在一种可能实现方式中,该测试用例集的生成过程可以包括:对于该代码发生变更的多个成员函数中的每个成员函数,根据该成员函数和指定调用关系,从测试用例库中筛选出目标测试用例,该目标测试用例为调用该成员函数进行测试的测试用例;将该多个成员函数的目标测试用例获取为该测试用例集。

例如,测试用例筛选单元可以存储有该指定调用关系,用于指示成员函数与调用该成员函数进行测试的测试用例之间的对应关系。测试用例筛选单元可以根据该指定调用关系和该代码发生变更的多个成员函数,确定多个目标测试用例,然后从测试用例库中获取这些目标测试用例,并将这些目标测试用例作为该测试用例集,然后执行这些测试用例以完成测试。

需要说明的是,上述实现方式是以指定调用关系和测试用例分开存储为例进行说明,实际上,该指定调用关系和测试用例也可以对应存储在测试用例库中。相应地,对于代码发生变更的每个成员函数,测试用例筛选单元可以直接从测试用例库中获取到与该成员函数对应的测试用例。

参见图5,为了更清楚地体现本发明实施例提供的测试方法,采用图5所示的流程图,体现上述步骤301至步骤305的全部过程,图5中的内容均在上述步骤301至步骤305中进行了说明,在此不做赘述。

本发明实施例提供的方法,通过对第一元数据集中的class节点和第二元数据集中的class节点进行差异分析,来获取代码发生变更的多个成员函数,进而针对该多个成员函数,获取与该多个成员函数一一对应的测试用例,并根据这些测试用例生成测试用例集进行测试。上述技术方案可以精确地反映出哪些成员函数发生了代码变更,根据这些成员函数选取的测试用例针对性强,可以实现成员函数级别的针对性测试,提高了测试效率。

图6是本发明实施例提供的一种基于代码变更分析的测试装置的结构示意图。参照图6,该装置包括生成模块601、分析模块602和测试模块603:

生成模块601,用于根据当前编译生成的多个类class文件和当前编译之前任一次编译生成的多个class文件,分别生成树状结构的第一元数据集和第二元数据集,该两个元数据集均包括多个class节点,及所述多个class节点下的多个method节点,每个class节点对应一个class文件,每个method节点对应一个成员函数;

分析模块602,用于以该第一元数据集和该第二元数据集的差异分析,获取代码发生变更的多个成员函数;

测试模块603,用于基于与该多个成员函数一一对应的测试用例生成的测试用例集进行测试。

可选地,参见图7,该分析模块602包括:

查找子模块,用于对于该第一元数据集中的任一class节点,读取该class节点的名称,在该第二元数据集中查找目标class节点,该目标class节点与该class节点的名称相同;

标记子模块,用于如果查找不到该目标class节点,则将该class节点下所有成员函数的变更属性标记为第一属性,该第一属性用于指示发生代码变更。

可选地,该查找子模块,还用于如果查找到该目标class节点,且该class节点的摘要信息和该目标class节点的摘要信息相同,则对于该class节点下的每个method节点,读取该method节点的名称,在该第二元数据集中查找目标method节点,该目标method节点与该method节点的名称相同;

标记子模块,还用于如果查找不到该目标method节点,则将该method节点对应的方法的变更属性标记为该第一属性。

可选地,参见图8,该分析模块602还包括计算子模块:

该计算子模块,用于如果查找到该目标method节点,则根据该method节点的字节码序列和该目标method节点的字节码序列,计算莱文斯坦距离;

如果该莱文斯坦距离大于或者等于预设门限值,则将该method节点对应的方法的变更属性标记为该第一属性;

如果该莱文斯坦距离小于预设门限值,则将该method节点对应的方法的变更属性标记为该第二属性。

本发明实施例中,通过对第一元数据集中的class节点和第二元数据集中的class节点进行差异分析,来获取代码发生变更的多个成员函数,进而针对该多个成员函数,获取与该多个成员函数一一对应的测试用例,并根据这些测试用例生成测试用例集进行测试。上述技术方案可以精确地反映出哪些成员函数发生了代码变更,根据这些成员函数选取的测试用例针对性强,可以实现成员函数级别的针对性测试,提高了测试效率。

需要说明的是:上述实施例提供的基于代码变更分析的测试装置在基于代码变更分析的测试时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将设备的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的基于代码变更分析的测试装置与基于代码变更分析的测试方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。

图9是本发明实施例提供的一种基于代码变更分析的测试装置900的框图。参照图9,装置900包括处理组件9001,其进一步包括一个或多个处理器,以及由存储器9002所代表的存储器资源,用于存储可由处理组件9001的执行的指令,例如应用程序。存储器9002中存储的应用程序可以包括一个或一个以上的每一个对应于一组指令的模块。此外,处理组件9001被配置为执行指令,以执行上述基于代码变更分析的测试方法。

装置900还可以包括一个电源组件9003被配置为执行装置900的电源管理,一个有线或无线网络接口9004被配置为将装置900连接到网络,和一个输入输出(i/o)接口9005。装置900可以操作基于存储在存储器9002的操作系统,例如windowsservertm,macosxtm,unixtm,linuxtm,freebsdtm或类似。

本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。

以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1