一种基于目标驱动的软件测试方法和装置制造方法及图纸

技术编号:29789338 阅读:16 留言:0更新日期:2021-08-24 18:07
本发明专利技术涉及一种基于目标驱动的软件测试方法和装置。该方法首先执行系统级的concolic测试以收集函数之间的调用关系,利用函数之间的调用关系计算函数的相关性,通过函数的相关性构建扩展单元;然后在扩展单元中使用单元测试发现潜在错误;然后在系统级的concolic测试中使用目标驱动的搜索策略验证潜在错误是否在全局存在。本发明专利技术通过计算函数依赖关系的方式将目标函数拓展为一组测试单元,使由于缺少上下文带来的误报大大降低;通过先在局部进行错误搜索,再将潜在错误信息放入到系统级的concolic执行中进行验证,降低了对目标函数进行测试的难度,且提高了测试的准确度。

【技术实现步骤摘要】
一种基于目标驱动的软件测试方法和装置
本专利技术属于软件安全测试
,具体涉及一种基于目标驱动的软件测试方法和装置。
技术介绍
单元测试是一种软件测试方法,通过该方法可以测试源代码的每个单元以确定它们是否适合使用。单元是最小的可测试软件组件,通常执行单个内聚功能。有人认为任何走出一个函数的测试,都不是单元测试,其实,对“单元”的定义取决于自己。如果你正在使用函数式编程,一个单元最有可能指的是一个函数,你的单元测试将使用不同的参数调用这个函数,并断言它是否返回了期待的结果;在面向对象语言里,从一个单一的方法到一整个的类都可以是一个单元。单元测试就是指对这个最小可测试组件进行检查和验证。单元测试可以测试源代码的每个单元以确定它们的可用性和安全性。单元测试是保证产品质量的必要步骤,开发人员可以利用它来发现并纠正源代码中的缺陷。如果单元测试有效执行,可能会在提高产品质量、减少开发时间/成本、优化源代码设计以及提高维护难度等方面获得重大收益。通常,单元测试需要测试人员建立测试驱动程序,并用该驱动程序调用被测试单元,它根据已知值或以前执行同一测试(回归测试)的结果来检查返回的结果。单元测试的弱点在于,因为单元测试使用近似的符号输入和返回值来表示单元的上下文,因此单元中发现的大多数错误都是由不可行的路径引起的错误警报,这意味着这些错误警报在系统级别不存在。而“单元”的定义又影响着误报率,例如,当以一个函数为单元时就比以该函数为中心加入一层函数调用所产生的误报高,并且该误报会随着加入的函数而减少,直到极限情况下以整个程序为单元,此时的误报为0,但随着单元范围的扩大,程序的路径更将复杂且调用深度也在不断增加,这使得动态的单元测试性能也在不断的降低。此外,由于单元测试有大量潜在的错误报告,需要将局部的路径信息逆向推导到全局来确认这些报告中各个错误在完整的程序中是否,但要对潜在的错误进行确认很困难,这往往给测试工程师带来大量的手动工作,需要花费大量的时间。Concolic测试是符号执行的一种形式,它已经成为一种有效的软件测试方法。Concolic测试的实质是在具体执行程序的同时,用符号值代替程序手动或随机构造的输入来运行程序。符号执行在最初允许为任意值的符号输入上运行代码,并在执行路径上收集该路径的分支条件,即当程序执行的分支基于符号值时,concolic执行引擎跟踪两个分支,在每个分支上维护一组路径约束,并利用符号求解器寻找路径约束的可满足解,获得当前路径的具体值以产生该路径的测试用例。利用生成的测试用例再次运行程序,它可以遵循相同的路径,且命中相同的错误。精心选择新分支路径可帮助测试人员系统地探索具有高代码覆盖率而又不会产生冗余的程序的执行路径。不幸的是,由于程序中不同执行路径的数量通常与条件语句的数量成指数关系,或者在最坏的情况下甚至是无限的,因此,concolic测试存在众所周知的路径爆炸问题。尽管符号执行比传统测试倾向于研究更多数量级的输入路径,但是它通常难以耗尽所有有趣的路径。此外,由于程序的复杂性,通常不可能到达程序内部最深的代码。即使工具成功到达深层代码,它也只会考虑满足可以到达此代码的少数路径的输入值。综上所述,现有技术存在的问题和缺点是:单元测试的有效执行,可能会在提高产品质量、减少开发时间/成本、优化源代码设计以及降低维护难度等方面获得重大收益。但单元测试的结果难以在真实的软件中直接使用,它仍然需要现场工程师手动为每个目标单元生成必要的全局输入。自动单元测试可以对代码中的较小功能进行彻底的分析,但存在以下事实:未考虑对单元输入的某些限制或在系统级别上发生的输入之间的相关性。因此,它们通常会带来很多误报。最新的一些研究通过过滤单元测试中发现的潜在错误来减少误报,但是对潜在错误的确认仍然为测试工程师带来了很多工作量。Concolic测试由于其高代码覆盖率而避免在同一路径上生成冗余输入,因此被广泛用于单元测试中。然而,concolic测试遭受符号执行中普遍存在的路径爆炸等困扰,因此该方法虽然没有误报,但却存在大量的漏报。尽管已经意识到全面测试软件的重要性,但是需要测试人员给出相关测试用例需要大量工作,这就导致很少能在真实的软件中付诸实践。
技术实现思路
本专利技术通过结合单元测试和concolic测试开发了称为目标驱动的concolic测试(TDCT,Target-DrivenConcolicTesting)技术。TDCT通过基于函数之间的相关性构造扩展单元来减少单元测试中的误报。同时,它会自动确认在单元测试中发现的潜在错误,并通过在系统级concolic测试中采用目标驱动的搜索策略来生成系统级输入。本专利技术采用的技术方案如下:一种基于目标驱动的软件测试方法,包括以下步骤:收集函数之间的调用关系,利用函数之间的调用关系计算函数的相关性,通过函数的相关性构建扩展单元;在扩展单元中使用单元测试发现潜在错误;使用目标驱动的搜索策略验证潜在错误是否在全局存在。进一步地,所述收集函数之间的调用关系,利用函数之间的调用关系计算函数的相关性,包括:以待测的目标程序和一组系统级测试初始值为输入开始concolic执行,并根据实际情况设置时间阈值;concolic引擎以获取尽可能多的系统级路径为目的,一旦到达设定的时间阈值就停止运行;同时收集已运行路径上函数的调用关系,利用函数间的调用频次,通过计算条件概率来确定函数间的相关性。进一步地,在获得所述函数间的调用频次后,通过以下公式计算两个函数x和y之间的相关性R:其中,F(x,y)表示函数x调用函数y的次数与函数y调用函数x的次数之和,F(x)表示函数x在所有路径中出现的次数,F(y)表示函数y在所有路径中出现的次数。进一步地,所述通过函数的相关性构建扩展单元,包括:根据实际情况预设函数相关性阈值,根据函数相关性阈值选择满足要求的相关函数,以构建出扩展单元;对于每个目标函数f,构造一组扩展单元,其中包括f本身,满足函数相关性阈值的调用者e,及其满足函数相关性阈值的后继g。进一步地,所述在扩展单元中使用单元测试发现潜在错误,包括:对于被测程序P中和目标函数相关的每一组扩展单元,自动生成扩展单元的测试驱动程序driver_e和符号存根stub_g;测试驱动程序driver_e根据调用函数e的输入类型将符号值分配给e的输入变量,然后调用函数e;执行后继函数g时,将其替换为符号存根stub_g以使返回值具有符号意义;对扩展单元进行concolic单元测试,以探索与目标函数f相关的崩溃性错误,在此执行期间,为测试驱动程序driver_e的每一条执行路径生成一组输入,并在遇到崩溃错误时记录执行路径及该路径的约束条件。进一步地,所述使用目标驱动的搜索策略验证潜在错误是否在全局存在,包括:分析整个程序,以构建控制流程图CFG和函数调用图CG,使用潜在错误作为目标在生成的CFG和CG中进行标记,以获得包含潜在目标标记节点的控制流程图;...

【技术保护点】
1.一种基于目标驱动的软件测试方法,其特征在于,包括以下步骤:/n收集函数之间的调用关系,利用函数之间的调用关系计算函数的相关性,通过函数的相关性构建扩展单元;/n在扩展单元中使用单元测试发现潜在错误;/n使用目标驱动的搜索策略验证潜在错误是否在全局存在。/n

【技术特征摘要】
1.一种基于目标驱动的软件测试方法,其特征在于,包括以下步骤:
收集函数之间的调用关系,利用函数之间的调用关系计算函数的相关性,通过函数的相关性构建扩展单元;
在扩展单元中使用单元测试发现潜在错误;
使用目标驱动的搜索策略验证潜在错误是否在全局存在。


2.根据权利要求1所述的方法,其特征在于,所述收集函数之间的调用关系,利用函数之间的调用关系计算函数的相关性,包括:
以待测的目标程序和一组系统级测试初始值为输入开始concolic执行,并根据实际情况设置时间阈值;concolic引擎以获取尽可能多的系统级路径为目的,一旦到达设定的时间阈值就停止运行;同时收集已运行路径上函数的调用关系,利用函数间的调用频次,通过计算条件概率来确定函数间的相关性。


3.根据权利要求2所述的方法,其特征在于,在获得所述函数间的调用频次后,通过以下公式计算两个函数x和y之间的相关性R:



其中,F(x,y)表示函数x调用函数y的次数与函数y调用函数x的次数之和,F(x)表示函数x在所有路径中出现的次数,F(y)表示函数y在所有路径中出现的次数。


4.根据权利要求1所述的方法,其特征在于,所述通过函数的相关性构建扩展单元,包括:
根据实际情况预设函数相关性阈值,根据函数相关性阈值选择满足要求的相关函数,以构建出扩展单元;对于每个目标函数f,构造一组扩展单元,其中包括f本身,满足函数相关性阈值的调用者e,及其满足函数相关性阈值的后继g。


5.根据权利要求1所述的方法,其特征在于,所述在扩展单元中使用单元测试发现潜在错误,包括:
对于被测程序P中和目标函数相关的每一组扩展单元,自动生成扩展单元的测试驱动程序driver_e和符号存根stub_g;
测试驱动程序driver_e根据调用函数e的输入类型将符号值分配给e的输入变量,然后调用函数e;执行后继函数g时,将其替换为符号存根stub_g以使返回值具有符号意义;
对扩展...

【专利技术属性】
技术研发人员:范萌王文智于爱民孟丹
申请(专利权)人:中国科学院信息工程研究所
类型:发明
国别省市:北京;11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1