CN113946516A - 代码覆盖率确定方法、装置及存储介质 - Google Patents
代码覆盖率确定方法、装置及存储介质 Download PDFInfo
- Publication number
- CN113946516A CN113946516A CN202111223004.2A CN202111223004A CN113946516A CN 113946516 A CN113946516 A CN 113946516A CN 202111223004 A CN202111223004 A CN 202111223004A CN 113946516 A CN113946516 A CN 113946516A
- Authority
- CN
- China
- Prior art keywords
- code
- statement
- target
- line
- determining
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3676—Test management for coverage analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3684—Test management for test design, e.g. generating new test cases
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本申请公开了一种代码覆盖率确定方法、装置及存储介质,可以应用于云技术、人工智能、智慧交通、车联网等各种场景,所述方法包括:获取目标应用程序的源代码;解析源代码,得到代码块;代码块包括至少两个代码语句;基于至少两个代码语句在代码块中的位置,确定至少两个代码语句的排序结果;基于排序结果,将排序末位的代码语句作为当前代码语句;若当前代码语句为目标语句类型,在当前代码语句后插桩覆盖率计数器,得到插桩后代码;基于插桩后代码,确定源代码的覆盖率。本申请能有效地降低未覆盖代码语句被误判为已覆盖语句的概率,大大提高了测试覆盖率的准确率。
Description
技术领域
本申请涉及计算机技术领域,尤其涉及一种代码覆盖率确定方法、装置及存储介质。
背景技术
现有的Go语言的覆盖率插桩工具,均存在代码未覆盖却误判定为已覆盖的重大风险;在代码语句的解析、识别上,也存在函数内解析丢失、分支覆盖不完整的情况;并且覆盖率数据维度单一,缺少更多帮助测试的价值;此外,接入过程中需要用户进行较多的手工改造,甚至受限于源码的结构,编译、部署的方式,而无法实现插桩。
因此,有必要提供一种代码覆盖率确定方法、装置及存储介质,能有效地降低未覆盖代码语句被误判为已覆盖语句的概率,大大提高了测试覆盖率的准确率。
发明内容
本申请提供了一种代码覆盖率确定方法、装置及存储介质,可以降低未覆盖代码语句被误判为已覆盖语句的概率,大大提高了测试覆盖率的准确率。
一方面,本申请提供了一种代码覆盖率确定方法,所述方法包括:
获取目标应用程序的源代码;
解析所述源代码,得到代码块;所述代码块包括至少两个代码语句;
基于所述排序结果,将排序末位的代码语句作为当前代码语句;
若所述当前代码语句为目标语句类型,在所述当前代码语句后插桩覆盖率计数器,得到插桩后代码;
基于所述插桩后代码,确定所述源代码的覆盖率。
另一方面提供了一种代码覆盖率确定装置,所述装置包括:
源代码获取模块,用于获取目标应用程序的源代码;
代码解析模块,用于解析所述源代码,得到代码块;所述代码块包括至少两个代码语句;
排序结果确定模块,用于基于所述至少两个代码语句在所述代码块中的位置,确定所述至少两个代码语句的排序结果;
当前代码语句确定模块,用于基于所述排序结果,将排序末位的代码语句作为当前代码语句;
代码插桩模块,用于若所述当前代码语句为目标语句类型,在所述当前代码语句后插桩覆盖率计数器,得到插桩后代码;
覆盖率确定模块,用于基于所述插桩后代码,确定所述源代码的覆盖率。
另一方面提供了一种代码覆盖率确定设备,所述设备包括处理器和存储器,所述存储器中存储有至少一条指令或至少一段程序,所述至少一条指令或所述至少一段程序由所述处理器加载并执行以实现如上所述的代码覆盖率确定方法。
另一方面提供了一种计算机存储介质,所述计算机存储介质存储有至少一条指令或至少一段程序,所述至少一条指令或至少一段程序由处理器加载并执行以实现如上所述的代码覆盖率确定方法。
另一方面提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行以实现如上所述的代码覆盖率确定方法。
本申请提供的代码覆盖率确定方法、装置及存储介质,具有如下技术效果:
本申请获取目标应用程序的源代码;解析所述源代码,得到代码块;所述代码块包括至少两个代码语句;基于所述至少两个代码语句在所述代码块中的位置,确定所述至少两个代码语句的排序结果;基于排序结果,将排序末位的代码语句作为当前代码语句;若所述当前代码语句为目标语句类型,在所述当前代码语句后插桩覆盖率计数器,得到插桩后代码;基于所述插桩后代码,确定所述源代码的覆盖率;本申请由代码块末尾的代码语句开始,从后往前倒推寻找合适覆盖率计数器插桩位置,能有效地降低未覆盖代码语句被误判为已覆盖语句的概率,大大提高了测试覆盖率的准确率。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案和优点,下面将对实施例或现有技术描述中所需要使用的附图作简单的介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它附图。
图1是本申请实施例提供的一种代码覆盖率确定系统的示意图;
图2是本申请实施例提供的一种代码覆盖率确定方法的流程示意图;
图3是本申请实施例提供的一种得到目标代码集合的方法的流程示意图;
图4是本申请实施例提供的一种得到插桩后代码的方法的流程示意图;
图5是本申请实施例提供的一种覆盖率计数器的插桩方法的流程示意图;
图6是本申请实施例提供的在代码块的前置位插桩覆盖率计数器的覆盖率显示结果示意图;
图7是本申请实施例提供的包括内嵌函数的代码块的解析结果示意图;
图8是本申请实施例提供的仅有“if”无“else”的代码语句的插桩结果示意图;
图9是本申请实施例提供的一种覆盖率插桩方法的流程示意图;
图10是本申请实施例提供的插桩前的源码解析示意图;
图11是本申请实施例提供的图10的解析后源码的插桩方法示意图;
图12是本申请实施例提供的图10的解析后源码的全量插桩方法示意图;
图13是本申请实施例提供的代码插桩方法与现有的代码插桩方法对比图;
图14是本申请实施例提供的一种代码块中代码语句的插桩方法的流程示意图;
图15是本申请实施例提供的一种针对内嵌函数,构建代码块中可执行行集合的方法的流程示意图;
图16是本申请实施例提供的一种将“if”、“else if”、“else”典型的条件三种语法统一转换为“if”、“else”的方法的流程示意图;
图17是本申请实施例提供的一种转换语法前后的插桩方法对比图的流程示意图;
图18是本申请实施例提供的一种Griffin覆盖率平台的覆盖率测试结果示意图;
图19是本申请实施例提供的一种音乐应用程序的覆盖率平台的覆盖率测试结果示意图;
图20是本申请实施例提供的一种代码覆盖率确定装置的结构示意图;
图21是本申请实施例提供的一种服务器的结构示意图。
具体实施方式
本申请中涉及的专业术语解释如下:
插桩:在保证被测源码原有逻辑完整性的基础上在源码中插入一些探针(又称为“探测仪”,本质上就是进行信息采集的代码段,可以是赋值语句或采集覆盖信息的函数调用)。通过探针的执行得到程序运行的特征数据,对这些数据的分析,可以获得程序的控制流和数据流信息,进而得到逻辑覆盖等动态信息。
代码块:是一段程序运行逻辑组成部分,由多个代码语句组合而成。
覆盖率计数器:覆盖率计数器指测试工具在被测源码中添加的对指定代码块的执行次数进行统计的探针。
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本申请保护的范围。
需要说明的是,本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或服务器不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
请参阅图1,图1是本申请实施例提供的一种代码覆盖率确定系统的示意图,如图1所示,该代码覆盖率确定系统可以至少包括服务器01和客户端02。
具体的,本申请实施例中,所述服务器01可以包括一个独立运行的服务器,或者分布式服务器,或者由多个服务器组成的服务器集群,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、CDN(ContentDelivery Network,内容分发网络)、以及大数据和人工智能平台等基础云计算服务的云服务器。服务器01可以包括有网络通信单元、处理器和存储器等等。具体的,所述服务器01可以用于通过对应用程序的源代码进行后置插桩,从而确定应用程序中源代码的覆盖率。
具体的,本申请实施例中,所述客户端02可以包括智能手机、台式电脑、平板电脑、笔记本电脑、数字助理、智能可穿戴设备、智能音箱、车载终端、智能电视等类型的实体设备,也可以包括运行于实体设备中的软体,例如一些服务商提供给用户的网页页面,也可以为该些服务商提供给用户的应用。具体的,所述客户端02可以用于在线查询应用程序中源代码的覆盖率。
以下介绍本申请的一种代码覆盖率确定方法,图2是本申请实施例提供的一种代码覆盖率确定方法的流程示意图,本说明书提供了如实施例或流程图所述的方法操作步骤,但基于常规或者无创造性的劳动可以包括更多或者更少的操作步骤。实施例中列举的步骤顺序仅仅为众多步骤执行顺序中的一种方式,不代表唯一的执行顺序。在实际中的系统或服务器产品执行时,可以按照实施例或者附图所示的方法顺序执行或者并行执行(例如并行处理器或者多线程处理的环境)。具体的如图2所示,所述方法可以包括:
S201:获取目标应用程序的源代码。
在本申请实施例中,目标应用程序可以为客户端中应用程序,可以包括但不限于新闻应用程序、音乐应用程序、游戏应用程序、视频应用程序等。源代码可以为Go语言的代码;Go(又称Golang)语言是一种静态强类型、编译型语言。
在本申请实施例中,上述解析上述源代码,得到代码块,包括:
确定上述源代码中的条件语句。
在本申请实施例中,条件语句为包括特殊字符“if”、“else if”或“else”的语句。
确定上述条件语句的预设语法。
在本申请实施例中,可以根据条件语句中的特殊字符确定条件语句的预设语法,预设语法包括目标语法和非目标语法;若条件语句中包括“if”和“else”,确定预设语法为目标语法;反之,则确定为非目标语法;例如只包括“if”、“else if”或“else”,则确定为非目标语法。
若上述预设语法非目标语法,将上述条件语句转换成目标语法的语句,得到语法转换后源代码。
在本申请实施例中,可以将“if”、“else if”、“else”的三种语法统一转换为“if”、“else”的目标语法逻辑。
解析上述语法转换后源代码,得到上述代码块。
在本申请实施例中,若预设语法为目标语法,则直接将源代码解析为代码块。
相关技术中,在进行分支语句插桩时,当分支语句是仅有“if”无“else”的情况,Go原生的go test覆盖率方案只能够对“if”内的代码块进行插桩,所以仅能识别该分支条件为真的情况是否被覆盖;其它分支条件为假的情况无法判定;在一个具体的实施例中,如图8所示,仅在“if(a>b)"为真的代码块内进行插桩,其它分支条件为假的情况则无法插桩。该示例的条件覆盖逻辑表如表1所示:
表1
条件状态覆盖 | 插桩(1,2,3...,n) |
a>b已覆盖 | 已执行 |
a>b未覆盖,a<=b未覆盖 | 未执行 |
a<=b未覆盖 | 未执行 |
由表1可以看出,这样的插桩方案无法识别出“a<=b"的状态是否被执行到,条件语句单点插桩的瓶颈十分明显,会引起分支覆盖数据的丢失。
此外,Go原生的go test覆盖率方案在后台服务的手工测试场景下,需要进行将程序的运行入口函数包裹在测试函数内的改造,具有一定学习和接入成本,并且这样的改造难以适配编译方式为go build编译以外方式的服务。除此之外,改造后的go test方案需要在服务启动后,关闭服务进程才能获取到覆盖率数据产物,无法在服务进程运行中实时获取覆盖率数据,这也与用户对覆盖率工具不影响后台服务稳定运行的需求相悖。
在本申请实施例中,针对只有“if”无“else”的语句,独创地设计并实现了自动补充“else”的代码块结构信息,并在其内部进行覆盖率计数器的特色插桩。这样的分支覆盖两点插桩,能为用户提供更多维度的分支覆盖信息,确保条件覆盖完整性,从而提高插桩的完整性,提高确定的代码覆盖率的准确率。
S203:解析上述源代码,得到代码块;上述代码块包括至少两个代码语句。
在本申请实施例中,所述解析所述源代码,得到代码块包括:
基于所述源代码,构建抽象语法树;
基于所述抽象语法树,确定至少两个代码块,每个代码块包括至少两个代码语句。
在本申请实施例中,可以将源代码解析为抽象语法树,再根据抽象语法树,确定出代码块,每个代码块均由多个代码语句组成。
在本申请实施例中,上述方法还包括:
基于各个代码块在所述抽象语法树中的位置信息,对所述至少两个代码块进行排序;
在本申请实施例中,可以根据代码块在抽象语法树中的位置信息,将位置靠近根结点的代码块排序靠前,将位置靠近叶子结点的代码块排序靠后。本实施例中的排序并未打乱各个代码块在源代码中的位置。
基于代码块的排序结果,依次对每个代码块进行插桩。
在本申请实施例中,可以按照代码块的位置信息,从位置靠前的代码块开始依次对每个代码块中目标类型的代码语句进行插桩,本申请实施例中的插桩均指插桩覆盖率计数器。
S205:基于上述至少两个代码语句在上述代码块中的位置,确定上述至少两个代码语句的排序结果。
在本申请实施例中,可以根据各个代码语句在代码块中位置,依次对代码语句进行顺序排序,位置靠前的代码语句排在前面,位置靠后的代码语句排在后面,排序过程中并未改变代码语句在代码块中的位置。
在本申请实施例中,代码块可以为至少两个,可以基于每个代码块对应的至少两个代码语句在所述每个代码块中的位置,确定所述每个代码块中各个代码语句的排序结果。
在本申请实施例中,当代码块为多个时,可以按照代码块在源代码中的位置顺序,依次为每个代码块中目标类型的代码语句插桩,从而确保在每个代码块均插桩覆盖率计数器,提高确定的源代码的覆盖率的准确率。
在本申请实施例中,如图3所示,上述代码块中包括内嵌函数,上述方法还包括:
S301:确定上述代码块的起始代码行与结束代码行;
S303:确定上述内嵌函数的起始代码行与结束代码行;
在本申请实施例中,内嵌函数为内嵌于代码块中的函数,内嵌函数可以包括至少一个代码语句,内嵌函数可以为一个,也可以为多个。
在本申请实施例中,若上述内嵌函数为M个,M≥2且M为正整数,上述确定上述内嵌函数的起始代码行与结束代码行,包括:
遍历上述代码块中的内嵌函数;
确定遍历的第一内嵌函数至第M内嵌函数的起始代码行与结束代码行。
在本申请实施例中,可以确定出第一内嵌函数、第二内嵌函数、……、第M内嵌函数的起始代码行与结束代码行。
在本申请实施例中,上述确定遍历的第一内嵌函数至第M内嵌函数的起始代码行与结束代码行,包括:
确定第一目标内嵌函数的第一目标结束代码行;上述第一目标内嵌函数包括第一内嵌函数、第M-1内嵌函数以及上述第一内嵌函数与上述第M-1内嵌函数之间的函数;
将位置位于上述第一目标内嵌函数之后,且与上述第一目标内嵌函数相邻的内嵌函数作为第二目标内嵌函数;
确定上述第二目标内嵌函数的第二目标起始代码行。
S305:获取位于上述代码块的起始代码行与上述内嵌函数的起始代码行之间的代码,得到第一代码集合;
在本申请实施例中,上述获取位于上述代码块的起始代码行与上述内嵌函数的起始代码行之间的代码,得到第一代码集合,包括:
获取位于上述代码块的起始代码行与第一内嵌函数的起始代码行之间的代码,得到第一代码集合。
在本申请实施例中,可以将上述代码块的起始代码行与处于首位的起始代码行之间的代码组合成第一代码集合。
S307:获取位于上述内嵌函数的结束代码行与上述代码块的结束代码行之间的代码,得到第二代码集合;
在本申请实施例中,上述获取位于上述内嵌函数的结束代码行与上述代码块的结束代码行之间的代码,得到第二代码集合,包括:
获取位于第M内嵌函数的结束代码行与上述代码块的结束代码行之间的代码,得到第二代码集合。
在本申请实施例中,可以将处于末位的内嵌函数的结束代码行与上述代码块的结束代码行之间的代码组合,得到第二代码集合。
S309:对上述第一代码集合与上述第二代码集合进行拼接,得到目标代码集合。
在本申请实施例中,如图4所示,上述对上述第一代码集合与上述第二代码集合进行拼接,得到目标代码集合,包括:
S3091:获取位于上述第一目标结束代码行与上述第二目标起始代码行之间的代码,得到目标内嵌代码集合;
在本申请实施例中,目标内嵌代码集合可以为一个或多个,目标内嵌代码集合的数量基于第一目标内嵌函数确定。
在本申请实施例中,当M=2时,可以将第一内嵌函数的结束代码行与第二内嵌函数的起始代码行之间的代码确定为目标内嵌代码集合。
S3093:对上述第一代码集合、上述第二代码集合以及上述目标内嵌代码集合进行拼接,得到上述目标代码集合。
在一个具体的实施例中,若内嵌函数为三个,可以获取第一内嵌函数的结束代码行与第二内嵌函数的起始代码行之间的代码,得到第一内嵌代码集合;
获取第二内嵌函数的结束代码行与第三内嵌函数的起始代码行之间的代码,得到第二内嵌代码集合;
获取第三内嵌函数的结束代码行与第四内嵌函数的起始代码行之间的代码,得到第三内嵌代码集合;
上述对上述第一代码集合、上述第二代码集合以及上述目标内嵌代码集合进行拼接,得到上述目标代码集合,可以包括:
对上述第一代码集合、上述第二代码集合以及第一内嵌代码集合、第二内嵌代码集合、第三内嵌代码集合进行拼接,得到上述目标代码集合。
在本申请实施例中,可以获取所有相邻内嵌函数之间的代码,得到内嵌代码集合。
相关技术中,Go语言的语法支持将内嵌函数作为参数传递给另一个函数。Go原生的覆盖率方案在解析函数代码语句结构,并进行覆盖率插桩时,若函数传入参数中有另一个函数结构,则会破坏其上下文的代码语句结构,从而导致该代码块解析不完整,引起部分代码行信息丢失。被丢失的代码行会被分类成不可执行的代码行或者无效行,不计入覆盖率的分子、分母计算,进而造成覆盖率数据不准确。在一个具体实施例中,如图7所示,函数传入参数内,代码块n中插入了内嵌函数代码块m,Go原生的go test覆盖率方案在解析这段代码时,仅能解析出代码块n的前半部分和内嵌的代码块m,无法识别出内嵌的代码块m后的代码行,导致代码块n被代码块m截断的后半部分代码行被丢失,无法被识别为作为覆盖率计算分母的可执行代码行,从而造成覆盖率数据失真。
在本申请实施例中,当代码块中存在内嵌函数时,会导致代码块中代码语句被分割,从而会出现丢失代码行的情况,此时,可以将代码块中除内嵌函数之外的代码语句进行拼接,得到目标代码集合,再进行插桩,从而提高插桩的准确率。
在本申请实施例中,上述内嵌函数包括至少两个第一代码语句,上述目标代码集合包括至少两个第二代码语句;上述基于上述至少两个代码语句在上述代码块中的位置,确定上述至少两个代码语句的排序结果,包括:
基于上述至少两个第一代码语句在上述内嵌函数中的位置,确定上述至少两个第一代码语句的排序结果;
基于上述至少两个第二代码语句在上述目标代码集合中的位置,确定上述至少两个第二代码语句的排序结果。
S207:基于上述排序结果,将排序末位的代码语句作为当前代码语句。
S209:若上述当前代码语句为目标语句类型,在上述当前代码语句后插桩覆盖率计数器,得到插桩后代码。
在本申请实施例中,目标语句类型可以包括表达语句、声明语句、赋值语句等;还可以设置不同目标语句类型的代码语句的优先等级;例如,先判断当前代码语句是否为表达语句;若是,则执行插桩;若不是,继续判断当前代码语句是否为声明语句;若是,则执行插桩;若不是,继续判断当前代码语句是否为赋值语句,若是,则执行插桩;若不是,继续判断当前代码语句之前的上一个代码语句。
在本申请实施例中,由代码块末尾的代码语句开始,从后往前倒推寻找合适覆盖率计数器插桩位置,能有效地降低未覆盖代码语句被误判为已覆盖语句的概率。
在本申请实施例中,如图5所示,上述基于上述排序结果,将排序末位的代码语句作为当前代码语句之后,上述方法还包括:
S2081:判断上述当前代码语句的语句类型;
在本申请实施例中,语句类型可以包括目标语句类型和非目标语句类型,目标语句类型可以包括表达语句、声明语句、赋值语句等;非目标语句类型可以包括末尾存在“continue”,“return”,“break”等此类中断、退出的代码语句。
S2083:若上述当前代码语句非目标语句类型,获取位于上述当前代码语句之前的上一个代码语句,并将上述上一个代码语句重新作为当前代码语句;
S2085:重复上述判断上述当前代码语句的语句类型的步骤。
在本申请实施例中,若目标语句类型的代码语句末尾存在“continue”,“return”,“break”等此类中断、退出的语句,则将覆盖率计数器精准插桩在这类语句前面,使得当中断、退出语句发生时,覆盖率计数器无法被执行到,从而避免未覆盖代码语句被误判为已覆盖的重大覆盖率失真的风险。
在本申请实施例中,若当前代码语句非目标语句类型,则继续判断上一个代码语句,直至找到目标语句类型的代码语句为止。
S2011:基于上述插桩后代码,确定上述源代码的覆盖率。
相关技术中,Go的测试(go test)覆盖率方案默认仅支持白盒测试(单元测试)。基本原理如下:将源码先用抽象语法树解析并划分为若干代码块,然后利用Go原生的go toolcover(终端显示工具)在每个代码块前置位插桩覆盖率计数器。当程序运行后,执行代码块时,会先触发覆盖率计数器,从而将计数器后该代码块包含的所有代码语句判定为已执行、已覆盖。
在非白盒测试(即接口、系统、手工等黑盒测试)场景下,目前主流的获取go语言覆盖率的方法是在go test覆盖率方案的基础上进行改造,具体步骤是将程序运行入口函数包裹在测试函数内,通过go test编译二进制程序来实现覆盖率插桩,然后运行被编译的服务进行测试,测试完成后,关闭服务进程,才可获得相应的覆盖率产物。Go原生的go test覆盖率方案采用的是在代码块的前置位插桩覆盖率计数器的方案。在程序运行采集覆盖率的过程中,执行到被测代码块前,会先执行前置的计数器,若计数器执行到了,go test覆盖率方案会判定该被测代码块内的所有语句已覆盖,再执行真正的被测代码块内的代码语句。在一个具体的实施例中,如图6所示,若在执行被测代码块时,某些语句出现异常或中断,则异常语句之后的代码语句,虽然没有执行到,也会因为前置插桩的覆盖率计数器已经被覆盖到了而被判定为已覆盖。从而导致了未覆盖代码语句被误判为已覆盖的重大覆盖率失真。
在白盒测试中,若程序在运行时出现代码异常中断等情况,可以根据被测代码的信息来定位和分析程序异常执行的原因。但是在接口、系统测试等黑盒测试中,很难从外部准确地定位到程序异常中断的原因,甚至难以发现程序出现了异常中断的情况。所以,前置插桩方案在这种程序异常中断的场景下的误判,会导致测试覆盖率的可靠性严重降低。
在本申请实施例中,可以通过运行后置插桩的代码,确定源代码的覆盖率;能从原理上避免未覆盖误判定的风险,能有效显著地降低未覆盖代码语句被误判为已覆盖的重大覆盖率失真的风险,大大提高了测试覆盖率的可靠性。且只对源代码本身做覆盖率计数器的插桩,将程序执行后实时采集到的覆盖率数据导出在缓存文件中,无损源码结构并且维持源码原编译、部署方式,因此,能显著地提升各类框架的Go语言项目接入覆盖率的效率。
在本申请的实施例中,如图9所示,图9为对Go服务进行覆盖率插桩方法的流程示意图;采用本实施例的方法对Go服务文件的源码进行插桩,得到带桩源码,然后对带桩源码进行编译,再部署得到带桩服务文件,从而可以实时获取覆盖率数据。
在本申请的实施例中,对源码进行插桩时,如图10-11所示,图10-11为源码插桩前后的解析流程图;插桩工具会在保证被测源码原有逻辑完整性的基础上,在源码中插入覆盖率计数器的插桩代码。
在本申请的实施例中,如图12所示,还可以采用对全量代码进行插桩的方案,即以单行代码作为插桩单位,在每个代码行的前置位都进行覆盖率计数器的插桩。这个方案需要对每一行都进行覆盖率计数器的插桩,代码量大,整体插桩耗时会很长,效率低;程序运行时,覆盖率数据统计量大,对覆盖率数据读取和分析的性能有影响。
在本申请的实施例中,如图13所示,图13为本实施例的代码插桩方法与现有的代码插桩方法对比图;在覆盖率插桩时由传统的代码块内前置插桩替换为全新的后置插桩方案。在本发明中,覆盖率计数器插桩的位置由前置位改为了后置位。若代码块内末尾存在“continue”,“return”,“break”等此类中断、退出的语句,本发明会将覆盖率计数器精准插桩在这类语句前,使得当中断、退出语句发生时,覆盖率计数器无法被执行到,从而避免未覆盖代码语句被误判为已覆盖的重大覆盖率失真的风险。
在本申请的实施例中,如图14所示,图14为本实施例的一种代码块中代码语句的插桩方法的流程示意图,插桩策略为以后置位作为起点,由下而上、倒推逐个语句识别判断插桩位置。具体包括如下步骤:
S1401:将源代码中任一代码块解析成n个代码语句,包括代码语句1、2、3、4、……、n-1、n;
S1403:按照代码语句的倒序,依次对每个代码语句进行语句类型判断以及插桩操作;以代码语句n作为起始语句,判断该语句是否为表达语句;
S1405:若是表达语句,则在代码语句n后面插桩覆盖率计数器;
S1407:若不是表达语句,继续判断代码语句n是否为声明语句;
S1409:若是声明语句,则在代码语句n后面插桩覆盖率计数器;
S1411:若不是声明语句,继续判断代码语句n是否为赋值语句;
S1413:若是赋值语句,则在代码语句n后面插桩覆盖率计数器;
S1415:若不是赋值语句,则将代码语句中n赋值n-1,并判断赋值后n是否为0;
S1417:若赋值后n为0,且在此之前,未进行过插桩操作,则确定在代码语句1之前进行前置插桩;
S1419:若赋值后n非0,则重复S1403中以代码语句n作为起始语句,判断该语句是否为表达语句的步骤至步骤S1415。
在本申请的实施例中,可以整体显著提升覆盖率插桩、采集的准确性,减少未覆盖代码误判的情况。
在本申请的实施例中,如图15所示,对于代码语句被其它代码块插入,导致代码行被分割的情况,本发明采用暂存被切割的各代码行,之后识别过滤、拼接出该代码语句所对应的完整代码行集合的解析策略。
合并策略包括三部分:
1.代码语句起始行与第一个内嵌代码块的起始行间的代码行集合,2.多个内嵌代码块,即前一个末尾行与后一个起始行间的代码行集合合并,3.最后一个内嵌代码块的末尾行与原代码语句的末尾行间的代码行集合。这三个暂存的代码行集合拼接,便可完整复现整个代码语句包含的所有代码行信息。
在本申请的实施例中,如图16所示,本发明在解析条件语句时,首先会遵循gotest插桩的条件语句插桩逻辑,先将“if”、“else if”、“else”典型的条件三种语法统一转换为“if”、“else”的逻辑,即只有条件“真”、“假”两种状态。
在本申请的实施例中,如图17所示,上述拆分完成后,再实现仅“if”无“else”的隐式条件语句插桩,具体方法上就是把隐式“else”添加、显示出来即可。
在本申请的实施例中,补充“else”语句后,在“else”内插桩;即条件语句“真”、“假”内都插桩,保证可准确判断条件语句是否覆盖。
在本申请的实施例中,图17中单点插桩仅在“if(a>b)"为真的代码块内进行插桩。该示例的条件覆盖逻辑如表2所示:
表2
条件状态覆盖 | 插桩(1,2,3...,n) |
a>b已覆盖 | 已执行 |
a>b未覆盖,a<=b未覆盖 | 未执行 |
a<=b未覆盖 | 未执行 |
在本申请的实施例中,可以看出,该方法无法识别出“a<=b"的状态是否被执行到,条件语句单点插桩的瓶颈十分明显,会引起分支覆盖数据的丢失。
在本申请的实施例中,本发明方案的示例的条件覆盖逻辑如表3所示:
表3
条件状态覆盖 | 插桩(1,2,3...,n) | 插桩m |
a>b已覆盖 | 已执行 | 未执行 |
a>b未覆盖 | 未执行 | / |
a<=b已覆盖 | 未执行 | 已执行 |
a<=b未覆盖 | / | 未执行 |
在本申请的实施例中,本发明的自动识别补充隐式“else”条件插桩方案,可以在分支语句的解析插桩中,为用户提供更多维度的分支覆盖信息,确保条件覆盖完整性。
在本申请的实施例中,可以将本申请的后置插桩方法应用于Griffin(格里芬)覆盖率平台,得到的不同文件的覆盖率测试结果如图18所示,包括每个文件的已覆盖行、语句覆盖率和分支覆盖率。
在本申请的实施例中,还可以将本申请的后置插桩方法应用于音乐应用程序的覆盖率平台,得到的覆盖率测试结果如图19所示,可以展示版本覆盖率、需求覆盖率、分支覆盖率、提交覆盖率、覆盖率任务以及覆盖率配置信息等;在该平台中,可以设置文件路径或文件名来进行文件搜索,从而查看每个文件对应的总行数、行覆盖率、函数覆盖率,并可以通过点击对应的“操作”标识,仅显示对应文件的详细覆盖率信息。
在本申请的实施例中,测试同学可以通过分析未覆盖的代码逻辑,找出潜在的遗漏测试用例,通过对遗漏的测试用例进行补充,来增强测试、开发同学对代码质量和测试完整度的信心。
本实施例还能应用于模糊测试场景。模糊测试是一种通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。具体来说,测试同学使用不同的模糊测试方法作为测试用例,然后使用本实施例获取覆盖率并查看代码的覆盖情况,以及获取不同代码语句的覆盖频次,从而对模糊测试算法的有效性进行评估,能有效提高模糊测试的效率。
由以上本申请实施例提供的技术方案可见,本申请实施例获取目标应用程序的源代码;解析上述源代码,得到代码块;上述代码块包括至少两个代码语句;基于上述至少两个代码语句在上述代码块中的位置,确定上述至少两个代码语句的排序结果;基于上述排序结果,将排序末位的代码语句作为当前代码语句;若上述当前代码语句为目标语句类型,在上述当前代码语句后插桩覆盖率计数器,得到插桩后代码;基于上述插桩后代码,确定上述源代码的覆盖率;本申请由代码块末尾的代码语句开始,从后往前倒推寻找合适覆盖率计数器插桩位置,能有效地降低未覆盖代码语句被误判为已覆盖语句的概率,大大提高了测试覆盖率的准确率。
本申请实施例还提供了一种代码覆盖率确定装置,如图20所示,所述装置包括:
源代码获取模块2010,用于获取目标应用程序的源代码;
代码解析模块2020,用于解析上述源代码,得到代码块;上述代码块包括至少两个代码语句;
排序结果确定模块2030,用于基于上述至少两个代码语句在上述代码块中的位置,确定上述至少两个代码语句的排序结果;
当前代码语句确定模块2040,用于基于所述排序结果,将排序末位的代码语句作为当前代码语句;
代码插桩模块2050,用于若所述当前代码语句为目标语句类型,在所述当前代码语句后插桩覆盖率计数器,得到插桩后代码;
覆盖率确定模块2060,用于基于上述插桩后代码,确定上述源代码的覆盖率。
在一些实施例中,所述装置还可以包括:
语句类型判断模块,用于判断上述当前代码语句的语句类型;
上一个代码语句获取模块,用于若所述当前代码语句非目标语句类型,获取位于上述当前代码语句之前的上一个代码语句,并将上述上一个代码语句重新作为当前代码语句;
重复模块,用于重复所述判断所述当前代码语句的语句类型的步骤。
在一些实施例中,上述代码块中包括内嵌函数,所述装置还可以包括:
代码块的代码行确定模块,用于确定上述代码块的起始代码行与结束代码行;
内嵌函数的代码行确定模块,用于确定上述内嵌函数的起始代码行与结束代码行;
第一代码集合确定模块,用于获取位于上述代码块的起始代码行与上述内嵌函数的起始代码行之间的代码,得到第一代码集合;
第二代码集合确定模块,用于获取位于上述内嵌函数的结束代码行与上述代码块的结束代码行之间的代码,得到第二代码集合;
目标代码集合确定模块,用于对上述第一代码集合与上述第二代码集合进行拼接,得到目标代码集合。
在一些实施例中,上述内嵌函数包括至少两个第一代码语句,上述目标代码集合包括至少两个第二代码语句;所述排序结果确定模块可以包括:
第一排序结果确定单元,用于基于上述至少两个第一代码语句在上述内嵌函数中的位置,确定上述至少两个第一代码语句的排序结果;
第二排序结果确定单元,用于基于上述至少两个第二代码语句在上述目标代码集合中的位置,确定上述至少两个第二代码语句的排序结果。
在一些实施例中,上述内嵌函数为M个,M≥2且M为正整数,所述内嵌函数的代码行确定模块可以包括:
函数遍历单元,用于遍历上述代码块中的内嵌函数;
内嵌函数的代码行确定单元,用于确定遍历的第一内嵌函数至第M内嵌函数的起始代码行与结束代码行。
在一些实施例中,所述第一代码集合确定模块可以包括:
第一代码集合确定单元,用于获取位于上述代码块的起始代码行与第一内嵌函数的起始代码行之间的代码,得到第一代码集合。
在一些实施例中,所述第二代码集合确定模块可以包括:
第二代码集合确定单元,用于获取位于第M内嵌函数的结束代码行与上述代码块的结束代码行之间的代码,得到第二代码集合。
在一些实施例中,所述内嵌函数的代码行确定单元可以包括:
第一目标结束代码行确定子单元,用于确定第一目标内嵌函数的第一目标结束代码行;上述第一目标内嵌函数包括第一内嵌函数、第M-1内嵌函数以及上述第一内嵌函数与上述第M-1内嵌函数之间的函数;
第二目标内嵌函数确定子单元,用于将位置位于上述第一目标内嵌函数之后,且与上述第一目标内嵌函数相邻的内嵌函数作为第二目标内嵌函数;
第二目标起始代码行确定子单元,用于确定上述第二目标内嵌函数的第二目标起始代码行。
在一些实施例中,所述目标代码集合确定模块可以包括:
目标内嵌代码集合确定单元,用于获取位于上述第一目标结束代码行与上述第二目标起始代码行之间的代码,得到目标内嵌代码集合;
目标代码集合确定单元,用于对上述第一代码集合、上述第二代码集合以及上述目标内嵌代码集合进行拼接,得到上述目标代码集合。
在一些实施例中,所述代码解析模块可以包括:
条件语句确定单元,用于确定上述源代码中的条件语句;
预设语法确定单元,用于确定上述条件语句的预设语法;
语句转换单元,用于若上述预设语法非目标语法,将上述条件语句转换成目标语法的语句,得到语法转换后源代码;
代码块确定单元,用于解析上述语法转换后源代码,得到上述代码块。
所述的装置实施例中的装置与方法实施例基于同样地发明构思。
本申请实施例提供了一种代码覆盖率确定设备,该设备包括处理器和存储器,该存储器中存储有至少一条指令或至少一段程序,该至少一条指令或至少一段程序由该处理器加载并执行以实现如上述方法实施例所提供的代码覆盖率确定方法。
本申请的实施例还提供了一种计算机存储介质,所述存储介质可设置于终端之中以保存用于实现方法实施例中一种代码覆盖率确定方法相关的至少一条指令或至少一段程序,该至少一条指令或至少一段程序由该处理器加载并执行以实现上述方法实施例提供的代码覆盖率确定方法。
本申请的实施例还提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行以实现上述方法实施例提供的代码覆盖率确定方法。
可选地,在本申请实施例中,存储介质可以位于计算机网络的多个网络服务器中的至少一个网络服务器。可选地,在本实施例中,上述存储介质可以包括但不限于:U盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
本申请实施例所述存储器可用于存储软件程序以及模块,处理器通过运行存储在存储器的软件程序以及模块,从而执行各种功能应用以及数据处理。存储器可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、功能所需的应用程序等;存储数据区可存储根据所述设备的使用所创建的数据等。此外,存储器可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。相应地,存储器还可以包括存储器控制器,以提供处理器对存储器的访问。
本申请实施例所提供的代码覆盖率确定方法实施例可以在移动终端、计算机终端、服务器或者类似的运算装置中执行。以运行在服务器上为例,图21是本申请实施例提供的一种代码覆盖率确定方法的服务器的硬件结构框图。如图21所示,该服务器2100可因配置或性能不同而产生比较大的差异,可以包括一个或一个以上中央处理器(CentralProcessing Units,CPU)2110(中央处理器2110可以包括但不限于微处理器MCU或可编程逻辑器件FPGA等的处理装置)、用于存储数据的存储器2130,一个或一个以上存储应用程序2123或数据2122的存储介质2120(例如一个或一个以上海量存储设备)。其中,存储器2130和存储介质2120可以是短暂存储或持久存储。存储在存储介质2120的程序可以包括一个或一个以上模块,每个模块可以包括对服务器中的一系列指令操作。更进一步地,中央处理器2110可以设置为与存储介质2120通信,在服务器2100上执行存储介质2120中的一系列指令操作。服务器2100还可以包括一个或一个以上电源2160,一个或一个以上有线或无线网络接口2150,一个或一个以上输入输出接口2140,和/或,一个或一个以上操作系统2121,例如Windows ServerTM,Mac OS XTM,UnixTM,LinuxTM,FreeBSDTM等等。
输入输出接口2140可以用于经由一个网络接收或者发送数据。上述的网络具体实例可包括服务器2100的通信供应商提供的无线网络。在一个实例中,输入输出接口2140包括一个网络适配器(Network Interface Controller,NIC),其可通过基站与其他网络设备相连从而可与互联网进行通讯。在一个实例中,输入输出接口2140可以为射频(RadioFrequency,RF)模块,其用于通过无线方式与互联网进行通讯。
本领域普通技术人员可以理解,图21所示的结构仅为示意,其并不对上述电子装置的结构造成限定。例如,服务器2100还可包括比图21中所示更多或者更少的组件,或者具有与图21所示不同的配置。
由上述本申请提供的代码覆盖率确定方法、装置、设备或存储介质的实施例可见,本申请获取目标应用程序的源代码;解析上述源代码,得到代码块;上述代码块包括至少两个代码语句;基于上述至少两个代码语句在上述代码块中的位置,确定上述至少两个代码语句的排序结果;基于上述排序结果,将排序末位的代码语句作为当前代码语句;若上述当前代码语句为目标语句类型,在上述当前代码语句后插桩覆盖率计数器,得到插桩后代码;基于上述插桩后代码,确定上述源代码的覆盖率;本申请由代码块末尾的代码语句开始,从后往前倒推寻找合适覆盖率计数器插桩位置,能有效地降低未覆盖代码语句被误判为已覆盖语句的概率,大大提高了测试覆盖率的准确率。
需要说明的是:上述本申请实施例先后顺序仅仅为了描述,不代表实施例的优劣。且上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置、设备、存储介质实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上所述仅为本申请的较佳实施例,并不用以限制本申请,凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。
Claims (10)
1.一种代码覆盖率确定方法,其特征在于,所述方法包括:
获取目标应用程序的源代码;
解析所述源代码,得到代码块;所述代码块包括至少两个代码语句;
基于所述至少两个代码语句在所述代码块中的位置,确定所述至少两个代码语句的排序结果;
基于所述排序结果,将排序末位的代码语句作为当前代码语句;
若所述当前代码语句为目标语句类型,在所述当前代码语句后插桩覆盖率计数器,得到插桩后代码;
基于所述插桩后代码,确定所述源代码的覆盖率。
2.根据权利要求1所述的方法,其特征在于,所述基于所述排序结果,将排序末位的代码语句作为当前代码语句之后,所述方法还包括:
判断所述当前代码语句的语句类型;
若所述当前代码语句非目标语句类型,获取位于所述当前代码语句之前的上一个代码语句,并将所述上一个代码语句重新作为当前代码语句;
重复所述判断所述当前代码语句的语句类型的步骤。
3.根据权利要求1所述的方法,其特征在于,所述代码块中包括内嵌函数,所述方法还包括:
确定所述代码块的起始代码行与结束代码行;
确定所述内嵌函数的起始代码行与结束代码行;
获取位于所述代码块的起始代码行与所述内嵌函数的起始代码行之间的代码,得到第一代码集合;
获取位于所述内嵌函数的结束代码行与所述代码块的结束代码行之间的代码,得到第二代码集合;
对所述第一代码集合与所述第二代码集合进行拼接,得到目标代码集合。
4.根据权利要求3所述的方法,其特征在于,所述内嵌函数包括至少两个第一代码语句,所述目标代码集合包括至少两个第二代码语句;所述基于所述至少两个代码语句在所述代码块中的位置,确定所述至少两个代码语句的排序结果,包括:
基于所述至少两个第一代码语句在所述内嵌函数中的位置,确定所述至少两个第一代码语句的排序结果;
基于所述至少两个第二代码语句在所述目标代码集合中的位置,确定所述至少两个第二代码语句的排序结果。
5.根据权利要求3所述的方法,其特征在于,所述内嵌函数为M个,M≥2且M为正整数,所述确定所述内嵌函数的起始代码行与结束代码行,包括:
遍历所述代码块中的内嵌函数;
确定遍历的第一内嵌函数至第M内嵌函数的起始代码行与结束代码行;
所述获取位于所述代码块的起始代码行与所述内嵌函数的起始代码行之间的代码,得到第一代码集合,包括:
获取位于所述代码块的起始代码行与第一内嵌函数的起始代码行之间的代码,得到第一代码集合;
所述获取位于所述内嵌函数的结束代码行与所述代码块的结束代码行之间的代码,得到第二代码集合,包括:
获取位于第M内嵌函数的结束代码行与所述代码块的结束代码行之间的代码,得到第二代码集合。
6.根据权利要求5所述的方法,其特征在于,所述确定遍历的第一内嵌函数至第M内嵌函数的起始代码行与结束代码行,包括:
确定第一目标内嵌函数的第一目标结束代码行;所述第一目标内嵌函数包括第一内嵌函数、第M-1内嵌函数以及所述第一内嵌函数与所述第M-1内嵌函数之间的函数;
将位置位于所述第一目标内嵌函数之后,且与所述第一目标内嵌函数相邻的内嵌函数作为第二目标内嵌函数;
确定所述第二目标内嵌函数的第二目标起始代码行;
所述对所述第一代码集合与所述第二代码集合进行拼接,得到目标代码集合,包括:
获取位于所述第一目标结束代码行与所述第二目标起始代码行之间的代码,得到目标内嵌代码集合;
对所述第一代码集合、所述第二代码集合以及所述目标内嵌代码集合进行拼接,得到所述目标代码集合。
7.根据权利要求1所述的方法,其特征在于,所述解析所述源代码,得到代码块,包括:
确定所述源代码中的条件语句;
确定所述条件语句的预设语法;
若所述预设语法非目标语法,将所述条件语句转换成目标语法的语句,得到语法转换后源代码;
解析所述语法转换后源代码,得到所述代码块。
8.一种代码覆盖率确定装置,其特征在于,所述装置包括:
源代码获取模块,用于获取目标应用程序的源代码;
代码解析模块,用于解析所述源代码,得到代码块;所述代码块包括至少两个代码语句;
排序结果确定模块,用于基于所述至少两个代码语句在所述代码块中的位置,确定所述至少两个代码语句的排序结果;
当前代码语句确定模块,用于基于所述排序结果,将排序末位的代码语句作为当前代码语句;
代码插桩模块,用于若所述当前代码语句为目标语句类型,在所述当前代码语句后插桩覆盖率计数器,得到插桩后代码;
覆盖率确定模块,用于基于所述插桩后代码,确定所述源代码的覆盖率。
9.一种计算机存储介质,其特征在于,所述计算机存储介质中存储有至少一条指令或至少一段程序,所述至少一条指令或所述至少一段程序由处理器加载并执行以实现如权利要求1-7任一所述的代码覆盖率确定方法。
10.一种计算机程序产品,其特征在于,所述计算机程序产品包括计算机指令,所述计算机指令被处理器执行时实现如权利要求1-7任一所述的代码覆盖率确定方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111223004.2A CN113946516A (zh) | 2021-10-20 | 2021-10-20 | 代码覆盖率确定方法、装置及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111223004.2A CN113946516A (zh) | 2021-10-20 | 2021-10-20 | 代码覆盖率确定方法、装置及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113946516A true CN113946516A (zh) | 2022-01-18 |
Family
ID=79331896
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111223004.2A Pending CN113946516A (zh) | 2021-10-20 | 2021-10-20 | 代码覆盖率确定方法、装置及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113946516A (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114817045A (zh) * | 2022-04-29 | 2022-07-29 | 北京轩宇信息技术有限公司 | 一种源代码覆盖率确定方法及系统 |
CN116483736A (zh) * | 2023-06-21 | 2023-07-25 | 荣耀终端有限公司 | 插桩位置确定方法及电子设备 |
CN114817045B (zh) * | 2022-04-29 | 2024-10-25 | 北京轩宇信息技术有限公司 | 一种源代码覆盖率确定方法及系统 |
-
2021
- 2021-10-20 CN CN202111223004.2A patent/CN113946516A/zh active Pending
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114817045A (zh) * | 2022-04-29 | 2022-07-29 | 北京轩宇信息技术有限公司 | 一种源代码覆盖率确定方法及系统 |
CN114817045B (zh) * | 2022-04-29 | 2024-10-25 | 北京轩宇信息技术有限公司 | 一种源代码覆盖率确定方法及系统 |
CN116483736A (zh) * | 2023-06-21 | 2023-07-25 | 荣耀终端有限公司 | 插桩位置确定方法及电子设备 |
CN116483736B (zh) * | 2023-06-21 | 2024-03-12 | 荣耀终端有限公司 | 插桩位置确定方法及电子设备 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109388566B (zh) | 一种代码覆盖率分析方法、装置、设备及存储介质 | |
CN109800175B (zh) | 一种基于代码插桩的以太坊智能合约重入漏洞检测方法 | |
CN112394942B (zh) | 基于云计算的分布式软件开发编译方法及软件开发平台 | |
CN109726185B (zh) | 一种基于语法树的日志解析方法、系统和计算机可读介质 | |
CN107273269B (zh) | 日志解析方法及装置 | |
CN107885501B (zh) | 获取Android中组件相互引用关系的方法及装置 | |
CN111124479B (zh) | 配置文件的解析方法、系统及电子设备 | |
CN110795069A (zh) | 代码分析方法、智能终端及计算机可读存储介质 | |
CN112948828A (zh) | 一种二进制程序恶意代码检测方法、终端设备及存储介质 | |
CN113157597A (zh) | 结构解析方法、装置、电子设备和存储介质 | |
CN113190220A (zh) | Json文件差异化对比方法及装置 | |
CN112181430A (zh) | 代码变更统计方法、装置、电子设备及存储介质 | |
CN113946516A (zh) | 代码覆盖率确定方法、装置及存储介质 | |
CN113138913A (zh) | Java代码注入检测方法、装置、设备及存储介质 | |
CN112069052A (zh) | 一种异常对象检测方法、装置、设备及存储介质 | |
CN112463596B (zh) | 测试用例数据的处理方法、装置、设备以及处理设备 | |
CN113158627A (zh) | 代码复杂度的检测方法及装置、存储介质、电子设备 | |
CN112506923A (zh) | 对应业务的方法调用链路确定方法、装置、电子设备 | |
CN113821486B (zh) | pod库之间依赖关系的确定方法及其装置、电子设备 | |
CN116069324A (zh) | 一种基于Vue的动态表单构建方法及装置 | |
CN115309661A (zh) | 一种应用测试方法、装置、电子设备及可读存储介质 | |
CN116016270A (zh) | 一种交换机测试管理方法、装置、电子设备和存储介质 | |
CN115470117A (zh) | Elf插桩的解析方法、装置、电子设备及存储介质 | |
CN116028340A (zh) | 文件生成方法及装置 | |
CN113806231A (zh) | 一种代码覆盖率分析方法、装置、设备和介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |