CN117520191B - 一种基于程序路径的测试完备性检查方法、设备及存储介质 - Google Patents
一种基于程序路径的测试完备性检查方法、设备及存储介质 Download PDFInfo
- Publication number
- CN117520191B CN117520191B CN202311590080.6A CN202311590080A CN117520191B CN 117520191 B CN117520191 B CN 117520191B CN 202311590080 A CN202311590080 A CN 202311590080A CN 117520191 B CN117520191 B CN 117520191B
- Authority
- CN
- China
- Prior art keywords
- program
- test
- path
- control flow
- flow chart
- 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
- 238000012360 testing method Methods 0.000 title claims abstract description 73
- 238000000034 method Methods 0.000 title claims abstract description 40
- 238000012545 processing Methods 0.000 claims abstract description 13
- 230000003068 static effect Effects 0.000 claims description 21
- 230000006870 function Effects 0.000 claims description 9
- 238000003780 insertion Methods 0.000 claims description 7
- 230000037431 insertion Effects 0.000 claims description 7
- 238000004590 computer program Methods 0.000 claims description 6
- 238000010586 diagram Methods 0.000 claims description 5
- 238000013507 mapping Methods 0.000 claims description 2
- 230000000295 complement effect Effects 0.000 abstract description 5
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000004422 calculation algorithm Methods 0.000 description 1
- 238000004364 calculation method Methods 0.000 description 1
- 230000006835 compression Effects 0.000 description 1
- 230000014509 gene expression Effects 0.000 description 1
- 230000010354 integration Effects 0.000 description 1
- 238000005457 optimization Methods 0.000 description 1
- 239000013589 supplement Substances 0.000 description 1
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/362—Software debugging
- G06F11/3644—Software debugging by instrumenting at runtime
-
- 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/368—Test management for test version control, e.g. updating test cases to a new software version
-
- 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
-
- 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
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
技术领域
本发明涉及计算机软件测试分析技术领域,具体涉及一种基于程序路径的测试完备性检查方法、设备及存储介质。
背景技术
传统软件工程中,集成测试阶段大多利用事先定义好的软件需求来撰写测试用例,通过输入测试用例数据来验证软件的正确性以及用例的完备性。但是,在现实中一个较为复杂的程序,所面临的自然环境,操作者的知识水平等因素是复杂多变的。人为撰写的用例很多时候,存在着一定的局限性,并不能很好地考虑或覆盖这些复杂多变的影响测试的因素。
针对这种情况,本申请提出一种基于程序路径覆盖来检查测试用例完备性,通过静态程序路径同动态执行路径的比对,能够快速获得某些未覆盖的程序路径所对应的测试场景,从而很好的反馈测试用例设计人员补足对应的测试用例数据。利用计算机来处理庞大的程序数据,大大减少人为因素的局限性。
发明内容
本发明旨在提供一种结构化的方法,通过分析当前测试用例集执行被测对象程序后,计算得到未覆盖的路径集合数据,从而辅助测试人员(程序开发人员)更加便捷的察觉到某些未测试场景的存在,并进一步描述这些测试场景,补充完善测试用例集合,直至不再存在有未测试场景。
根据本发明的第一方面,提出了一种基于程序路径的测试完备性检查方法,包括如下步骤:
步骤(1),分析程序AST结构,创建相应的程序控制流程图;
步骤(2),基于步骤(1)中得到的程序控制流程图,裁剪压缩程序控制流程图数据;
步骤(3),遍历控制流程图中程序基本块,逐个插桩加入桩点数据;
步骤(4),输入测试用例数据集并执行步骤(3)已插桩处理后的测试对象程序;收集并暂存程序运行过程中的桩点数据流信息;
步骤(5),遍历步骤(2)中得到的程序控制流程图,计算分析静态程序路径;
步骤(6),还原步骤(4)中桩点数据流信息数据,结合步骤(2)中得到的程序控制流程图,得到动态执行路径;
步骤(7),利用步骤(5)中得到的静态程序路径以及步骤(6)中得到的动态流程图,计算出该测试用例集中未覆盖的程序路径。
根据本发明的第二方面,提出了一种基于程序路径的测试完备性检查设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其中,所述处理器执行所述程序时实现上述所述的基于程序路径的测试完备性检查方法。
根据本发明的第三方面,提出了一种计算机可读存储介质,所述存储介质存储有计算机程序,所述计算机程序用于执行上述所述的基于程序路径的测试完备性检查方法。
本发明有益效果:
采用本发明的方法,利用结构化的程序路径信息可以形象的来描述实验室阶段或现实环境中未曾测试或始料未及的测试场景组合。
通过统计未覆盖路径集合,定量化地给出了测试结果的反馈,并且可以很好的帮助测试设计人员或开发人员针对这些未曾覆盖的测试路径进行补足测试,从而更好地提高程序的鲁棒性。并且,在不更改程序源代码的情况下,实现了桩点信息输出的自动插桩处理。
附图说明
图1是本发明所描述方法的一段示例程序及对应的控制流程图;
图2是子函数同父函数控制流程图合并示例图;
图3是程序插桩处理示例图;
图4是静态程序路径集合示例。
具体实施方式
以下结合附图对本发明作进一步说明。
先对本发明所涉及的术语进行定义:
BB(Basic Block):程序基本块;一段线性执行并不包含任何跳转语句的程序代码或程序执行指令集合。只能从程序基本块的入口进入,最后一条代码(指令)退出,中间不包含其他跳转或其他中断程序执行的代码或指令内容。
CFG(Control Flow Graph):
程序控制流程图;一种对程序利用有向图进行描述的抽象化数据结构。它以基本块作为节点,有向边来描述程序控制流中的跳转。通常入口节点(Entry)和退出节点(Exit)来表示程序的入口和程序退出。
静态程序路径:
程序路径是指通过静态分析程序得到的程序控制流程图,从入口到出口的一组具有时序关系的程序基本块的集合,通过分析遍历程序控制流程图可以得到程序的全路径。
动态执行路径:
通过输入测试用例并执行测试对象程序所获得的程序路径。动态执行路径由一系列打桩点数据流所构成,包含程序入口点,退出点以及桩点位置信息。
基于上述定义,根据本申请的第一方面,一种基于程序路径的测试完备性检查方法包括以下步骤:
步骤(1),分析程序AST结构,创建相应的程序控制流程图。
步骤(2),基于步骤(1)中得到的程序控制流程图,裁剪压缩程序控制流程图数据。
步骤(3),遍历控制流程图中BB,逐个插桩加入桩点数据(桩点位置信息)。
步骤(4),输入测试用例数据集并执行步骤(3)已插桩处理后的测试对象程序,收集并暂存程序运行过程中的桩点数据流信息。
步骤(5),遍历步骤(2)中得到的程序控制流程图,计算分析静态程序路径。
步骤(6),还原步骤(4)中桩点数据流信息数据,结合步骤(2)中得到的程序控制流程图,得到动态执行路径。
步骤(7),利用步骤(5)中得到的静态程序路径以及步骤(6)中得到的动态流程图,计算出该测试用例集中未覆盖的程序路径。
本申请的原理在于:程序的现实运行环境中,根据不同的输入信息以及当前的执行环境信息相当于各种各样的程序场景。现实环境中bug大多发生在实验室环境中还未模拟或者说设计者未曾预料到的某种测试场景。通过未覆盖程序路径则以结构化的方法,可以形象地描述这些在程序运行中未曾测试的多种测试场景组合。
在一优选方案中,步骤(1)中,分析测试对象程序的AST结构,根据分支条件语句抽象化一个通用的控制流程图。由于各种程序语言有其特殊的语法规则,AST分析处理可得到统一的抽象语法树结构,通过控制节点(分支跳转节点),生成一个程序控制流程图。
在一优选方案中,步骤(2)中,遍历步骤(1)中生成的控制流程图,合并单入单出(single-in-single-out)的语句节点变为一个BB节点,进一步压缩程序控制流程图节点数目。
进一步说,当遇到函数调用节点,则***该节点。
在一优选方案中,步骤(3)中,遍历步骤(2)中的每个BB节点,在BB所对应的入口位置加入桩点位置信息输出语句的回调处理,从而程序运行过程中产生一组具有时序性的桩点位置信息数据流。
在一优选方案中,步骤(4)中,编译生成测试对象可执行程序。利用事先准备的测试用例数据,执行测试。
测试完成后,收集分析每个测试用例与其相对应的程序覆盖情况信息,并序列化每个测试用例所对应的覆盖信息数据。
在一优选方案中,步骤(5)中,从程序入口点开始,利用DFS(深度优先遍历)遍历程序控制流程图,计算得到静态程序路径。
进一步说,在程序控制流程图遍历过程中,遇到子函数调用,则展开并连接对象子函数的静态程序路径子集。如此反复迭代直至遇到程序退出点,路径搜索结束。
在一优选方案中,步骤(6)中,还原步骤(4)中收集到的桩点数据流信息,利用步骤(2)中BB和相应代码位置的映射关系,可得到由桩点位置所对应的BB组成的具有一定时序性的程序执行覆盖信息数据流。从这串数据流中可提取从程序入口到程序退出点的一系列动态执行路径,一段由入口到程序退出点的子序列即为一条动态执行路径。
在一优选方案中,步骤(7)中,静态程序路径集合同动态执行路径集合之间,利用如下求得其未覆盖的路径集合
Punexecuted=Pstatic-(Pstatic∩Pexecuted)
其中Punexecuted表示未覆盖的程序路径集合;Pstatic表示通过代码静态分析得到的静态程序路径集合;Pexecuted表示测试用例执行之后获得的动态执行路径集合。
图1示出了本发明一个实施例的一段代码及其对应的控制流程图。通过测试对象程序语言,进行词法分析得到程序的AST(抽象语法树)结构,然后遍历AST结构节点,创建控制流程图的节点信息,以及构造节点入边和出边信息,连成一张如图1中所示的控制流程图。控制流程图中的分支节点关联为程序中的跳转以及分支结构包括(goto/if/switch/for/while/do…while)代码结构;
如图1所示,遍历程序控制流程图的每个节点,合并那些single-in-single-out的节点,使之成为一个包含多个程序表达式的BB节点。所谓single-in-single-out是指,本节点入边和出边的数量有且仅有一条。另外,碰到是一个子函数调用节点,只需要和后继节点进行分离处理。
图3示出了根据本发明的一个示例的程序插桩处理过程。利用LLVM工具链的自定义优化过程结构,如图3所示,在每个BB的入口位置加入输出桩点位置的回调处理的LLVMIR指令语句。在编译程序源代码时,实现自动化完成桩点位置输出指令追加打桩处理。本例中的桩点信息包括源代码文件路径,BB标识号,函数名称,当前消息序号。
输入测试用例集数据,执行步骤(3)插桩之后的被测对象测试程序。程序执行过程中输出的桩点数据流通过消息队列以TCP持续发送到数据处理服务器中。数据服务器中数据处理程序将保持接收到消息时序特征情况下,写入二进制文件。
图2示出了子函数同父函数控制流程图合并的示例过程。利用DFS算法遍历程序控制流程图中各个BB节点,从程序入口位置到程序退出位置,完成各静态程序路径的分析,静态程序路径为搜索途中的各个节点的标识号码的一个序列串。另外,遇到子函数调用节点,则保存当前处理中函数信息,转为子函数的路径搜索。完成子函数搜索后,如图2所示,进行父子函数路径的合并。
从步骤(4)中保存好的桩点信息中,根据接收到的桩点位置信息还原得到一组动态执行路径序列信息。
图4是一个静态程序路径集的示例。对比搜索如图4所示的静态程序路径序列信息,以及动态执行路径信息可得到动态执行路径的补集。补集结果即为未覆盖程序路径。为了更加快速的进行路径序列的比较,可直接比较路径序列的hash值。另外,循环路径的处理,则分为三部分路径的比较,循环进入前片段,循环子序列,循环退出后的路径片段,三部分都匹配则路径匹配
根据本发明的第二方面,提出了一种基于程序路径的测试完备性检查设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其中,所述处理器执行所述程序时实现上述所述的基于程序路径的测试完备性检查方法。从硬件层面而言,除了处理器、网络接口、内存以及非易失性存储器之外,所述设备通常还可以包括其他硬件,如负责处理报文的转发芯片等等;从硬件结构上来讲该设备还可能是分布式的设备,可能包括多个接口卡,以便在硬件层面进行报文处理的扩展。
根据本发明的第三方面,提出了一种计算机可读存储介质,所述存储介质存储有计算机程序,所述计算机程序用于执行上述所述的基于程序路径的测试完备性检查方法。
以上所述是本发明的优选实施例,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围。
Claims (9)
1.一种基于程序路径的测试完备性检查方法,其特征在于包括如下步骤:
步骤(1),分析程序AST结构,创建相应的程序控制流程图;
步骤(2),基于步骤(1)中得到的程序控制流程图,裁剪压缩程序控制流程图数据;
步骤(3),遍历控制流程图中程序基本块,逐个插桩加入桩点数据;
步骤(4),输入测试用例数据集并执行步骤(3)已插桩处理后的测试对象程序;收集并暂存程序运行过程中的桩点数据流信息;
步骤(5),遍历步骤(2)中得到的程序控制流程图,计算分析静态程序路径;
步骤(6),还原步骤(4)中桩点数据流信息数据,结合步骤(2)中得到的程序控制流程图,得到动态执行路径;
步骤(7),利用步骤(5)中得到的静态程序路径以及步骤(6)中得到的动态控制流程图,计算出该测试用例集中未覆盖的程序路径。
2.根据权利要求1所述的测试完备性检查方法,其特征在于:在步骤(1)中,分析测试对象程序的AST结构,根据分支条件语句抽象化一个通用的控制流程图。
3.根据权利要求1所述的测试完备性检查方法,其特征在于:在步骤(2)中,遍历步骤(1)中生成的程序控制流程图,合并单入单出的语句节点变为一个程序基本块节点;当遇到函数调用节点,则***该节点。
4.根据权利要求1所述的测试完备性检查方法,其特征在于:在步骤(3)中,遍历步骤(2)中的每个程序基本块节点,在程序基本块节点所对应的入口位置加入桩点位置信息输出语句的回调处理,从而程序运行过程中产生一组具有时序性的桩点位置信息数据流。
5.根据权利要求1所述的测试完备性检查方法,其特征在于:在步骤(4)中,编译生成测试对象可执行程序;利用事先准备的测试用例数据,执行测试;
测试完成后收集分析每个测试用例与其相对应的程序覆盖情况信息,并序列化每个测试用例所对应的覆盖信息数据。
6.根据权利要求1所述的测试完备性检查方法,其特征在于:在步骤(5)中,从程序入口点开始,利用深度优先遍历程序控制流程图,计算得到静态程序路径;
在程序控制流程图遍历过程中,遇到子函数调用,则展开并连接对象子函数的静态程序路径子集;如此反复迭代直至遇到程序退出点,路径搜索结束。
7.根据权利要求1所述的测试完备性检查方法,其特征在于:在步骤(6)中,还原步骤(4)中收集到的桩点数据流信息,利用步骤(2)中程序基本块和相应代码位置的映射关系,得到由桩点位置所对应的程序基本块组成的具有一定时序性的程序执行覆盖信息数据流;
从数据流中提取从程序入口到程序退出点的一系列动态执行路径,一段由入口到程序退出点的子序列即为一条动态执行路径。
8.一种基于程序路径的测试完备性检查设备,其特征在于包括存储器、处理器及存储在存储器上并在处理器上运行的计算机程序;其中,所述处理器执行所述程序时实现上述权利要求1至7任一所述的基于程序路径的测试完备性检查方法。
9.一种计算机可读存储介质,其特在于:所述存储介质存储有计算机程序,所述计算机程序用于执行上述权利要求1至7任一所述基于程序路径的测试完备性检查方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311590080.6A CN117520191B (zh) | 2023-11-27 | 2023-11-27 | 一种基于程序路径的测试完备性检查方法、设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311590080.6A CN117520191B (zh) | 2023-11-27 | 2023-11-27 | 一种基于程序路径的测试完备性检查方法、设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN117520191A CN117520191A (zh) | 2024-02-06 |
CN117520191B true CN117520191B (zh) | 2024-06-21 |
Family
ID=89747489
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311590080.6A Active CN117520191B (zh) | 2023-11-27 | 2023-11-27 | 一种基于程序路径的测试完备性检查方法、设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117520191B (zh) |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116627818A (zh) * | 2023-05-23 | 2023-08-22 | 杭州金衡昇科技有限公司 | 一种基于程序路径相似度的测试用例复用方法 |
Family Cites Families (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102368226B (zh) * | 2011-10-10 | 2014-02-26 | 南京大学 | 一种基于扩展有限状态机可行路径分析的测试用例自动生成方法 |
CN103473171B (zh) * | 2013-08-28 | 2016-06-08 | 北京信息科技大学 | 一种基于函数调用路径的覆盖率动态跟踪方法及装置 |
CN108710575B (zh) * | 2018-05-23 | 2020-11-24 | 华南理工大学 | 基于路径覆盖测试用例自动生成的单元测试方法 |
CN112445692B (zh) * | 2019-08-27 | 2024-01-26 | 腾讯科技(深圳)有限公司 | 一种用例测试方法及终端 |
CN112380120B (zh) * | 2020-11-13 | 2022-06-10 | 华南理工大学 | 单元测试代码结构自动解析与路径分析方法 |
CN114490316B (zh) * | 2021-12-16 | 2023-04-18 | 四川大学 | 一种基于损失函数的单元测试用例自动生成方法 |
CN116541286A (zh) * | 2023-05-09 | 2023-08-04 | 杭州金衡昇科技有限公司 | 一种基于插桩和符号执行的高覆盖率测试数据生成方法 |
-
2023
- 2023-11-27 CN CN202311590080.6A patent/CN117520191B/zh active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116627818A (zh) * | 2023-05-23 | 2023-08-22 | 杭州金衡昇科技有限公司 | 一种基于程序路径相似度的测试用例复用方法 |
Non-Patent Citations (1)
Title |
---|
基于程序控制流的覆盖率引导模糊测试技术研究;程伟;《硕士电子期刊》;20190615;全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN117520191A (zh) | 2024-02-06 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112100054B (zh) | 一种面向数据管控的程序静态分析方法和*** | |
US11720477B2 (en) | Unit testing method based on automatic generation of path coverage test cases | |
CN110008113B (zh) | 一种测试方法、装置、电子设备 | |
CN107015841B (zh) | 一种程序编译的预处理方法及程序编译设备 | |
CN108595334B (zh) | 一种计算Java程序动态切片的方法、装置及可读存储介质 | |
CN115509514B (zh) | 一种前端数据模拟方法、装置、设备及介质 | |
CN108563561B (zh) | 一种程序隐性约束提取方法及*** | |
CN116431476A (zh) | 一种基于代码上下文变异的jvm模糊测试方法 | |
CN117520191B (zh) | 一种基于程序路径的测试完备性检查方法、设备及存储介质 | |
US20090064092A1 (en) | Visual programming language optimization | |
CN109032946B (zh) | 一种测试方法和装置、计算机可读存储介质 | |
Muhammad et al. | Trans-Compiler based Mobile Applications code converter: swift to java | |
CN113282495B (zh) | 一种基于轨迹监控的Java软件故障定位方法 | |
Abdallah et al. | JavaBST: Java backward slicing tool | |
CN114281709A (zh) | 一种单元测试方法、***、电子设备及存储介质 | |
CN112270176B (zh) | 深度学习框架中模式转换的方法、装置和计算机存储介质 | |
Bedadala et al. | Generation of Call Graph for Java Higher Order Functions | |
Grigorev et al. | String-embedded language support in integrated development environment | |
Joshi et al. | Automatic generation of fault trees from AADL models | |
CN116775040B (zh) | 实现代码疫苗的插桩方法及基于代码疫苗的应用测试方法 | |
CN113238759B (zh) | 一种类Python程序设计语言XD-M的解释***及方法 | |
Comeau | Symbolic Execution for Function Matching | |
Savitskii et al. | Fast analysis of source code in C and C++ | |
Aparna et al. | Building a common notation for enabling comparison of design and execution | |
CN114265582A (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 |