CN112988551B - 代码覆盖率测试方法及装置 - Google Patents
代码覆盖率测试方法及装置 Download PDFInfo
- Publication number
- CN112988551B CN112988551B CN201911272156.4A CN201911272156A CN112988551B CN 112988551 B CN112988551 B CN 112988551B CN 201911272156 A CN201911272156 A CN 201911272156A CN 112988551 B CN112988551 B CN 112988551B
- Authority
- CN
- China
- Prior art keywords
- file
- test
- code
- tested
- coverage rate
- 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.)
- Active
Links
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/3688—Test management for test execution, e.g. scheduling of test suites
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/447—Target code generation
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Software Systems (AREA)
- Debugging And Monitoring (AREA)
Abstract
本申请实施例公开了一种代码覆盖率测试方法及装置,其中,该代码覆盖率测试方法包括:获取Go语言的待测试代码文件;获取Go语言白盒覆盖率的单元测试文件;将待测试代码文件和单元测试文件放置到一个文件目录中;对待测试代码文件和单元测试文件进行编译,得到可执行文件,可执行文件中包括覆盖率埋点;启动可执行文件,输出待测试代码文件的黑盒覆盖率文件。本申请实施例中利用Go语言自带的白盒覆盖率的单元测试文件,可以得到Go语言的黑盒覆盖率,该方案利用Go语言自带功能改造实现,只需要变更部署测试流程,而不需要额外的代码,能够低成本、便捷的得到黑盒覆盖率,同时提高了测试效率。
Description
技术领域
本发明涉及通信技术领域,具体涉及一种代码覆盖率测试方法及装置。
背景技术
覆盖率是度量测试完整性的一个手段,是测试有效性的一个度量。通过已执行代码表示,用于可靠性、稳定性以及性能的评测。覆盖率测试分为白盒覆盖测试和黑盒覆盖测试,得到的覆盖率分别为白盒覆盖率和黑盒覆盖率,白盒覆盖率是指在清楚代码逻辑前提下,对于代码进行函数级别的测试而得到的覆盖率数据;黑盒覆盖率是指在完全不清楚代码逻辑的前提下,对于代码进行最外层的黑盒测试而得到的覆盖率数据。
目前Go语言覆盖率测试主要是依赖单元测试得到的白盒覆盖率,对于黑盒覆盖率并没有便捷的方法来获取。常规的方案是通过对代码进行插桩来记录代码执行信息,需要额外的插桩代码,即需要额外增加代码来记录执行信息,接入成本较高,测试效率低下。
发明内容
本申请提供一种代码覆盖率测试方法及装置,不需要额外的代码,能够低成本、便捷的得到黑盒覆盖率,同时提高了测试效率。
一方面,本申请提供一种代码覆盖率测试方法,所述代码覆盖率测试方法包括:
获取Go语言的待测试代码文件;
获取Go语言白盒覆盖率的单元测试文件;
将所述待测试代码文件和所述单元测试文件放置到一个文件目录中;
对所述待测试代码文件和所述单元测试文件进行编译,得到可执行文件,所述可执行文件中包括覆盖率埋点;
启动所述可执行文件,输出所述待测试代码文件的黑盒覆盖率文件。
在本申请一些实施例中,所述对所述待测试代码文件和所述单元测试文件进行编译,得到可执行文件,包括:
通过go test指令,对所述待测试代码文件和所述单元测试文件进行编译,得到带覆盖率埋点的可执行文件。
在本申请一些实施例中,所述启动所述可执行文件,输出所述待测试代码文件的黑盒覆盖率,包括:
通过所述单元测试文件中的单测函数启动所述待测试代码文件中后的后台服务,以执行所述待测试代码文件;
在停止测试后,通过所述单元测试文件输出所述待测试代码文件的黑盒覆盖率文件。
在本申请一些实施例中,所述单元测试文件中包括多个协程,所述多个协程中包括主协程、第一子协程和第二子协程,所述第一子协程用于启动所述待测试代码文件中的后台服务,所述第二子协程用于启动或停止所述单元测试文件的执行;
所述通过所述单元测试文件中的单测函数启动所述待测试代码文件中后的后台服务,以执行所述待测试代码文件,包括:
获取测试指令,启动所述所述单元测试文件中的主协程;
根据所述主协程启动所述第一子协程,以启动所述待测试代码文件中的后台服务;
根据所述主协程启动所述第二子协程,以启动所述单元测试文件的执行。
在本申请一些实施例中,所述在停止测试后,通过所述单元测试文件输出所述待测试代码文件的黑盒覆盖率文件,包括:
获取停止测试指令;
根据所述停止测试指令,停止所述第二子协程,以停止所述单元测试文件的执行,输出所述待测试代码文件的黑盒覆盖率文件。
在本申请一些实施例中,所述方法还包括:
将所述黑盒覆盖率文件结合所述待测试代码文件,生成可视化的覆盖率报告。
另一方面,本申请提供一种代码覆盖率测试装置,所述代码覆盖率测试装置包括:
第一获取单元,用于获取Go语言的待测试代码文件;
第二获取单元,用于获取Go语言白盒覆盖率的单元测试文件;
编译单元,用于将所述待测试代码文件和所述单元测试文件放置到一个文件目录中;对所述待测试代码文件和所述单元测试文件进行编译,得到可执行文件,所述可执行文件中包括覆盖率埋点;
测试单元,用于启动所述可执行文件,输出所述待测试代码文件的黑盒覆盖率文件。
在本申请一些实施例中,所述编译单元具体用于:
通过go test指令,对所述待测试代码文件和所述单元测试文件进行编译,得到带覆盖率埋点的可执行文件。
在本申请一些实施例中,所述测试单元具体用于:
通过所述单元测试文件中的单测函数启动所述待测试代码文件中后的后台服务,以执行所述待测试代码文件;
在停止测试后,通过所述单元测试文件输出所述待测试代码文件的黑盒覆盖率文件。
在本申请一些实施例中,所述单元测试文件中包括多个协程,所述多个协程中包括主协程、第一子协程和第二子协程,所述第一子协程用于启动所述待测试代码文件中的后台服务,所述第二子协程用于启动或停止所述单元测试文件的执行;
所述测试单元具体用于:
获取测试指令,启动所述所述单元测试文件中的主协程;
根据所述主协程启动所述第一子协程,以启动所述待测试代码文件中的后台服务;
根据所述主协程启动所述第二子协程,以启动所述单元测试文件的执行。
在本申请一些实施例中,所述测试单元具体用于:
获取停止测试指令;
根据所述停止测试指令,停止所述第二子协程,以停止所述单元测试文件的执行,输出所述待测试代码文件的黑盒覆盖率文件。
在本申请一些实施例中,所述装置还包括报告生成单元,所述报告生成单元用于:将所述黑盒覆盖率文件结合所述待测试代码文件,生成可视化的覆盖率报告。
另一方面,本申请提供一种终端设备,包括存储器和处理器,所述存储器中储存有计算机程序,所述计算机程序被所述处理器执行时,使得所述处理器执行以下步骤:
获取Go语言的待测试代码文件;
获取Go语言白盒覆盖率的单元测试文件;
将所述待测试代码文件和所述单元测试文件放置到一个文件目录中;
对所述待测试代码文件和所述单元测试文件进行编译,得到可执行文件,所述可执行文件中包括覆盖率埋点;
启动所述可执行文件,输出所述待测试代码文件的黑盒覆盖率文件。
另一方面,本申请提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器进行加载,以执行如第一方面中任一项所述的代码覆盖率测试方法中的步骤。
本申请实施例中通过获取Go语言的待测试代码文件;获取Go语言白盒覆盖率的单元测试文件;将待测试代码文件和所述单元测试文件放置到一个文件目录中;对待测试代码文件和单元测试文件进行编译,得到可执行文件,可执行文件中包括覆盖率埋点;启动可执行文件,输出待测试代码文件的黑盒覆盖率文件。本申请实施例中利用Go语言自带的白盒覆盖率的单元测试文件,可以得到Go语言的黑盒覆盖率,该方案利用Go语言自带功能改造实现,只需要变更部署测试流程,而不需要额外的代码,能够低成本、便捷的得到黑盒覆盖率,同时提高了测试效率。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例提供的代码测试系统的场景示意图;
图2是本发明实施例中提供的分布式系统100应用于区块链系统的一个可选的结构示意图;
图3是本发明实施例中提供的区块结构一个可选的示意图;
图4是本发明实施例中提供的代码覆盖率测试方法的一个实施例流程示意图;
图5是本发明实施例中提供的步骤404的一个具体实施例流程示意图;
图6是本发明实施例中提供的多个协程之间的交互示意图;
图7是本发明实施例中提供的步骤502的一个具体实施例流程示意图;
图8是本发明实施例中提供的代码覆盖率测试方法的另一个实施例流程示意图;
图9是本发明实施例中提供的代码覆盖率测试装置的一个实施例结构示意图;
图10是本发明实施例提供的终端设备的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
在以下的说明中,本发明的具体实施例将参考由一部或多部计算机所执行的步骤及符号来说明,除非另有说明。因此,这些步骤及操作将有数次提到由计算机执行,本文所指的计算机执行包括了由代表了以一结构化型式中的数据的电子信号的计算机处理单元的操作。此操作转换该数据或将其维持在该计算机的内存系统中的位置处,其可重新配置或另外以本领域测试人员所熟知的方式来改变该计算机的运作。该数据所维持的数据结构为该内存的实体位置,其具有由该数据格式所定义的特定特性。但是,本发明原理以上述文字来说明,其并不代表为一种限制,本领域测试人员将可了解到以下所述的多种步骤及操作亦可实施在硬件当中。
本文所使用的术语“模块”或“单元”可看做为在该运算系统上执行的软件对象。本文所述的不同组件、模块、引擎及服务可看做为在该运算系统上的实施对象。而本文所述的装置及方法优选的以软件的方式进行实施,当然也可在硬件上进行实施,均在本发明保护范围之内。
本技术领域技术人员可以理解,除非特意声明,这里使用的单数形式“一”、“一个”、“所述”和“该”也可包括复数形式。应该进一步理解的是,本发明的说明书中使用的措辞“包括”是指存在所述特征、整数、步骤、操作、元件和/或组件,但是并不排除存在或添加一个或多个其他特征、整数、步骤、操作、元件、组件和/或它们的组。应该理解,当我们称元件被“连接”或“耦接”到另一元件时,它可以直接连接或耦接到其他元件,或者也可以存在中间元件。此外,这里使用的“连接”或“耦接”可以包括无线连接或无线耦接。这里使用的措辞“和/或”包括一个或更多个相关联的列出项的全部或任一单元和全部组合。
下面首先对本发明实施例中涉及到的一些基本概念进行介绍:
Go语言:
Go(又称Golang)是Google的Robert Griesemer,Rob Pike及Ken Thompson开发的一种静态强类型、编译型语言。Go语言语法与C相近,但功能上有:内存安全,GC(垃圾回收),结构形态及CSP-style并发计算。Go的语法接近C语言,但对于变量的声明有所不同。Go支持垃圾回收功能。Go的并行模型是以东尼·霍尔的通信顺序进程(CSP)为基础,采取类似模型的其他语言包括Occam和Limbo,但它也具有Pi运算的特征,比如通道传输。在1.8版本中开放插件(Plugin)的支持,这意味着现在能从Go中动态加载部分函数。与C++相比,Go并不包括如枚举、异常处理、继承、泛型、断言、虚函数等功能,但增加了切片(Slice)型、并发、管道、垃圾回收、接口(Interface)等特性的语言级支持,Go 2.0版本将支持泛型,对于断言的存在,则持负面态度,同时也为自己不提供类型继承来辩护。
协程:
协程与子例程一样,协程(coroutine)也是一种程序组件。相对子例程而言,协程更为一般和灵活,但在实践中使用没有子例程那样广泛。协程源自Simula和Modula-2语言,但也有其他语言支持。协程更适合于用来实现彼此熟悉的程序组件,如合作式多任务,迭代器,无限列表和管道。协程最初在1963年被提出。协程不是进程或线程,其执行过程更类似于子例程,或者说不带返回值的函数调用。一个程序可以包含多个协程,可以对比与一个进程包含多个线程,因而下面我们来比较协程和线程。我们知道多个线程相对独立,有自己的上下文,切换受系统控制;而协程也相对独立,有自己的上下文,但是其切换由自己控制,由当前协程切换到其他协程由当前协程来控制。
黑盒测试:
也称功能测试,它是通过测试来检测每个功能是否都能正常使用。在测试中,把程序看作一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下,在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数据而产生正确的输出信息。黑盒测试着眼于程序外部结构,不考虑内部逻辑结构,主要针对软件界面和软件功能进行测试。黑盒测试是以用户的角度,从输入数据与输出数据的对应关系出发进行测试的。很明显,如果外部特性本身设计有问题或规格说明的规定有误,用黑盒测试方法是发现不了的。
白盒覆盖率:
是指在清楚代码逻辑前提下,对于代码进行函数级别的测试而得到的覆盖率数据;
黑盒覆盖率:
是指在完全不清楚代码逻辑的前提下,对于代码进行最外层的黑盒测试而得到的覆盖率数据。
本发明实施例提供一种代码覆盖率测试方法及装置。
人工智能(Artificial Intelligence,AI)是利用数字计算机或者数字计算机控制的机器模拟、延伸和扩展人的智能,感知环境、获取知识并使用知识获得最佳结果的理论、方法、技术及应用系统。换句话说,人工智能是计算机科学的一个综合技术,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器。人工智能也就是研究各种智能机器的设计原理与实现方法,使机器具有感知、推理与决策的功能。
人工智能技术是一门综合学科,涉及领域广泛,既有硬件层面的技术也有软件层面的技术。人工智能基础技术一般包括如传感器、专用人工智能芯片、云计算、分布式存储、大数据处理技术、操作/交互系统、机电一体化等技术。人工智能软件技术主要包括计算机视觉技术、语音处理技术、自然语言处理技术以及机器学习/深度学习等几大方向。
计算机视觉技术(Computer Vision,CV)计算机视觉是一门研究如何使机器“看”的科学,更进一步的说,就是指用摄影机和电脑代替人眼对目标进行识别、跟踪和测量等机器视觉,并进一步做图形处理,使电脑处理成为更适合人眼观察或传送给仪器检测的图像。作为一个科学学科,计算机视觉研究相关的理论和技术,试图建立能够从图像或者多维数据中获取信息的人工智能系统。计算机视觉技术通常包括图像处理、图像识别、图像语义理解、图像检索、OCR、视频处理、视频语义理解、视频内容/行为识别、三维物体重建、3D技术、虚拟现实、增强现实、同步定位与地图构建等技术,还包括常见的人脸识别、指纹识别等生物特征识别技术。
本申请实施例提供的方案可以是涉及人工智能的代码覆盖率测试方法,即本申请实施例中提供一种基于人工智能的代码覆盖率测试的方法,该方法包括:获取Go语言的待测试代码文件;获取Go语言白盒覆盖率的单元测试文件;将所述待测试代码文件和所述单元测试文件放置到一个文件目录中;对所述待测试代码文件和所述单元测试文件进行编译,得到可执行文件,所述可执行文件中包括覆盖率埋点;启动所述可执行文件,输出所述待测试代码文件的黑盒覆盖率文件。
请参阅图1,图1为本发明实施例所提供的代码测试系统的场景示意图,该代码测试系统可以包括终端设备10,终端设备10中集成有代码覆盖率测试装置,如图1中的终端设备。
本发明实施例中终端设备10主要用于获取Go语言的待测试代码文件;获取Go语言白盒覆盖率的单元测试文件;将所述待测试代码文件和所述单元测试文件放置到一个文件目录中;对所述待测试代码文件和所述单元测试文件进行编译,得到可执行文件,所述可执行文件中包括覆盖率埋点;启动所述可执行文件,输出所述待测试代码文件的黑盒覆盖率文件。
本发明实施例中,该终端设备10可以是独立的服务器,也可以是服务器组成的服务器网络或服务器集群,例如,本发明实施例中所描述的终端设备10,其包括但不限于计算机、网络主机、单个网络服务器、多个网络服务器集或多个服务器构成的云服务器。其中,云服务器由基于云计算(Cloud Computing)的大量计算机或网络服务器构成。
本领域技术人员可以理解,图1中示出的应用环境,仅仅是与本申请方案一种应用场景,并不构成对本申请方案应用场景的限定,其他的应用环境还可以包括比图1中所示更多或更少的终端设备,例如图1中仅示出1个终端设备,可以理解的,该代码测试系统还可以包括一个或多个其他服务,具体此处不作限定。
另外,如图1所示,该代码测试系统还可以包括存储器20,用于存储数据,如代码数据等,具体的,如本发明实施例中Go语言白盒覆盖率的单元测试文件。
需要说明的是,图1所示的代码测试系统的场景示意图仅仅是一个示例,本发明实施例描述的代码测试系统以及场景是为了更加清楚的说明本发明实施例的技术方案,并不构成对于本发明实施例提供的技术方案的限定,本领域普通技术人员可知,随着代码测试系统的演变和新业务场景的出现,本发明实施例提供的技术方案对于类似的技术问题,同样适用。
本发明实施例涉及的代码测试系统可以是由多个节点(接入网络中的任意形式的计算设备,如终端设备10等)通过网络通信的形式连接形成的分布式系统。
以分布式系统为区块链系统为例,参见图2,图2是本发明实施例提供的分布式系统100应用于区块链系统的一个可选的结构示意图,由多个节点(接入网络中的任意形式的计算设备,如服务器、用户终端)和客户端形成,节点之间形成组成的点对点(P2P,Peer ToPeer)网络,P2P协议是一个运行在传输控制协议(TCP,Transmission Control Protocol)协议之上的应用层协议。在分布式系统中,任何机器如服务器、终端都可以加入而成为节点,节点包括硬件层、中间层、操作系统层和应用层。本发明实施例中终端设备10可以为区块链系统中的一个节点。
参见图2示出的区块链系统中各节点的功能,涉及的功能包括:
1)路由,节点具有的基本功能,用于支持节点之间的通信。
节点除具有路由功能外,还可以具有以下功能:
2)应用,用于部署在区块链中,根据实际业务需求而实现特定业务,记录实现功能相关的数据形成记录数据,在记录数据中携带数字签名以表示任务数据的来源,将记录数据发送到区块链系统中的其他节点,供其他节点在验证记录数据来源以及完整性成功时,将记录数据添加到临时区块中。
例如,应用实现的业务包括:
2.1)钱包,用于提供进行电子货币的交易的功能,包括发起交易(即,将当前交易的交易记录发送给区块链系统中的其他节点,其他节点验证成功后,作为承认交易有效的响应,将交易的记录数据存入区块链的临时区块中;当然,钱包还支持查询电子货币地址中剩余的电子货币;
2.2)共享账本,用于提供账目数据的存储、查询和修改等操作的功能,将对账目数据的操作的记录数据发送到区块链系统中的其他节点,其他节点验证有效后,作为承认账目数据有效的响应,将记录数据存入临时区块中,还可以向发起操作的节点发送确认。
2.3)智能合约,计算机化的协议,可以执行某个合约的条款,通过部署在共享账本上的用于在满足一定条件时而执行的代码实现,根据实际的业务需求代码用于完成自动化的交易,例如查询买家所购买商品的物流状态,在买家签收货物后将买家的电子货币转移到商户的地址;当然,智能合约不仅限于执行用于交易的合约,还可以执行对接收的信息进行处理的合约。
3)区块链,包括一系列按照产生的先后时间顺序相互接续的区块(Block),新区块一旦加入到区块链中就不会再被移除,区块中记录了区块链系统中节点提交的记录数据。
参见图3,图3是本发明实施例提供的区块结构(Block Structure)一个可选的示意图,每个区块中包括本区块存储交易记录的哈希值(本区块的哈希值)、以及前一区块的哈希值,各区块通过哈希值连接形成区块链。另外,区块中还可以包括有区块生成时的时间戳等信息。区块链(Blockchain),本质上是一个去中心化的数据库,是一串使用密码学方法相关联产生的数据块,每一个数据块中包含了相关的信息,用于验证其信息的有效性(防伪)和生成下一个区块。本发明实施例中的数据均可以以区块的形式存储在区块链中,例如Go语言的待测试代码文件或Go语言白盒覆盖率的单元测试文件等。
下面结合具体实施例进行详细说明。
在本实施例中,将从代码覆盖率测试装置的角度进行描述,该代码覆盖率测试装置具体可以集成在服务器200中。
本发明提供一种代码覆盖率测试方法,该代码覆盖率测试方法包括:获取Go语言的待测试代码文件;获取Go语言白盒覆盖率的单元测试文件;对所述待测试代码文件和所述单元测试文件进行编译,得到可执行文件,所述可执行文件中包括覆盖率埋点;启动所述可执行文件,输出所述待测试代码文件的黑盒覆盖率文件。
请参阅图4,为本发明实施例中本发明实施例中代码覆盖率测试方法的一个实施例流程示意图,该代码覆盖率测试方法包括:
401、获取Go语言的待测试代码文件。
具体的,在对Go语言代码测试之前,会先获取Go语言的待测试代码文件,例如,main.go文件
402、获取Go语言白盒覆盖率的单元测试文件。
Go语言拥有一套单元测试和性能测试系统,仅需要添加很少的代码就可以快速测试一段需求代码。要开始一个Go语言单元测试,需要准备一个go源码文件,在命名文件时需要让文件必须以_test结尾。默认的情况下,go test命令不需要任何的参数,它会自动把你源码包下面所有test文件测试完毕,当然也可以带上参数。
Go语言自带的单元测试方法,采用Go语言白盒覆盖率的单元测试文件(例如main_test.go),能够获取根据单元测试(简称单测)运行后的白盒覆盖率测试数据。Go语言单测时,可以编译生成带有覆盖率埋点的可执行文件,在单测运行过程中记录代码行的执行次数,最后单测运行完毕后输出代码行的执行次数,也就是白盒覆盖率数据。上述为Go语言的白盒覆盖率测试方法,本发明实施例中,可以利用该Go语言特性来实现黑盒覆盖率测试。
另外,本发明实施例中,单元测试文件可以由一个或多个测试用例组成,每个测试用例函数都需要以Test为前缀,例如:func TestXXX(t*testing.T),如main_test.go等。其中,测试用例文件不会参与正常源码编译,不会被包含到可执行文件中;测试用例文件使用go test指令来执行,没有也不需要main()作为函数入口;所有在以_test结尾的源码内以Test开头的函数会自动被执行;测试用例可以不传入*testing.T参数。
403、将所述待测试代码文件和所述单元测试文件放置到一个文件目录中。
例如,待测试代码文件为main.go,单元测试文件为main_test.go,将待测试代码文件main.go和单元测试文件main_test.go放在一个文件目录A中。
404、对所述待测试代码文件和所述单元测试文件进行编译,得到可执行文件,所述可执行文件中包括覆盖率埋点。
本发明实施例中,所述对所述待测试代码文件和所述单元测试文件进行编译,得到可执行文件,可以包括:通过go test指令,对所述待测试代码文件和所述单元测试文件进行编译,得到带覆盖率埋点的可执行文件。具体,在对所述待测试代码文件和所述单元测试文件进行编译时,go test命令,会自动读取源码目录下面名为*_test.go(例如main_test.go)的文件,生成并运行测试用的可执行文件。
所谓“埋点”,是数据采集领域(尤其是用户行为数据采集领域)的术语,指的是针对特定用户行为或事件进行捕获、处理和发送的相关技术及其实施过程。比如用户某个icon点击次数、观看某个视频的时长等等。埋点的技术实质,是先监听代码应用运行过程中的事件,当需要关注的事件发生时进行判断和捕获。本发明实施例中,可执行文件中包括可以采集覆盖率的埋点。
405、启动所述可执行文件,输出所述待测试代码文件的黑盒覆盖率文件。
本申请实施例中通过获取Go语言的待测试代码文件;获取Go语言白盒覆盖率的单元测试文件;将所述待测试代码文件和所述单元测试文件放置到一个文件目录中;对待测试代码文件和单元测试文件进行编译,得到可执行文件,可执行文件中包括覆盖率埋点;启动可执行文件,输出待测试代码文件的黑盒覆盖率文件。本申请实施例中利用Go语言自带的白盒覆盖率的单元测试文件,可以得到Go语言的黑盒覆盖率,该方案利用Go语言自带功能改造实现,只需要变更部署测试流程,而不需要额外的代码,能够低成本、便捷的得到黑盒覆盖率,同时提高了测试效率。
在本发明一些实施例中,如图5所示,上述步骤404中所述启动所述可执行文件,输出所述待测试代码文件的黑盒覆盖率,可以包括:
501、通过所述单元测试文件中的单测函数启动所述待测试代码文件中后的后台服务,以执行所述待测试代码文件。
Go语言单测的入口函数是各个单测函数,通过单测函数能够调用Go服务内的任意函数。所以使用单元测试文件main_test.go的单测函数,可以调用待测试代码文件main.go中的main()函数,从而启动待测试代码文件的后台服务。
502、在停止测试后,通过所述单元测试文件输出所述待测试代码文件的黑盒覆盖率文件。
现有的Go语言后台服务功能为持续监听各种请求,所以设计为常驻的服务形式,不会主动的停止服务。但单测的覆盖率报告只有在停止单测时才会生成,利用Go语言主协程停止后,子协程会同步停止的特性,单元测试文件main_test.go内需要多个协程交互,一个协程用以启动main()函数,一个协程用以监听停止指令,主协程用以循环等待停止指令。
具体的,在本申请一些实施例中,如图6所示,所述单元测试文件中可以包括多个协程,所述多个协程中包括主协程、第一子协程和第二子协程,所述第一子协程用于启动所述待测试代码文件中的后台服务,所述第二子协程用于监听测试指令或停止测试命令,该测试指令或停止测试指令可以是http指令,启动或停止所述单元测试文件的执行;此时,如图7所示,在开始测试时,所述通过所述单元测试文件中的单测函数启动所述待测试代码文件中后的后台服务,以执行所述待测试代码文件,可以包括:
701、获取测试指令,启动所述所述单元测试文件中的主协程。
702、根据所述主协程启动所述第一子协程,以启动所述待测试代码文件中的后台服务。
703、根据所述主协程启动所述第二子协程,以启动所述单元测试文件的执行。
在停止测试后,是通过接收停止测试指令来停止的,具体的,所述在停止测试后,通过所述单元测试文件输出所述待测试代码文件的黑盒覆盖率文件,包括:获取停止测试指令;根据所述停止测试指令,停止所述第二子协程,以停止所述单元测试文件的执行,输出所述待测试代码文件的黑盒覆盖率文件。
为了便于更好的查阅覆盖率,在本申请一些实施例中,所述方法还包括:将所述黑盒覆盖率文件结合所述待测试代码文件,生成可视化的覆盖率报告。具体的,可以通过如下代码:go tool cover-html=coverage.cov-o cov.html将所述黑盒覆盖率文件结合所述待测试代码文件,生成可视化的覆盖率报告。
下面结合一具体应用场景对本发明实施例中代码覆盖率测试方法进行描述。
请参阅图8,为本发明实施例中代码覆盖率测试方的另一个实施例流程示意图,该代码覆盖率测试方法包括:
801、获取Go语言的待测试代码文件main.go。
802、获取Go语言白盒覆盖率的单元测试文件main_test.go。
803、将待测试代码文件件main.go和单元测试文件main_test.go放置到一个文件目录A中。
804、通过go test指令,对所述待测试代码文件main.go和所述单元测试文件main_test.go进行编译,得到可执行文件。
具体的,采用如下方式编译:go test-c-cover=1-covermode=count-coverpkg=./。
805、启动所述可执行文件,输出所述待测试代码文件的黑盒覆盖率文件。
具体的,获取测试指令之后,将待测试代码文件main.go和单元测试文件main_test.go放在一个文件目录A中,启动main_test.go中的主协程,根据所述主协程启动所述第一子协程,以启动所述待测试代码文件main.go中的后台服务,根据所述主协程启动所述第二子协程,以启动所述单元测试文件main_test.go的执行。
在停止测试后,是通过接收停止测试指令来停止的,具体的,获取停止测试指令;根据所述停止测试指令,停止所述第二子协程,以停止所述单元测试文件main_test.go的执行,输出所述待测试代码文件main.go的黑盒覆盖率文件。
具体的,根据所述停止测试指令,停止所述第二子协程,以停止所述单元测试文件main_test.go的执行,输出所述待测试代码文件main.go的黑盒覆盖率文件可以采用如下代码实现:curl http://127.0.0.1:12325/covertest?status=finish。
806、将所述黑盒覆盖率文件结合所述待测试代码文件,生成可视化的覆盖率报告。
为了便于更好的查阅覆盖率,在本申请一些实施例中,可以将所述黑盒覆盖率文件结合所述待测试代码文件,生成可视化的覆盖率报告。具体的,可以通过如下代码:gotool cover-html=coverage.cov-o cov.html将所述黑盒覆盖率文件结合所述待测试代码文件,生成可视化的覆盖率报告。
为便于更好的实施本发明实施例提供的代码覆盖率测试方法,本发明实施例还提供一种基于上述代码覆盖率测试方法的装置。其中名词的含义与上述代码覆盖率测试方法中相同,具体实现细节可以参考方法实施例中的说明。
请参阅图9,图9为本发明实施例提供的代码覆盖率测试装置的结构示意图,其中该代码覆盖率测试装置900可以包括第一获取单元901、第二获取单元902、编译单元903和测试单元904,其中:
第一获取单元901,用于获取Go语言的待测试代码文件;
第二获取单元902,用于获取Go语言白盒覆盖率的单元测试文件;
编译单元903,用于将所述待测试代码文件和所述单元测试文件放置到一个文件目录中;对所述待测试代码文件和所述单元测试文件进行编译,得到可执行文件,所述可执行文件中包括覆盖率埋点;
测试单元904,用于启动所述可执行文件,输出所述待测试代码文件的黑盒覆盖率文件。
在本申请一些实施例中,所述编译单元903具体用于:
通过go test指令,对所述待测试代码文件和所述单元测试文件进行编译,得到带覆盖率埋点的可执行文件。
在本申请一些实施例中,所述测试单元904具体用于:
通过所述单元测试文件中的单测函数启动所述待测试代码文件中后的后台服务,以执行所述待测试代码文件;
在停止测试后,通过所述单元测试文件输出所述待测试代码文件的黑盒覆盖率文件。
在本申请一些实施例中,所述单元测试文件中包括多个协程,所述多个协程中包括主协程、第一子协程和第二子协程,所述第一子协程用于启动所述待测试代码文件中的后台服务,所述第二子协程用于启动或停止所述单元测试文件的执行;
所述测试单元904具体用于:
获取测试指令,启动所述所述单元测试文件中的主协程;
根据所述主协程启动所述第一子协程,以启动所述待测试代码文件中的后台服务;
根据所述主协程启动所述第二子协程,以启动所述单元测试文件的执行。
在本申请一些实施例中,所述测试单元904具体用于:
获取停止测试指令;
根据所述停止测试指令,停止所述第二子协程,以停止所述单元测试文件的执行,输出所述待测试代码文件的黑盒覆盖率文件。
在本申请一些实施例中,所述装置还包括报告生成单元,所述报告生成单元用于:将所述黑盒覆盖率文件结合所述待测试代码文件,生成可视化的覆盖率报告。
本申请实施例中通过获取Go语言的待测试代码文件;获取Go语言白盒覆盖率的单元测试文件;将所述待测试代码文件和所述单元测试文件放置到一个文件目录中;对待测试代码文件和单元测试文件进行编译,得到可执行文件,可执行文件中包括覆盖率埋点;启动可执行文件,输出待测试代码文件的黑盒覆盖率文件。本申请实施例中利用Go语言自带的白盒覆盖率的单元测试文件,可以得到Go语言的黑盒覆盖率,该方案利用Go语言自带功能改造实现,只需要变更部署测试流程,而不需要额外的代码,能够低成本、便捷的得到黑盒覆盖率,同时提高了测试效率。
本发明实施例还提供一种终端设备,如图10所示,其示出了本发明实施例所涉及的终端设备的结构示意图,具体来讲:
该终端设备可以包括一个或者一个以上处理核心的处理器1001、一个或一个以上计算机可读存储介质的存储器1002、电源1003和输入单元1004等部件。本领域技术人员可以理解,图10中示出的终端设备结构并不构成对终端设备的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。其中:
处理器1001是该终端设备的控制中心,利用各种接口和线路连接整个终端设备的各个部分,通过运行或执行存储在存储器1002内的软件程序和/或模块,以及调用存储在存储器1002内的数据,执行终端设备的各种功能和处理数据。可选的,处理器1001可包括一个或多个处理核心;优选的,处理器1001可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作存储介质、用户界面和应用程序等,调制解调处理器主要处理无线通信。可以理解的是,上述调制解调处理器也可以不集成到处理器1001中。
存储器1002可用于存储软件程序以及模块,处理器1001通过运行存储在存储器1002的软件程序以及模块,从而执行各种功能应用以及数据处理。存储器1002可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作存储介质、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据终端设备的使用所创建的数据等。此外,存储器1002可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。相应地,存储器1002还可以包括存储器控制器,以提供处理器1001对存储器1002的访问。
终端设备还包括给各个部件供电的电源1003,优选的,电源1003可以通过电源管理存储介质与处理器1001逻辑相连,从而通过电源管理存储介质实现管理充电、放电、以及功耗管理等功能。电源1003还可以包括一个或一个以上的直流或交流电源、再充电存储介质、电源故障检测电路、电源转换器或者逆变器、电源状态指示器等任意组件。
该终端设备还可包括输入单元1004,该输入单元1004可用于接收输入的数字或字符信息,以及产生与用户设置以及功能控制有关的键盘、鼠标、操作杆、光学或者轨迹球信号输入。
尽管未示出,终端设备还可以包括显示单元等,在此不再赘述。具体在本实施例中,终端设备中的处理器1001会按照如下的指令,将一个或一个以上的应用程序的进程对应的可执行文件加载到存储器1002中,并由处理器1001来运行存储在存储器1002中的应用程序,从而实现各种功能,如下:
获取Go语言的待测试代码文件;
获取Go语言白盒覆盖率的单元测试文件;
将所述待测试代码文件和所述单元测试文件放置到一个文件目录中;
对所述待测试代码文件和所述单元测试文件进行编译,得到可执行文件,所述可执行文件中包括覆盖率埋点;
启动所述可执行文件,输出所述待测试代码文件的黑盒覆盖率文件。
本领域普通技术人员可以理解,上述实施例的各种方法中的全部或部分步骤可以通过指令来完成,或通过指令控制相关的硬件来完成,该指令可以存储于一计算机可读存储介质中,并由处理器进行加载和执行。
为此,本发明实施例提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器进行加载,以执行本发明实施例所提供的任一种代码覆盖率测试方法中的步骤。例如,所述计算机程序被处理器进行加载可以执行如下步骤:
获取Go语言的待测试代码文件;
获取Go语言白盒覆盖率的单元测试文件;
将所述待测试代码文件和所述单元测试文件放置到一个文件目录中;
对所述待测试代码文件和所述单元测试文件进行编译,得到可执行文件,所述可执行文件中包括覆盖率埋点;
启动所述可执行文件,输出所述待测试代码文件的黑盒覆盖率文件。
以上各个操作的具体实施可参见前面的实施例,在此不再赘述。
其中,该计算机可读存储介质可以包括:只读存储器(ROM,Read Only Memory)、随机存取记忆体(RAM,Random Access Memory)、磁盘或光盘等。
由于该计算机可读存储介质中所存储的计算机程序,可以执行本发明实施例所提供的任一种代码覆盖率测试方法中的步骤,因此,可以实现本发明实施例所提供的任一种代码覆盖率测试方法所能实现的有益效果,详见前面的实施例,在此不再赘述。
以上对本发明实施例所提供的一种代码覆盖率测试方法及装置进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。
Claims (7)
1.一种代码覆盖率测试方法,其特征在于,所述代码覆盖率测试方法包括:
获取Go语言的待测试代码文件;
获取Go语言白盒覆盖率的单元测试文件,所述单元测试文件中包括多个协程,所述多个协程中包括主协程、第一子协程和第二子协程,所述第一子协程用于启动所述待测试代码文件中的后台服务,所述第二子协程用于启动或停止所述单元测试文件的执行;
将所述待测试代码文件和所述单元测试文件放置到一个文件目录中;
对所述待测试代码文件和所述单元测试文件进行编译,得到可执行文件,所述可执行文件中包括覆盖率埋点;
获取测试指令,启动所述单元测试文件中的主协程;
根据所述主协程启动所述第一子协程,以启动所述待测试代码文件中的后台服务;
根据所述主协程启动所述第二子协程,以启动所述单元测试文件的执行;
在停止测试后,通过所述单元测试文件输出所述待测试代码文件的黑盒覆盖率文件。
2.根据权利要求1所述的代码覆盖率测试方法,其特征在于,所述对所述待测试代码文件和所述单元测试文件进行编译,得到可执行文件,包括:
通过go test指令,对所述待测试代码文件和所述单元测试文件进行编译,得到带覆盖率埋点的可执行文件。
3.根据权利要求1所述的代码覆盖率测试方法,其特征在于,所述在停止测试后,通过所述单元测试文件输出所述待测试代码文件的黑盒覆盖率文件,包括:
获取停止测试指令;
根据所述停止测试指令,停止所述第二子协程,以停止所述单元测试文件的执行,输出所述待测试代码文件的黑盒覆盖率文件。
4.根据权利要求1至3中任一所述的代码覆盖率测试方法,其特征在于,所述方法还包括:
将所述黑盒覆盖率文件结合所述待测试代码文件,生成可视化的覆盖率报告。
5.一种代码覆盖率测试装置,其特征在于,所述代码覆盖率测试装置包括:
第一获取单元,用于获取Go语言的待测试代码文件;
第二获取单元,用于获取Go语言白盒覆盖率的单元测试文件,所述单元测试文件中包括多个协程,所述多个协程中包括主协程、第一子协程和第二子协程,所述第一子协程用于启动所述待测试代码文件中的后台服务,所述第二子协程用于启动或停止所述单元测试文件的执行;
编译单元,用于将所述待测试代码文件和所述单元测试文件放置到一个文件目录中;对所述待测试代码文件和所述单元测试文件进行编译,得到可执行文件,所述可执行文件中包括覆盖率埋点;
测试单元,用于获取测试指令,启动所述单元测试文件中的主协程;根据所述主协程启动所述第一子协程,以启动所述待测试代码文件中的后台服务;根据所述主协程启动所述第二子协程,以启动所述单元测试文件的执行;在停止测试后,通过所述单元测试文件输出所述待测试代码文件的黑盒覆盖率文件。
6.根据权利要求5所述的代码覆盖率测试装置,其特征在于,所述编译单元具体用于:
通过go test指令,对所述待测试代码文件和所述单元测试文件进行编译,得到带覆盖率埋点的可执行文件。
7.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器进行加载,以执行权利要求1至4任一项所述的代码覆盖率测试方法中的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911272156.4A CN112988551B (zh) | 2019-12-12 | 2019-12-12 | 代码覆盖率测试方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911272156.4A CN112988551B (zh) | 2019-12-12 | 2019-12-12 | 代码覆盖率测试方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112988551A CN112988551A (zh) | 2021-06-18 |
CN112988551B true CN112988551B (zh) | 2023-09-26 |
Family
ID=76331547
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201911272156.4A Active CN112988551B (zh) | 2019-12-12 | 2019-12-12 | 代码覆盖率测试方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112988551B (zh) |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1983209A (zh) * | 2005-12-14 | 2007-06-20 | 中兴通讯股份有限公司 | 一种软件单元测试自动化系统及其方法 |
CN106776338A (zh) * | 2016-12-30 | 2017-05-31 | 北京金山安全软件有限公司 | 一种测试方法、装置及服务器 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10437714B2 (en) * | 2017-01-25 | 2019-10-08 | Wipro Limited | System and method for performing script-less unit testing |
-
2019
- 2019-12-12 CN CN201911272156.4A patent/CN112988551B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1983209A (zh) * | 2005-12-14 | 2007-06-20 | 中兴通讯股份有限公司 | 一种软件单元测试自动化系统及其方法 |
CN106776338A (zh) * | 2016-12-30 | 2017-05-31 | 北京金山安全软件有限公司 | 一种测试方法、装置及服务器 |
Also Published As
Publication number | Publication date |
---|---|
CN112988551A (zh) | 2021-06-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109951547B (zh) | 事务请求并行处理方法、装置、设备和介质 | |
CN108427644A (zh) | 服务测试方法、服务测试系统及服务测试装置 | |
CN107133174A (zh) | 测试用例代码自动生成装置与方法 | |
CN109614093B (zh) | 可视化智能合约系统以及智能合约的处理方法 | |
CN107391142A (zh) | 一种应用拆分的方法及装置 | |
CN110968437A (zh) | 一种基于Java智能合约的单个合约并行执行的方法、装置、设备及介质 | |
CN111049878A (zh) | 微服务调用链具象化的方法、装置、电子装置及存储介质 | |
CN114692823A (zh) | 一种算子融合的方法、装置、存储介质及电子设备 | |
CN114217887A (zh) | 微服务编排方法、执行方法、装置及服务器 | |
CN109271160A (zh) | 活动规则组建方法、装置和计算机系统、介质 | |
CN114398194A (zh) | 数据收集方法、装置、电子设备及可读存储介质 | |
CN107704568A (zh) | 一种测试数据添加的方法及装置 | |
CN106201859A (zh) | 一种回归测试方法及系统 | |
CN107566334A (zh) | 一种基于代理实现的配电终端安全监测方法及装置 | |
CN112988551B (zh) | 代码覆盖率测试方法及装置 | |
CN109614271A (zh) | 多个集群数据一致性的控制方法、装置、设备及存储介质 | |
US20090112704A1 (en) | Management tool for efficient allocation of skills and resources | |
CN116932147A (zh) | 流式作业处理方法、装置、电子设备及介质 | |
CN115712571A (zh) | 一种交互服务测试、装置、计算机设备及存储介质 | |
CN115328786A (zh) | 一种基于区块链的自动化测试方法、装置和存储介质 | |
CN110083351A (zh) | 用于生成代码的方法和装置 | |
CN115048294A (zh) | 测试执行方法和装置、存储介质及电子设备 | |
CN104572649B (zh) | 分布式存储系统的数据的处理方法、装置及系统 | |
CN113590112A (zh) | 工业ai项目开发平台 | |
CN114546793A (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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |