冯济舟 刘洪喜
(1中国电子科技集团公司第三十八研究所;2空装驻安徽地区军代表室,安徽合肥,230088)
随着软件规模和复杂程度的不断提高,软件测试技术也在不断发展,软件在各个领域的应用比重不断加大的情况下,对于保障软件质量的软件测试也提出了更高的要求。目前,国内的软件测评能力建设经历了CMMI(能力成熟度模型集成)体系认证、国家实验室 (CNAS)认证和国防科技工业实验室认可 (DILAC)。测评实验室已发展成为具有规范过程管理、具备一定测试能力及测试资质的软件质量保障机构。如何发挥软件测评的优势,将软件测评与产品的软件研发过程紧密结合起来,提升产品质量,笔者就这方面的内容谈谈看法。
软件系统的组成结构如图1所示。语句是系统组成的最基本单元,多个语句集成完成特定目标的函数,多个函数集成完成指定功能的部件,多个部件集成完成具有独立配置管理一组功能的软件配置项,而多个软件配置项组成功能完整的系统。代码审查、静态分析的检测可以消除编码不规范、变量未定义即使用、内存泄漏、数组越界、未初始化等可能造成系统运行不稳定的缺陷;单元测试、集成测试可以消除所设计的软件不满足设计需求的缺陷;人工代码走查可以消除软件设计的逻辑缺陷;软件配置项测试可以消除软件不满足软件配置项需求的缺陷;系统测试可以消除软件不满足系统/子系统需求的缺陷。
因此,在软件系统的不同阶段,代码审查和静态分析保障了软件最基本单元语句级别编写的正确性和一致性;单元测试保障了由多条语句组成的软件函数级别编写的正确性和一致性;集成测试保障了由多个函数组成的软件部件级别编写的正确性和一致性;软件配置项测试保障了由多个部件组成的软件配置项级别编写的正确性和一致性;软件系统测试保障了所有软件配置项组成的软件系统编写的正确性和一致性。以此自底向上逐层验收、确认,从而确保了整个系统的质量。
以软件开发过程为对象,建立软件测试对软件开发过程各阶段工作的质量保障。其过程及对应关系如图2所示。
图1 软件系统组成结构模型图
图2 U型软件测试过程模型图
图1从软件产品构成的角度,通过建立软件系统的构成树,来阐述软件测试对于保障软件系统构成树中各节点验证与确认的手段与方法,以说明软件测试对于构成软件系统各个组成要素的保障。图2从软件开发过程的角度,通过建立与软件开发各过程活动对应的各软件测试活动模型,阐述软件测试对于软件开发过程各活动的验证与确认,以说明软件测试对于软件开发过程各活动的质量保障。其中软件开发过程由系统/子系统需求分析为开始,以编码实现为终止。而编码活动的结束即完成了对图1软件系统的构建,代码审查和静态分析对图2中编码结果即图1中语句级别与编码规范的一致性进行验证;单元测试按照图2中详细设计结果即详细设计文档,验证图1中函数与详细设计文档的一致性;集成测试按照图2中概要设计结果即概要设计文档,验证图1中部件与概要设计文档的一致性;软件配置项测试按照图2中软件配置项需求结果即软件需求规格说明,验证图1中软件配置项与软件需求规格说明文档的一致性;系统测试按照图2中系统/子系统需求结果即系统子系统规格说明,验证图1中系统与系统/子系统规格说明文档的一致性。
然而经过这么细致的验证与确认,软件在交付使用后仍然会暴露出很多问题,有的甚至可以导致软件崩溃。根据实践经验,软件测试过程中仍然存在着以下几个薄弱环节。
a)软件测试工作不到位。由于缺乏有效的手段对软件测试工作进行监控与评价,导致软件测试工作有时只是走走过场,很难着实有效地开展工作。
b)软件开发文档编写不到位。软件开发文档由需求到设计层层递进,并可以上下追溯。而现在编写的软件开发文档,都是人工填写的追溯信息,缺少必然的逻辑关系,势必会造成软件设计或者需求的冗余、缺失甚至不合理。
c)编码质量分析的不到位。编码质量的分析直接影响到软件系统的可靠性和稳定性,然而这些问题的暴露无法通过任何一种动态测试方法捕获。比如就内存泄漏来说,会造成系统运行很长一段时间后崩溃,但这又无法定位到任何动态问题上来。
d)软件一致性检查不到位。对于软件一致性检查,即文档与编码实现的一致性,只是比对文档中提到的内容,在软件中是否实现了。但是没有对所有代码都查明是否有确切的文档出处和要求,造成测试事项的遗漏,导致测试未覆盖代码的不可控。
e)测试方法不到位。软件测试按照标准的要求 (如能力成熟度模型集成体系认证、国家实验室认证和国防科技工业实验室认可关于测试管理和测试能力)只是站在用户角度对软件代码与文档的一致性检查,缺乏站在开发人员角度对系统的正确性、稳定性、可靠性和效果给予必要的验证与确认。
标准只是对测评工作的基本要求,然而以标准为基础又可以赋予我们丰富的想像空间,除了做到以上标准 (CMMI体系认证、CNAS和DILAC关于测试管理和测试能力)提出的基本要求之外,软件测试还需加强以下9个方面工作。
a)加强软件各测试验收阶段的评审工作,以确保测试工作的有效性。
b)加强软件文档审查分析能力。采用逆向工程的方法,将下一层次文档的功能描述进行整合,观察是否可以还原上一层次文档的需求,从而可以判断出功能分解中是否有冗余的、缺少的或者不合理的,以提高软件的设计质量。
c)熟悉静态分析、代码审查工具的特性,熟练掌握测试工具的使用方法。从而可以在有限的时间内更好、更多、更准确地发现软件代码的规范问题,排除动态测试无法发现的可能给系统带来不稳定因素的软件隐患。
d)加强软件源代码与软件设计文档的一致性检查。杜绝设计的功能未实现,实现的功能未设计,达到文实一致,每段代码的实现都有证据可依。可以增强软件开发的规范性,也减少软件蔓延或镀金给系统带来的不稳定因素。
e)打破常规的测试思想。不仅要按需求逐条进行验证,也要根据经验采用猜错的方法验证软件是否实现了需求没有要求的功能,往往这些额外的功能轻则影响系统的处理性能和带宽,重则可能导致系统的崩溃。
f)注重软件故障树的建立。软件问题往往具有蝴蝶效应,一个小小语句的失误就有可能造成重大的损失。建立软件故障树,通过展示小缺陷可能导致的重大危害,可以提高人们对细小问题的认识,对软件问题的及时排除具有极大意义。
g)注重仿真数据及实装数据的积累。通过使用积累的仿真数据和实装数据,不仅可以模拟特殊环境下验证软件的处理能力,而且有助于通过这些已知的数据来判断软件处理结果的正确性,提升在专业领域测试的权威性。
h)建立具有专业领域测试特征的软件配置项测试工具和系统测试工具。对于目前行业的动态测试工具来说,由于其考虑了不同领域行业使用的兼容性,导致测试具体领域软件项目的不便,不仅配置复杂,而且具有具体行业测试特征所亟需的功能并未提供。针对此种现象可以结合企业软件测试的特点,自己编写测试工具用于实现软件自动化测试执行、文档生成、测试数据生成,提高测试的执行效率和有效性。
i)加强对软件算法时间复杂度和空间复杂度评价。计算软件算法的时间复杂度和空间复杂度,不仅有助于了解软件算法实现的正误,更可以优化软件算法,提升算法执行效率,从而大大提升系统的稳定性和可靠性。