本发明涉及计算机技术领域,尤其涉及一种代码测试覆盖率确定方法和装置。
背景技术:
代码测试覆盖作为软件测试中的一种度量被广泛使用,代码测试覆盖率在程式中源代码被测试的比例和程度,代码测试覆盖率越高,表示源代码中被测试的比例越高。
然而,相关技术中,代码测试覆盖率仅仅是根据本次对源代码测试的结果确定的,没有充分利用历史测试数据,测试效率低。
技术实现要素:
本发明的目的旨在至少在一定程度上解决相关技术中的技术问题之一。
为此,本发明的第一个目的在于提出一种代码测试覆盖率确定方法,该方法充分利用历史测试数据确定代码测试覆盖率,提高了测试效率。
本发明的第二个目的在于提出一种代码测试覆盖率确定装置。
为达上述目的,本发明第一方面实施例的代码测试覆盖率确定方法包括:
生成与指定路径对应的字节码文件,其中,所述字节码文件包括:与不同字节片段分别对应的探针;
在测试所述字节码文件的过程中,将已执行的字节片段对应的探针设置执行标识;
检测历史测试数据中是否对所述字节码文件中未执行的字节片段对应的探针设置过执行标识;
如果获知所述历史测试数据中对所述未执行的字节片段对应的探针设置过执行标识,则将与所述字节码文件中对应的未执行的字节片段的探针设置执行标识。
本发明实施例的代码测试覆盖率确定方法,生成与指定路径对应的字节码文件,并将已执行的字节片段对应的探针设置执行标识,检测历史测试数据中是否对字节码文件中未执行的字节片段对应的探针设置过执行标识,如果获知历史测试数据中对未执行的字节片段对应的探针设置过执行标识,则将与字节码文件中对应的未执行的字节片段的探针设置执行标识。由此,合并历史代码测试覆盖率,充分利用了历史测试数据确定代码测试覆盖率,提高了测试效率。
另外,本发明实施例的代码测试覆盖率确定方法,还具有如下附加的技术特征:
在本发明的一个实施例中,所述将已执行的字节片段对应的探针设置执行标识,包括:
将已执行的字节片段对应的探针的布尔值设置为真,或者,
将已执行的字节片段对应的探针值设置为1。
在本发明的一个实施例中,如果所述字节码文件为Java代码文件,
所述生成与指定路径对应的字节码文件,包括:
在tomcat中配置JaCoCo的javaagent代理参数,并启动服务;
在指定路径下生成选定类的被插入探针的字节码文件。
在本发明的一个实施例中,所述在测试所述字节码文件的过程中,将已执行的字节片段对应的探针设置执行标识,包括:
在测试所述字节码文件的过程中,调用相关类分析所述字节码文件,生成jacoco.exec文件,其中,所述jacoco.exec文件记录了已执行的字节片段对应的探针是否设置了执行标识。
在本发明的一个实施例中,所述检测历史测试数据中是否对所述字节码文件中未执行的字节片段对应的探针设置过执行标识,包括:
遍历所述指定路径下其他的jacoco.exec文件;
检测所述其他的jacoco.exec文件是否对所述字节码文件中未执行的字节片段对应的探针设置过执行标识。
为达上述目的,本发明第二方面实施例的代码测试覆盖率确定装置包括:
生成模块,用于生成与指定路径对应的字节码文件,其中,所述字节码文件包括:与不同字节片段分别对应的探针;
第一设置模块,用于在测试所述字节码文件的过程中,将已执行的字节片段对应的探针设置执行标识;
检测模块,用于检测历史测试数据中是否对所述字节码文件中未执行的字节片段对应的探针设置过执行标识;
第二设置模块,用于在获知所述历史测试数据中对所述未执行的字节片段对应的探针设置过执行标识时,将与所述字节码文件中对应的未执行的字节片段的探针设置执行标识。
本发明实施例的代码测试覆盖率确定装置,生成与指定路径对应的字节码文件,并将已执行的字节片段对应的探针设置执行标识,检测历史测试数据中是否对字节码文件中未执行的字节片段对应的探针设置过执行标识,如果获知历史测试数据中对未执行的字节片段对应的探针设置过执行标识,则将与字节码文件中对应的未执行的字节片段的探针设置执行标识。由此,合并历史代码测试覆盖率,充分利用了历史测试数据确定代码测试覆盖率,提高了测试效率。
另外,本发明实施例的代码测试覆盖率确定装置还具有如下附加的技术特征:
在本发明一个实施例中,所述第一设置模块用于:
将已执行的字节片段对应的探针的布尔值设置为真,或者,
将已执行的字节片段对应的探针值设置为1。
在本发明一个实施例中,如果所述字节码文件为Java代码文件,所述生成模块,包括:
启动单元,用于在tomcat中配置JaCoCo的javaagent代理参数,并启动服务;
生成单元,用于在指定路径下生成选定类的被插入探针的字节码文件。
在本发明一个实施例中,所述第一设置模块用于:
在测试所述字节码文件的过程中,调用相关类分析所述字节码文件,生成jacoco.exec文件,其中,所述jacoco.exec文件记录了已执行的字节片段对应的探针是否设置了执行标识。
在本发明一个实施例中,所述检测模块包括:
遍历单元,用于遍历所述指定路径下其他的jacoco.exec文件;
检测单元,用于检测所述其他的jacoco.exec文件是否对所述字节码文件中未执行的字节片段对应的探针设置过执行标识。
本发明附加的方面和优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本发明的实践了解到。
附图说明
本发明上述的和/或附加的方面和优点从下面结合附图对实施例的描述中将变得明显和容易理解,其中:
图1是根据本发明一个实施例的代码测试覆盖率确定方法的流程图;
图2(a)-图2(b)是根据本发明一个实施例的生成包含探针的字节码文件的应用示意图;
图3是根据本发明另一个实施例的代码测试覆盖率确定方法的流程图;
图4(a)-图4(c)是根据本发明一个实施例的代码测试覆盖率确定方法的应用示意图;
图5是根据本发明一个实施例的代码测试覆盖率确定装置的结构示意图;以及
图6是根据本发明另一个实施例的代码测试覆盖率确定装置的结构示意图。
具体实施方式
下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,旨在用于解释本发明,而不能理解为对本发明的限制。
下面参考附图描述本发明实施例的代码测试覆盖率确定方法和装置。
图1是根据本发明一个实施例的代码测试覆盖率确定方法的流程图,如图1所示,该方法包括:
S110,生成与指定路径对应的字节码文件,其中,字节码文件包括:与不同字节片段分别对应的探针。
通常,在开发软件的过程中,为了使得开发的软件满足用户的功能需求,且更为稳定,相关测试人员会对开发的软件的源代码进行测试,当测试某一段代码不稳定或不能实现相应的功能时,开发人员对代码进行删除、添加、修改等处理。
其中,代码测试覆盖率作为软件测试中一种评价测试质量的重要指标被广泛使用,比如,当代码测试覆盖率达到90%,则认为该软件对应的90%的代码已经被测试过,测试质量相对较高。
然而,相关技术中,代码测试覆盖率仅仅根据本次对当前代码的测试程度确定的,比如,测试工具JaCoCo(Java Code Coverage,分析代码测试覆盖率的工具)是依据代码中类的ID唯一定位类文件,当代码一旦更改,就会生成不同的类的ID,JaCoCo仅仅可根据本次对当前代码的测试程度确定当前代码测试覆盖率,无法完成对前后测试结果的合并。
也就是说,在当前待测试代码相较于历史测试的代码改动较小时,当前代码的代码测试覆盖率仍是根据对当前代码的测试程度确定的,不能充分利用历史测试数据,测试效率较低。
为了解决上述问题,本发明提出了一种代码测试率确定方法,可充分利用历史测试数据确定代码测试覆盖率,大大提高了测试效率。
具体而言,在实际应用中,为了实现本发明实施例的代码测试覆盖率方法,将待测试代码进行编译,在指定路径生成与待测试代码对应的字节码文件,以在字节码文件的特定位置插入探针,该字节码文件中,不同的探针与不同的字节片段对应。
S120,在测试字节码文件的过程中,将已执行的字节片段对应的探针设置执行标识。
具体地,在测试字节码文件的过程中,为了检测字节码中每个字段对应的代码是否被执行,可将已执行的字节片段对应的探针设置执行标识,用以标识该段字段对应的代码是否已被测试。
举例而言,源代码的执行流程如图2(a)所示,在对该源代码进行编译后,在指定路径生成字节码文件,该字节码文件中,在特定的位置分别设置有不同字节片段对应的探针,即如图2(b)所示,当该字节码在执行过程中,如果与探针P1、P2和P3对应的字节片段被执行,则将相应的探针设置执行标识,以表明该字节片段被执行。
需要说明的是,根据具体应用需求的不同,可采用不用的方式设置已执行的字节片段对应的执行标识:
第一种示例,可将已执行的字节片段对应的探针的布尔值设置为真。
从而,在本示例中,可根据测试字节码文件中,字节片段对应的探针的布尔值的真假,确定该字节片段是否被已被执行,当字节片段对应的探针的布尔值为真时,表明该字节片段已被执行,当字节片段对应的探针的布尔值为假时,表明该字节片段没有被执行。
第二种示例,将已执行的字节片段对应的探针值设置为1。
从而,在本示例中,可根据测试字节码文件中,字节片段对应的探针的布尔值的值,确定该字节片段是否被已被执行,当字节片段对应的探针的布尔值为1时,表明该字节片段已被执行,当字节片段对应的探针的布尔值为0时,表明该字节片段没有被执行。
第三种示例,将已执行的字节片段对应的区域标绿。
从而,在本示例中,可根据测试字节码文件中,字节片段对应的区域的颜色,确定该字节片段是否被已被执行,当字节片段对应的区域为绿色时,表明该字节片段已被执行,当字节片段对应的区域不为绿色时,表明该字节片段没有被执行。
S130,检测历史测试数据中是否对字节码文件中未执行的字节片段对应的探针设置过执行标识。
可以理解,历史测试数据中,已经被执行的字节片段的探针被设置执行标识,因此,在对字节码文件测试完毕后,可以检测历史测试数据中是否对字节码文件中未执行的字节片段设置过执行标识,以判断字节码文件中,未执行的字节片段是否已经被执行过。
S140,如果获知历史测试数据中对未执行的字节片段对应的探针设置过执行标识,则将与字节码文件中对应的未执行的字节片段的探针设置执行标识。
具体地,如果获知历史测试数据中未执行的字节片段对应的探针设置过执行标识,则表明该字节片段已被执行过,因此将与字节码文件中对应的未执行的字节片段对应的探针设置执行标识,从而实现合并历史代码测试覆盖率,充分利用了历史测试数据,提高了测试效率。
综上所述,本发明实施例的代码测试覆盖率确定方法,生成与指定路径对应的字节码文件,并将已执行的字节片段对应的探针设置执行标识,检测历史测试数据中是否对字节码文件中未执行的字节片段对应的探针设置过执行标识,如果获知历史测试数据中对未执行的字节片段对应的探针设置过执行标识,则将与字节码文件中对应的未执行的字节片段的探针设置执行标识。由此,合并历史代码测试覆盖率,充分利用了历史测试数据确定代码测试覆盖率,提高了测试效率。
基于以上实施例,应当理解的是,上述代码测试覆盖率确定方法适用于,需要确定代码测试覆盖率的测试机制中。比如,可适用于字码文件为C语言代码文件的确定代码测试覆盖率的测试机制中;又比如,可适用于字码文件为PHP代码文件的确定代码测试覆盖率的测试机制中等。
为了更加清楚的说明代码测试覆盖率确定方法实施例,下面以字码文件为Java代码文件,举例说明本发明实施例的代码测试覆盖率确定方法的实施过程,说明如下:
图3是根据本发明另一个实施例的代码测试覆盖率确定方法的流程图,如图3所示,该方法包括:
S310,在tomcat中配置JaCoCo的javaagent代理参数,并启动服务。
S320,在指定路径下生成选定类的被插入探针的字节码文件。
在本发明的一个实施例中,基于JaCoCo实现本发明实施例的代码测试覆盖率确定,因而,针对待测试的Java代码在tomcat中配置JaCoCo的javaagent代理参数,并启动服务。启动相关服务后,会在指定路径下生成选定类的被插入探针的字节码文件。
S330,在测试字节码文件的过程中,调用相关类分析字节码文件,生成jacoco.exec文件,其中,jacoco.exec文件记录了已执行的字节片段对应的探针是否设置了执行标识。
具体地,在测试字节码文件中,调用相关类分析字节码文件,生成记录各个类的具体代码是否被执行的数据的jacoco.exec文件,即jacoco.exec文件记录了已执行的字节片段对应的探针被设置了执行标识。
S340,遍历指定路径下其他的jacoco.exec文件。
S350,检测其他的jacoco.exec文件是否对字节码文件中未执行的字节片段对应的探针设置过执行标识。
具体地,由于每次确定代码测试覆盖率的过程中,都会生成对应的jacoco.exec文件,因而可通过遍历指定路径下的jacoco.exec文件,检测其他jacoco.exec文件是否对字节码文件中未执行的字节片段对应的探针位置设置过执行标识。
S360,如果获知历史测试数据中对未执行的字节片段对应的探针设置过执行标识,则将与字节码文件中对应的未执行的字节片段的探针设置执行标识。
举例而言,如图4(a)所示,在对某个Java字节码文件测试后,生成历史测试数据,该历史测试数据中,针对已测试的字节片段对应的探针P1和P3设置执行标识,进而开发人员可能根据测试数据,在Java代码中,增加了一段代码,从而生成本次待测试的Java字节码文件。
在对待测试的Java字节码文件测试过程中,如图4(b)所示,将已执行的字节片段对应的探针P2和P3设置执行标识。进而,针对本次未执行的字节片段即P1探针对应的字节片段,检测历史测试数据,根据检测结果,发现P1探针已被设置过执行标识,即P1对应的字节片段已被执行。
为了充分利用历史测试数据,提高测试效率,将与字节码文件中对应的未执行的字节片段的探针设置执行标识,即将待测试的Java字节码文件中的P1探针设置执行标识,从而如图4(c)所示,实现了将历史测试数据中的代码测试覆盖率与本次代码测试覆盖率的合并,探针P1、P2和P3均被设置执行标识。
综上所述,本发明实施例的代码测试覆盖率确定方法中,当字节码文件为Java代码文件时,根据Java代码文件的运行机制,基于JaCoCo测试合并历史代码测试覆盖率,充分利用历史测试数据确定代码测试覆盖率,提高了测试效率。
为了实现上述实施例,本发明还提出了一种代码测试覆盖率确定装置,图5是根据本发明一个实施例的代码测试覆盖率确定装置的结构示意图,如图5所示,该装置包括:生成模块10、第一设置模块20、检测模块30和第二设置模块40。
其中,生成模块10,用于生成与指定路径对应的字节码文件,其中,字节码文件包括:与不同字节片段分别对应的探针。
具体地,在实际应用中,生成模块10将待测试代码进行编译,在指定路径生成与待测试代码对应的字节码文件,以在字节码文件的特定位置插入探针,该字节码文件中,不同的探针与不同的字节片段对应。
第一设置模块20,用于在测试字节码文件的过程中,将已执行的字节片段对应的探针设置执行标识。
具体地,在测试字节码文件的过程中,为了检测字节码中每个字段对应的代码是否被执行,第一设置模块20可将已执行的字节片段对应的探针设置执行标识,用以标识该段字段对应的代码是否已被测试。
在本发明的一个实施例中,第一设置模块20用于将已执行的字节片段对应的探针的布尔值设置为真,或者,将已执行的字节片段对应的探针值设置为1。
检测模块30,用于检测历史测试数据中是否对字节码文件中未执行的字节片段对应的探针设置过执行标识。
第二设置模块40,用于在获知历史测试数据中对未执行的字节片段对应的探针设置过执行标识时,将与字节码文件中对应的未执行的字节片段的探针设置执行标识。
具体地,如果获知历史测试数据中未执行的字节片段对应的探针设置过执行标识,则表明该字节片段已被执行过,因此第二设置模块40将与字节码文件中对应的未执行的字节片段对应的探针设置执行标识,从而实现合并历史代码测试覆盖率,充分利用了历史测试数据,提高了测试效率。
需要说明的是,本发明实施例的代码测试覆盖率确定装置与上述实施例描述的代码测试覆盖率确定方法对应,其实现原理类似,在此不再赘述。
综上所述,本发明实施例的代码测试覆盖率确定装置,生成与指定路径对应的字节码文件,并将已执行的字节片段对应的探针设置执行标识,检测历史测试数据中是否对字节码文件中未执行的字节片段对应的探针设置过执行标识,如果获知历史测试数据中对未执行的字节片段对应的探针设置过执行标识,则将与字节码文件中对应的未执行的字节片段的探针设置执行标识。由此,合并历史代码测试覆盖率,充分利用了历史测试数据确定代码测试覆盖率,提高了测试效率。
为了更加清楚的说明代码测试覆盖率确定装置实施例,下面以字码文件为Java代码文件,举例说明本发明实施例的代码测试覆盖率确定装置的实施过程,说明如下:
图6是根据本发明另一个实施例的代码测试覆盖率确定装置的结构示意图,如图6所示,在如图5所示的基础上,生成模块10包括启动单元11、生成单元12,检测模块30包括遍历单元31和检测单元32。
其中,启动单元11,用于在tomcat中配置JaCoCo的javaagent代理参数,并启动服务。
生成单元12,用于在指定路径下生成选定类的被插入探针的字节码文件。
进而,第一设置模块20用于在测试字节码文件的过程中,调用相关类分析字节码文件,生成jacoco.exec文件,其中,jacoco.exec文件记录了已执行的字节片段对应的探针是否设置了执行标识。
遍历单元31,用于遍历指定路径下其他的jacoco.exec文件。
检测单元32,用于检测其他的jacoco.exec文件是否对字节码文件中未执行的字节片段对应的探针设置过执行标识。
在本发明的一个实施例中,如果获知历史测试数据中对未执行的字节片段对应的探针设置过执行标识,第二设置模块40则将与字节码文件中对应的未执行的字节片段的探针设置执行标识。
需要说明的是,本发明实施例的代码测试覆盖率确定装置与上述实施例描述的代码测试覆盖率确定方法对应,其实现原理类似,在此不再赘述。
综上所述,本发明实施例的代码测试覆盖率确定装置中,当字节码文件为Java代码文件时,根据Java代码文件的运行机制,基于JaCoCo测试合并历史代码测试覆盖率,充分利用历史测试数据确定代码测试覆盖率,提高了测试效率。
此外,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括至少一个该特征。在本发明的描述中,“多个”的含义是至少两个,例如两个,三个等,除非另有明确具体的限定。
在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必须针对的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。
尽管上面已经示出和描述了本发明的实施例,可以理解的是,上述实施例是示例性的,不能理解为对本发明的限制,本领域的普通技术人员在本发明的范围内可以对上述实施例进行变化、修改、替换和变型。