摘要:当对软件的进行维护的时候,由于关联性普遍存在于各个模块之间,修改错误的模块,添加新的模块和删除无用的模块,这些变更过程都会产生不合适错误或潜在错误,其软件测试和维护的关键问题就是如何对这些错误进行跟踪定位,基于程序关联性分析的测试方法是解决上述问题的一种非常有效的方法,该文对程序关联性分析法在软件测试中的初步应用进行了分析。
关键词:关联性;软件测试;静态代码;动态代码
中***分类号:TP3文献标识码:A文章编号:1009-3044(2010)21-6068-02
Study On a Software Test Approach Based on Analyzing Program Association
GENG Li-wei
(Guangdong Radio & TV University, Guangzhou 510091, China)
Abstract: In the course of software are maintenance,owing to the association exist among modules,in consistencies or new error should be produced by modifying the wrong module,adding new modules or deleting useless module. The key issue is how to trace and locate these errors. The software are test approach based on analyzing program association is a way to resolve these issues. The essay has a preliminary investigation on software test approach based on analyzing program association.
Key words: association; software test; static code; dynamic code
一般来说,软件完成后都不可能保证其完全的正确性,会出现错误,所以在软件投入使用前必须进行各种测试来完善其稳定性和可靠性;同时还有一些遗漏问题会在软件使用过程中逐步出现,对于这类现象,我们就要进行修复在使用中出现的问题来维护软件的可用性,软件维护的方法有重新设计工程、应用程序理解、程序转换、影响分析、逆向工程、回归测试、软件配置管理等一系列相关技术[1]。如果没有经过运行前的测试,容易导致就会在以后的程序运行中出现这些问题,从而造成用户无法估量的损失。因此,要解决这类问题,就必须对软件进行各种不同方式的测试来分析其问题、错误所在,但这些过程会引起不合理的资源投入,形成了很高的维护费用。测试和维护工作快速和有效地开展的难点和问题,已经逐渐成为了软件测试和维护的瓶颈。
1 软件测试方法的分类
从目前看,软件测试有很多种不同的方法和技术,从不同的角度来看存在着不同的分类方法,一般的分类都是从是否需要执行被测软件的角度来考虑,可以分为静态测试和动态测试两种 [2]。1) 静态测试。静态方法是主要通过分析程序静态特性,分析找出问题的潜在存在,例如不合适的变量、不准确的计算等等,根据结果可用进一步的对错误进行查找,为后续的测试方法的选取提供帮助,静态测试能显著提高软件的可靠性和易维护性,为软件的质量提供必要的保证。其测试方法一般可以包括代码检查和静态结构分析两种主要方面。静态结构主要是以***像的方式来测试和分析软件的内构的运行情况,像函数调用关系***、函数内部控制流***等这些都属于这类测试方法。其主要的分析方法主要有数据流分析和程序控制流分析。2) 动态测试。动态测试是通过运行程序直接测试,与静态测试主要区别在在真实环境下运行测试被测代码,这样可以从更全面来观察程序运行时能体现的速度和结构等行为,并通过对程序的执行状态和程序的外部的检查、分析,来确定程序发生错误的环节、部位。动态测试完成的功能有:接口灵敏性测试、覆盖程度分析、速度性能分析等,其中最重要的是覆盖程度分析,其定义是指对代码的执行路径覆盖绿进行测定和评估,包括判定覆盖、语句覆盖、路径覆盖等,这些都是根据不同需要为基本,为设计测试不同需要提出方法和依据。动态阶段的测试方法主要有以下四种:1) 符号测试;2) 逻辑覆盖;3) 路径测试;4)程序插桩及程序变异。
2 基于程序相关性分析的软件测试方法
2.1 软件的相关性分析
模块和与相关其它部分之间的关联就是软件的相关性,这是一种相互联系和相互制约关系,如果体现在软件测试来看,主要有两个方面的相关性:不同模板之间的关联程度和模块与测试的关联程度[3]。不同模式的软件测试技术,主要是通过把相关关系通过形式化的技术进行直观的表达,把有效的途径运用到对应的测试技术中。由于相关模式的软件测试本身就是具有正向和反向相关能力的数学模型,其主要的步骤是将模块功能和源代码测试联系起来,通过分析确定软件运行的每个阶段产生的错误或潜在的错误,以及与其它阶段的相关性,从而使整个软件系统测试到维护各个阶段的对应性完善。例如在程序测试运行过程中出现了某不确定的错误,要有效地修改这个错误,就一定要知道这个错误出现的具体环节,通过什么途径传播到发现它的部位,当遇到这种情况,可以考虑逆向相关法,对于在修改和回归测试等很多场合,逆向相关都是相对有得非常广泛的方法。总体来说,相关性分析是在抽象层次上建立各个环节的相关数学软件模型,建立从问题领域到程序设计领域的映射集,根据不同相关性的描述,可以分为数字、函数、模块等多种层次[4]。
2.2 相关测试方法的表达和测试方案设计
测试方案的设计都是测试阶段中关键的技术问题,其具体的步骤可以分为以下六个步骤:1) 从程序中选取合适有效的测试数据;2) 通过静态测试或者动态测试形成测试用例;3) 用这些用例逐步测试被测程序;4) 观察和分析软件的运行情况;5) 检验测试结果与模型预期结果的一致性程度;6) 再根据程序的执行结果对测试方案进行对应的修改。
2.2.1 静态代码分析模块
静态代码分析模块是对源代码的全面分析,从而提取模块和动态插桩实现时的相关必要信息。该模块主要作用主要体现在存储和关联检测时,为模块分析提供准确的、完整的代码,同时也可实现插桩的不同种类,提供插桩位置的更为有效、精确信息。一般来说静态分析的过程可以进行如下三个主要部分:1)对整个文件以目标单位进行运行测试,进行源代码有效化;一般可采取打开代码源文件的方式进行;2)对预处理后的源代码文件,并把源代码文件划分为不同模块,再将这些模块信息和分支信息联系起来,识别出相关信息,生成统一完整的关联结构***,提供表达式、关键词、各类程序给所需的测试用户;3)最后对标记模块进行识别,在模块不同区域对修改完善后的代码进行插桩[5]。
2.2.2 动态代码分析模块
在源代码环境下可以自动生成插桩文件的方法被称为动态执行模块分析,其主要的优势体现在可以增加程序调试的灵活性,其正常的步骤是在目标系统或运行环境中,先把插桩文件编译为可执行的文件类型,再对可执行文件进行运行测试插桩,通过这样,就可以完成多种不同的代码测试功能。程序插桩,这是一种能够实现覆盖程度测试的技术手段和重要保证,它专门用来控制程序运行过程中模型函数的变化总体趋势,再者也可以用于检测程序某些功能的覆盖率。如果要更有效地保持被测试程序逻辑性,可以在程序中适当插入一些具有各种不同作用的探针[6],同时由于这种探针具有采集功能,这样可以分析输出程序的运行方式。这些特征数据分析结果可以表达出程序的控制流及数据流信息,这样可以得到覆盖程度等对测试有用的信息[7]。
3 结束语
近年来,在软件测试与维护领域,我国有了相当大的进步和发展,但问题依然存在,如测试理论和技术这方面研究来说,很难满足软件开发的实际需要。关联性的测试函数,为软件设计和测试维护人员提供了一种新的思路,使得软件测试与维护更加有效,帮助软件的稳定性。对在实际开发中存在的一些问题,如现在程序的规模扩大,复杂程度增高,这些都会对程序分析造成很复杂繁琐的工作量。如何以根据软件测试和维护的为核心目标,完善软件测试理论与技术,更好地提高软件测试和维护性能,更有效地使其维护费用降到最低,是目前软件测试技术人员面临的非常紧迫,同时也是意义重大的任务。
参考文献:
[1] 孙洪皓.基于程序切片技术的软件理解辅助系统设计与实现[D].硕士学位论文.大连理工大学,2007.
[2] 丁剑洁.基于度量的软件维护过程管理的研究[D].硕士学位论文.西北大学.2006.
[3] 易晓东,杨学***.一种C程序断言的全自动静态验证方法[J].计算机科学,2006,33(9).
[4] 蒋曹清,张大方,缪力.一种回归测试后的错误定位方法[J].计算机工程与科学,2005,27(4).
[5] 虞晓岚,杨小虎.功能性回归测试工具分析[J].计算机应用与软件,2007,24(5).
[6] 王学东,汪文勇.汇编程序覆盖测试中虚拟插桩的实现[J].计算机工程,2007,33(7).
[7] 赵瑞莲,闵应骅.一种基于规范和程序域分析的软件测试方法[J].计算机研究与发展,2003,40(6).
转载请注明出处学文网 » 浅谈程序关联性分析法在软件测试中的应用