对软件缺陷预防的分析研究
基于软件测试的缺陷管理系统设计与实现毕业论文

基于软件测试的缺陷管理系统设计与实现毕业论文一、内容综述当我们谈论软件开发时,不可避免地会遇到一个问题——软件缺陷。
这些缺陷可能会影响到软件的质量和用户体验,为了更有效地管理和修复这些缺陷,一个基于软件测试的缺陷管理系统显得尤为重要。
那么这个系统是怎么来的呢?接下来我们就来聊聊这篇毕业论文的核心内容。
首先这个系统的诞生源于对软件缺陷管理的需求,随着软件行业的快速发展,软件的复杂性和规模都在增加,这也意味着软件缺陷的数量可能会随之增长。
于是我们就想到了设计这样一个系统来更好地管理这些缺陷,它的主要任务是什么?简单来说就是记录、跟踪、修复和验证软件的缺陷。
这个系统是怎么工作的呢?首先它可以帮助我们记录所有的软件缺陷,然后通过跟踪这些缺陷,我们可以了解缺陷的状态,比如是否已经修复,或者修复进度如何。
同时这个系统还可以帮助我们分配任务给相应的开发人员去修复这些缺陷。
修复完成后,系统还可以帮助我们验证这些缺陷是否已经被成功修复。
这样我们就可以确保软件的质量,提升用户体验。
这个系统的设计可以说是用心良苦,为什么这么说呢?因为这个系统不仅仅可以帮助我们管理缺陷,还可以帮助我们提升工作效率。
通过这个系统,我们可以更清楚地了解每个缺陷的情况,也可以更好地协调团队成员的工作。
这样我们就可以更快地修复缺陷,提升软件的质量。
这个系统的设计和实现都是为了提高软件的质量和用户体验。
1. 背景介绍:阐述软件测试的重要性以及缺陷管理在软件开发过程中的关键作用我们都知道软件开发的过程是一个环环相扣的系统工程,缺陷管理就像是这个工程中的一位细心指挥家,它不仅要保证每个环节都能顺利进行,还得时刻关注每个环节可能出现的问题。
一旦发现问题,缺陷管理就要迅速行动,协调各方资源来解决问题。
缺陷管理不仅提高了软件开发的效率和质量,更能让整个开发过程更加规范、有序。
可以说缺陷管理是软件开发过程中的得力助手和得力保障,通过这样的管理和处理过程,软件产品将更加完美、用户体验也将大大提升。
缺陷分析——精选推荐

缺陷分析1. 引⾔:缺陷分析现状⽬前我们测试⼈员是如何利⽤缺陷的呢?多数中⼩型企业对于缺陷的控制和管理处于⼀种混乱的状态,对测试前期的设计和后期的缺陷数据统计分析的重视程度严重不⾜。
⼀种典型的情况就是测试⼈员在将 bug 提交后,仅做 bug 的修复验证,⽽没有进⼀步的⼯作。
也有⼀些公司的测试⼈员,会在测试报告中对 bug 做⼀些数据统计,以此评估当前软件的质量状况,并作为判定软件是否能发布或交付的依据。
可能会再提⼀提由 bug 所反映出来的问题,但也⽌步于此,没有进⼀步的⼯作。
只有极少数的公司会做⼀些 bug 的分析⼯作,通过 bug 分析来改进产品质量、优化研发流程和项⽬管理⽅式。
很多时候项⽬开发周期难以控制,原因之⼀就是缺乏缺陷数据的统计与分析,及缺陷的预防机制。
现在市场上有很多缺陷管理系⼯具,不过这些缺陷管理⼯具在特性上基本上都⼤同⼩异,对于缺陷的分类⽅法没有⼀个统⼀的标准,并且在缺陷分析⽅⾯普遍⽐较薄弱,通常只是提供⼀些缺陷数量的简单统计功能,⽤户不得不借助⼀些其它的统计分析软件或⾃⾏开发缺陷分析⼯具来进⾏缺陷数据的分析。
2. 什么是缺陷分析?讨论这个问题,⾸先要明确什么是缺陷?通常意义上的缺陷:程序中存在的错误,俗称 bug。
⼴义上的缺陷:项⽬计划、需求规格说明书、设计⽂档、测试⽤例、⽤户⼿册等存在的错误或问题。
可以说在软件⼯程整个⽣命周期中,任何导致⽆法满⾜⽤户所要求的的功能活导致系统失败的问题都都属于缺陷的范畴。
再说说什么是缺陷分析?通常意义上的缺陷分析:包含两个阶段,⼀是发现 bug 后进⾏ bug 定位和排查原因的活动;⼆是系统测试结束前后对软件开发各个阶段产⽣的缺陷进⾏分类、分析和汇总统计、改进缺陷度量和分析的模型、编写分析报告的活动。
这个活动中可能会伴随着其他活动,⽐如输出缺陷预防的⽅案。
毕竟我们做分析的最终⽬的是为了提⾼产品质量和优化项⽬管理流程。
⼴义上的缺陷分析:对应“⼴义缺陷”的定义,对项⽬开发的整个⽣命周期中出现的各类问题(不局限于 bug)进⾏分类和分析,进⽽改进项⽬管理流程的活动。
软件开发行业中的质量问题与改进建议 (3)

软件开发行业中的质量问题与改进建议一、概述软件开发行业的质量问题在当今科技发展日新月异的时代,软件开发行业已成为许多企业和个人关注的焦点。
然而,在软件产品开发过程中,我们也面临着一系列的质量问题。
这些问题包括但不限于缺陷率高、用户体验差、安全风险大等。
本文将针对这些质量问题进行深入探讨,并提供改进建议。
二、缺陷率高1. 问题描述:在软件开发过程中,缺陷率居高不下已成为困扰开发者和用户的主要问题。
这些缺陷可能导致系统崩溃、功能失效或数据丢失等严重后果。
2. 原因分析:缺陷率高主要是由于设计不完善、代码规范不严格以及测试不充分等原因造成的。
3. 改进建议:a. 引入更严格的代码审查机制,确保代码质量。
b. 加强测试环节,采用自动化测试工具来减少人工误差。
c. 进行持续集成与持续交付,及时修复和发布软件补丁,减少用户因为缺陷而遭受的损失。
三、用户体验差1. 问题描述:随着用户对软件产品质量的要求不断提高,用户体验成为了影响软件销售和口碑的关键。
然而,目前许多软件产品在用户体验方面仍然存在较大的问题。
2. 原因分析:用户体验差主要是由于界面设计不人性化、反应速度慢、功能复杂等原因造成的。
3. 改进建议:a. 进行用户需求分析,确定核心功能和优先级。
b. 引入人机交互专业人员,改进界面设计与操作逻辑。
c. 提供简洁明了的帮助文档或教程以便于用户快速上手使用。
四、安全风险大1. 问题描述:随着网络攻击和数据泄露事件频繁发生,软件安全性已经成为了一个不能被忽视的问题。
过多存在安全漏洞或弱密码可能导致严重后果,如个人信息泄露、财产损失等。
2. 原因分析:安全风险大主要是由于代码编写不规范、未进行充分的安全测试以及缺乏相关安全经验等原因造成的。
3. 改进建议:a. 加强对开发人员和测试人员的安全意识培训,教育其在开发过程中注重代码规范与安全漏洞排查。
b. 引入静态代码分析工具,定期扫描并修复潜在的安全漏洞。
c. 对软件进行系统级的渗透测试,模拟实际攻击场景,查找并修补可能存在的漏洞。
2软件缺陷ppt课件

缺陷的分类(续)
• 缺陷分类适用范围
缺陷管理流程
• 了解缺陷
–必须首先收集缺陷数据,然后才能了解这些缺陷, 并且找出如何预防它们,同时也能领会到如何更好 地发现,修复甚至预防仍在引入的缺陷
–可以按照以下步骤收集关于缺陷的数据
• 为测试和同行评审中发现的每一个缺陷做一个记录 • 对每个缺陷要记录足够详细的信息,以便以后能更好地了
• 关闭:
– 缺陷已被处理完成
软件缺陷流程管理的要点
• 为了保证错误的正确性,需要:
–有丰富测试经验的测试人员验证和确认发现的错误 是否是真正的错误
–测试步骤是否准确、简洁、可以重复
• 软件错误的确认并不总是轻而易举的事情
–由于对软件设计具体要求的不了解,对测试报告的 个别软件错误,可能无法确认是否属于真正的软件 错误,本地化服务商需要与软件供应商交流并确认
• 影响发布和维护,包括注释
–70 G-Algorithm
• 算法错误
–80 U-User Interface
• 人机交互特性:屏幕格式, 确认用户输入,功能有效性,页面排 版等方面的缺陷
–90 P-Performance
• 不满足系统可测量的属性值,如:执行时间、事务处理速率等
–100 N-Norms
软件失效
(Software Failure)
软件故障
(Software Fault)
错误
缺陷带来的系统风险列举
• 如果某部分产生了错误会导致的结果? • 未被验证的数据交换如果被接受 • 如果文件的完整性被破坏 • 系统是否能被安全恢复(完全恢复成备份时的状态) • 是否能暂停系统的运行 • 进行维护工作时,系统性能是否会下降到不能接受的水平 • 系统的安全性是否有保证 • 系统的操作流程是否符合用户的组织策略和长远规划 • 系统是否可靠,稳定 • 系统是否易于使用 • 系统是否便于维护 • 是否易于与其它系统相连
基于分类算法的软件缺陷原因

:S ; ; K e w o r d s D C A;m e a c h i n e l e a r n i n c l a s s i f i c a t i o n a l o r i t h m; d e f e c t u a n t i z a t i o n S QA g g q y
2 0 1 2年1 2月 第3 3卷 第1 2期
计算机工程与设计
C OMP UT E R E NG I N E E R I NG AN D D E S I GN
D e c . 2 0 1 2 V o l . 3 3 N o . 1 2
基于分类算法的软件缺陷原因分析
戴春博 , 傅 蓉 , 马 力
( ) 华北计算技术研究所 , 北京 1 0 0 0 8 3
摘 要 : 软件缺陷预防是软件质量保证的重要手段 , 而软件缺陷原因分析 又 是 软 件 缺 陷 预 防 的 核 心 任 务 。 针 对 当 前 的 缺 陷 原因分析方法对大型项目缺陷数据无法快速 、 深入地定位软件缺陷原因的 问 题 , 提 出 了 一 种 基 于 机 器 学 习 分 类 算 法 的 缺 陷 原因分析方法 。 通过对当前两种原因分析方法的比较 , 建立改进的缺 陷 量 化 方 法 ; 然 后 比 较 主 流 的 分 类 算 法 , 应 用 算 法 对 量化数据分类 。 实验结果表明 , 该方法有较好的实用效果 , 同时极大的减少了分析代价 。 关键词 : 软件缺陷原因分析 ; 机器学习 ; 分类算法 ; 缺陷量化 ; 软件质量保证 )1 中图法分类号 : T P 3 1 1 . 5 文献标识号 :A 文章编号 : 1 0 0 0 7 0 2 4( 2 0 1 2 2 4 6 0 3 0 6 - - -
软件缺陷管理

缺陷管理是软件开发及测试过程中对缺陷进行提交、沟通、修正、关闭、统计等一系列过程的总和,确保缺陷被跟踪管理,直到执行了缺陷管理的全生命周期。
在整个缺陷管理周期,主要包括以下几部分:1、缺陷发现:通过执行测试用例,发现软件缺陷的一种行为,是软件测试中非常重要的一个环节;只有发现了软件中的缺陷,才能涉及到之后的缺陷管理。
本次讨论的重点是缺陷管理,故缺陷发现部分简单介绍。
2、缺陷提交:缺陷的提交是整个缺陷管理中的重点,现市面上也有很多的缺陷管理工具,可以对缺陷进行提交、跟踪及管理。
在缺陷提交时,常见的缺陷描述如下:缺陷摘要(主题):是缺陷提交中最重要的部分;好的摘要应该包括简要描述(测试环境、软件模块、执行动作、缺陷现象等)、简单指出程序错误的依赖关系、简要指出程序错误的严重程度;要言简意赅、描述程序员最关注的对象,要求程序员通过查看缺陷摘要即可以知晓缺陷的大部分信息;检测时间:发现时间需要标注,以便跟踪;检测人:缺陷的发现人必须注明;检测项目:描述对应的项目编号;检测版本:什么软件版本出现的缺陷;缺陷描述:软硬件环境;测试软件模块;执行用例;操作动作描述;有必要的话把关键信息、日志信息、系统信息拷贝下来,以便开发人员查看;缺陷类型:功能缺陷?性能缺陷?稳定性缺陷?可靠性缺陷?可用性缺陷?界面缺陷?第三方缺陷?缺陷状态:新发现、修正、列入FAQ、待返测、已指派、已修正、已关闭、已否决、已反测等;引入原因:编码错误、设计错误、需求偏差、编码需优化、其它;优先级:低、中、高、非常高、紧急;严重程度:建议、轻微、一般、严重、致命;可以对缺陷的严重程度进行描述;缺陷发现阶段:单元测试、集成测试、系统测试、用户测试、上线运维?缺陷所在领域:硬件接口?硬件逻辑?软件驱动?软件接口?系统总体?缺陷分配人:一般是项目经理或程序员,最好是先分配给项目经理,再由项目经理决定分配给某开发人员;缺陷关注人:一般是项目经理或程序员,最好是先分配给项目经理,再由项目经理决定相关关注人;可重现:是,否;标识缺陷是否可以复现;估计修复时间:由项目经理和程序员估计;实际修复时间:由最终修复人员填写;关闭时间:由测试人员关闭,不能由项目经理及程序员决定;关闭与版本:由测试人员关闭,不能由项目经理及程序员决定;计划关闭版本:由测试人员关闭,不能由项目经理及程序员决定;3、缺陷修正:缺陷由项目经理指定到相关开发人员后,开发人员会对缺陷进行查看,有必要的话需要对当时的操作及缺陷现象进行复现,以便开发人员定位分析,有几点需要注意。
请简述关于软件缺陷的定义的五种理解
一、软件缺陷的概念在软件开发领域,软件缺陷是一个非常重要的概念。
简单来说,软件缺陷指的是软件系统中存在的问题或错误,它可能导致系统运行时出现意外的行为或结果。
软件缺陷可能是由程序员的错误、设计不足、测试不充分等原因导致的。
它可能会对软件的功能、性能和安全性产生负面影响,因此需要及时发现和修复。
二、五种理解软件缺陷的定义1. 工程角度从工程角度来看,软件缺陷可以被定义为软件系统在设计、开发、测试或运行阶段出现的功能性或非功能性错误。
这些错误可能源自于软件开发过程中的各个环节,如需求分析不清晰、设计不合理、编码错误、测试不充分等。
在工程角度上,软件缺陷是需要被及时发现和解决的问题,以确保软件系统的稳定性和可靠性。
2. 用户角度从用户角度来看,软件缺陷可以被定义为影响用户体验或满足用户需求的问题。
这包括软件的功能错误、界面设计不合理、性能不佳等。
对于用户来说,软件缺陷会导致他们无法顺利地完成任务,或者无法得到他们期望的结果,从而影响他们的工作效率和生活质量。
3. 质量角度从质量角度来看,软件缺陷可以被定义为不符合质量标准的问题。
这包括软件的可靠性、可维护性、可扩展性等方面的问题。
软件缺陷对软件的质量有直接的影响,因此需要通过严格的质量控制和测试手段来及时发现和修复。
4. 安全角度从安全角度来看,软件缺陷可以被定义为威胁软件系统安全性的问题。
这包括软件的漏洞、后门、逻辑错误等。
软件缺陷可能会被恶意利用,导致数据泄露、系统瘫痪或其他安全事件。
5. 经济角度从经济角度来看,软件缺陷可以被定义为对软件开发企业或用户造成经济损失的问题。
这包括软件的使用成本、维护成本、软件更新成本等。
软件缺陷可能会导致额外的开支或者机会成本,因此需要通过软件缺陷管理来降低经济风险。
个人观点和理解在我看来,软件缺陷是一个非常广泛且复杂的概念,它不仅仅是一个技术问题,还涉及到用户体验、软件质量、安全性和经济等方面。
对软件缺陷的定义和理解需要从多个角度进行综合考虑,以便全面地把握软件缺陷问题的本质,从而更好地管理和控制。
缺陷管理与分析系统的研究与开发
缺陷管理与分析系统的研究与开发作者:黄静旋李和平来源:《电脑知识与技术》2013年第05期摘要:通过对软件生命周期管理理论和软件质量控制方法研究分析,开发核心缺陷管理与分析系统,指导软件企业或部门建立完善的软件质量保证体系,实现有效的项目管理和过程控制。
关键词:缺陷管理与分析系统;软件质量控制方法中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2013)05-1052-02软件缺陷管理分析是项目管理过程中很重要的一个环节,它可以对软件开发的各个环节进行监控。
以往的软件项目开发中的缺陷跟踪都是通过EXCEL表格的形式来完成的,这种表格虽然也可以进行项目管理和项目执行度的交互,但效率与实时性不高,同时也不好维护和统计,因此就出现了缺陷管理系统,通过软件技术来解决软件项目的管理问题。
本项目旨在通过对软件生命周期管理理论和软件质量控制方法研究分析的基础上开发核心缺陷管理与分析系统,为用户提供测试管理、用例管理、缺陷建立、修改、查询、变更以及缺陷统计分析等功能,指导软件企业或部门建立完善的软件质量保证体系,并在此基础上实现有效的项目管理和过程控制。
1 基于缺陷的软件质量保障方法研究缺陷是软件质量最直观的反映,贯穿软件生命周期的各个阶段,并且覆盖软件生命周期的每一个环节,是软件质量管理的核心。
缺陷管理强调项目团队的有效沟通,实现对整个软件项目的管理。
缺陷管理可能涉及来自项目的各种元素,功能需求、设计、编码、以及文档等。
通过对缺陷的管理,让项目团队清晰地了解产品的质量、团队中各种角色对产品质量的贡献度,实现对软件的质量监控,从而对软件质量进行有效控制;缺陷分析可为项目质量的衡量与评定提供量化依据。
通过在大量实际软件测试数据的基础上,对现有缺陷预测模型进行分析,研究软件规模、测试粒度、用例强度等因素在系统测试过程中对软件缺陷分布的影响,从而预测评估出信息系统的质量趋势和质量风险。
缺陷分析结果,是用来评估当前信息系统质量状况的重要依据,通过对缺陷从不同维度进行分析,比如行业与应用领域分析,质量因素分析,功能模块分析,缺陷原因分析等,可帮助不同行业和应用领域的信息系统的建议方和开发方采取合适的对策及时发现和消除存在的缺陷,制定实施缺陷预防措施。
请简述关于软件缺陷的定义的五种理解。
软件缺陷是指在软件设计、开发或运行过程中存在的错误或不足之处。
它可能导致软件无法按预期运行,甚至会对系统安全性和稳定性造成严重影响。
软件缺陷可能来源于设计上的错误、代码编写不规范、测试不全面或用户需求不清晰等诸多原因。
1. 差错观:软件缺陷是由于软件开发过程中存在的疏漏和错误所引起的,这些差错可能包括需求分析不完善、设计不合理、编码错误等。
差错观强调了软件缺陷的内在原因,认为软件的错误来源于软件开发过程中的每一个环节。
2. 失效观:软件缺陷是软件功能无法满足用户需求或预定要求的失效。
失效观侧重于从用户需求和预期功能的角度来定义软件缺陷,也即软件未能按照既定的需求和规格进行正常操作。
3. 风险观:软件缺陷是软件运行过程中可能导致系统崩溃、数据丢失或安全漏洞的潜在隐患。
风险观认为软件缺陷不仅仅是当前的错误,更是未来可能带来的风险。
4. 问题观:软件缺陷是软件运行过程中可能引发的问题或障碍。
这些问题可能会影响软件或系统的性能、稳定性、可靠性或易用性。
5. 需求观:软件缺陷是由于未能满足用户的需求而产生的。
需求观认为软件缺陷是用户需求和软件实际功能之间的差异,只有满足用户需求,软件才能称为优质的产品。
从上述五种理解来看,软件缺陷不仅仅是简单的Bug或代码错误,更是一个复杂的系统工程问题,涉及到需求、设计、开发、测试和运维等多个环节。
解决软件缺陷需要全面、系统和持续的努力,同时也需要对软件缺陷有深刻和全面的理解。
软件缺陷是软件开发过程中的一种常见现象,但它也是一种非常危险的问题,因为它可能会导致软件系统无法正常工作,甚至会对系统数据的安全性和稳定性造成严重影响。
在软件开发的各个环节都可能存在缺陷,从需求分析、设计、编码到测试和运行,每一个环节都可能引发软件缺陷的产生。
对软件缺陷的认识和解决策略是非常重要的。
我们需要认识到软件缺陷产生的多种原因。
软件缺陷可能源自于需求分析阶段的不完善,如果需求不清晰、不明确或者不完整,那么在后续的设计和开发过程中就很容易产生缺陷。
基于深度学习的软件缺陷预测模型
基于深度学习的软件缺陷预测模型①陈 凯, 邵培南(中国电子科技集团第三十二研究所, 上海 201808)通讯作者: 陈 凯摘 要: 为了提高软件的可靠性, 软件缺陷预测已经成为软件工程领域中一个重要的研究方向. 传统的软件缺陷预测方法主要是设计静态代码度量, 并用机器学习分类器来预测代码的缺陷概率. 但是, 静态代码度量未能充分考虑到潜藏在代码中的语义特征. 根据这种状况, 本文提出了一种基于深度卷积神经网络的软件缺陷预测模型. 首先, 从源代码的抽象语法树中选择合适的结点提取表征向量, 并构建字典将其映射为整数向量以方便输入到卷积神经网络. 然后, 基于GoogLeNet 设计卷积神经网络, 利用卷积神经网络的深度挖掘数据的能力, 充分挖掘出特征中的语法语义特征. 另外, 模型使用了随机过采样的方法来处理数据分类不均衡问题, 并在网络中使用丢弃法来防止模型过拟合. 最后, 用Promise 上的历史工程数据来测试模型, 并以AUC 和F1-measure 为指标与其他3种方法进行了比较, 实验结果显示本文提出的模型在软件缺陷预测性能上得到了一定的提升.关键词: 软件缺陷预测; 抽象语法树; 卷积神经网络; 随机过采样; 丢弃法引用格式: 陈凯,邵培南.基于深度学习的软件缺陷预测模型.计算机系统应用,2021,30(1):29–37. /1003-3254/7726.htmlSoftware Defect Prediction Model Based on Deep LearningCHEN Kai, SHAO Pei-Nan(The 32nd Research Institute of China Electronics Technology Group Corporation, Shanghai 201808, China)Abstract : In order to improve the reliability of software, software defect prediction has become an important research direction in the field of software engineering. Traditional software defect prediction methods mainly design static code metrics and use machine learning classifiers to predict the defect probability of the code. However, the static code metrics do not fully consider the semantic features hidden in the code. According to this situation, this study proposes a software defect prediction model based on convolutional neural network. First, extract the characterization vectors from the appropriate nodes in the abstract syntax tree of the source code, and construct a dictionary to map them to integer vectors to facilitate input to the convolutional neural network. Then, a convolutional neural network is designed based on GoogLeNet, and the ability of the convolutional neural network to deeply mine data is used to fully mine the grammatical and semantic features of the features. In addition, this model uses the method of random oversampling to deal with the imbalance of data, and uses the method dropout in the network to prevent the model from overfitting. Finally, the historical engineering database on Promise is used to test the model, and AUC and F1-measure are used as indicators to compare with the other three methods. The results show that the proposed model has a certain improvement in software defect prediction performance.Key words : software defect prediction; abstract syntax tree; convolutional neural network; random oversampling; dropout计算机系统应用 ISSN 1003-3254, CODEN CSAOBNE-mail: Computer Systems & Applications,2021,30(1):29−37 [doi: 10.15888/ki.csa.007726] ©中国科学院软件研究所版权所有.Tel: +86-10-62661041① 收稿时间: 2020-05-19; 修改时间: 2020-06-16; 采用时间: 2020-06-23; csa 在线出版时间: 2020-12-311 引言随着现代软件的不断发展, 软件可靠性已经成为评价软件的关键因素. 软件规模的不断扩展和功能的日益增强, 软件复杂度不断上升, 软件缺陷出现的概率也不断上升, 从而导致软件的失败. 为了帮助开发人员和测试人员及时找到软件缺陷, 软件缺陷预测已经成为软件工程领域、数据挖掘领域的研究方向之一. 软件缺陷预测技术可以在一定程度上预测软件中是否存在着缺陷, 以此帮助相关团队快速了解软件的整体情况和质量, 制定相关策略测试和改善软件, 提高软件的可靠性和稳定性.基于此, 许多研究人员前赴后继潜心研究软件缺陷预测技术并尝试通过机器学习的方法来检测软件中是否存在着缺陷. 传统软件缺陷预测[1]是以手工获取软件度量特征的基础进行分类学习, 而特征选择的方法直接影响软件缺陷预测的准确性和稳定性. 而在以往的软件缺陷预测研究中, 通常使用静态软件度量作为代码的特征, 静态软件度量[1]主要包括以下几种方法:(1)代码度量代码度量是最直接、应用最普遍的度量方式. 通过对源代码相关指标的简单计数得到度量值. 度量包括总行数、代码行数目、注释行数目、空白行数目和代码及注释行总数目等, 通过对总行数、代码行数、注释行数等不同的处理方式, 度量结果就会不同.(2) McCabe度量McCabe度量是一种基于程序流程图的复杂性度量方法, 度量的是程序的复杂性, 主要包括圈复杂度、基本复杂度、设计复杂度等.(3) Halstead度量Halstead度量考虑了程序中出现的操作数和运算符, 具体有程序长度、操作符出现的总数量、操作数出现的总数量、程序容量、程序难度、程序级别、程序工作量等.(4) CK度量CK度量是面向对象程序的度量, 具体包括类方法复杂度带权和(WMC)、类在继承树中的最大深度(DIT)、继承树中类的直接子类个数(NOC)等.根据代码的实际情况, 选择合适的度量方法, 或在各种度量方法中选择合适的指标组成新的特征集合,然后根据从历史软件源码中提取出来的特征构建如逻辑回归、随机森林、支持向量机等分类器, 对新版本的软件源码进行软件缺陷预测, 以此来帮助编程人员找到可能包含缺陷的部分.然而, 传统软件缺陷预测方法使用静态代码度量作为特征, 未能充分考虑潜藏在代码中的语义特征, 这无疑会对缺陷预测造成影响. 而抽象语法树能够表达出源代码的语义, 已经有相关的论文[2]证实了其可以用于源码的完整性和缺陷的检测. 抽象语法树是基于源代码采用树状结构来描述代码上下文之间的关系,其中包含了程序模块的语法结构和语义信息. 从抽象语法树中提取表征用于软件缺陷预测, 可以充分考虑到代码的语法语义特征.近年来, 深度学习作为数据挖掘的技术之一得到了充足的研究. 在软件缺陷预测领域, 深度学习同样可以用于挖掘代码中隐含的特征. Iqbal等[3]介绍了用静态度量的方法获得特征, 然后用4种方法对特征进行投票, 选取出最合适的特征, 然后构建一个多层感知机(MLP)网络来对样本进行学习分类. Wang等[2]介绍了用多层受限玻尔兹曼机叠加而成的深度置信网络(DBN),自动提取源代码中的语法语义特征, 并用提取出来的特征构建软件缺陷预测模型. Li等[4]利用卷积神经网络(CNN)提取源码特征后, 将其与传统静态特征进行连结, 构建逻辑回归分类器来对软件缺陷进行预测. 然而, 这些方法依然存在着数据挖掘不足的问题, 所使用的网络大多是简单模型, CNN也仅使用单层卷积层.基于这种情况, 本文以抽象语法树为特征来源, 提出了一种卷积神经网路模型来进行软件缺陷预测, 并利用Promise官网上的历史工程数据来对模型进行实验, 取得了较好的结果.2 基于抽象语法树的代码表征能否从源代码中提取到合适的特征, 是影响软件缺陷预测性能的一个关键因素. 在过去的研究中, 常常用静态软件度量的方法来处理源代码, 忽视了潜藏在代码中的语义特征. 而本文使用了一种基于抽象语法树的方法来获取代码表征.2.1 抽象语法树抽象语法树(Abstract Syntax Tree, AST)是源代码关于抽象语法结构的树状表示, 源代码中的每一种结构都表征为树上的结点. 之所以说是抽象的, 是因为AST并不会将源代码的细节表示出来, 例如, 一串For 语句, 在结点中就记录为“ForStatement”以及一些关键计算机系统应用2021 年 第 30 卷 第 1 期要素, 而具体循环的内容并不会被记录下来. 另外, 抽象语法树并不依赖源代码语言的语法, 也就是说, 语法分析时所采用的是上下文无关文法, 因为在写文法时,通常会对文法进行等价的转换(消除左递归, 二义性,回溯等), 这样会在文法分析时引入一些冗余成分, 对后续阶段造成不好的影响.抽象语法树能有效保存代码的语法结构和语义信息. 如图1所示, 代码a和代码b十分相似, 且有着几乎一样的静态代码度量, 也就是说, 他们有着几乎一样的特征, 在特征空间中, 它们的距离会非常小, 用分类器分类的话, 很有可能将两份代码归为一类, 但显然代码a是没有缺陷的, 而代码b是有缺陷的, 这就造成了错误的检测结果. 图2展示两份代码的抽象语法树, 代码a的抽象语法树比代码b的抽象算法树多了两个结点, 在提取表征向量时, 两份代码在序列上就会有一定的区别, 而这种区别就可以方便模型区分两种代码, 得到更好的软件缺陷预测性能.图1 抽象语法树示例代码2.2 提取表征向量本文使用了一款开源的Python依赖包Javalang 来对源代码进行解析, 它提供了一个基于Java语言规范的词法分析器和解析器, 可以构造Java源代码的抽象语法树. 在得到源代码的抽象语法树后, 按照深度优先的顺序来遍历AST的所有节点, 然后主要选择以下3类结点作为抽象语法树的表征向量元素:(1)表示为方法调用的结点(2)表示为声明的结点, 包括方法声明、类声明、接口声明等(3)控制流结点, 譬如说条件分支、循环控制等根据结点的类型, 我们选取不同的要素来作为结点的特征. 对于第1类结点, 我们使用结点对应的方法名来作为结点在特征向量中的标识; 第2类结点选择结点的名称来作为标识; 第3类控制流结点选择节点的类型来作为标识, 比如表征条件分支的结点, 记录结点的类型名“IfStatement”作为该结点的特征. 表1列出了本文所使用的所有的结点类型.由此, 我们可以得到一棵树即一份代码的表征向量.2.3 整数向量映射从抽象语法树中获得的表征向量不能直接用于神经网络, 训练神经网络需要输入整数向量, 所以我们需要在获得的特征和整数之间建立一个映射, 将表征向量转换为整数向量.为了在获得的特征和整数之间建立映射, 我们建立一个字典[2]将表征和正整数一一对应起来. 将训练样本和测试样本中的代码全部提取为表征向量后, 统计各个特征的频率, 将其转换为对应的整数. 假设不同的特征的数量是m, 每个特征都有着对应的整数, 那么正整数的范围也是1~m. 具体的, 在从训练样本和测试样本中提取表征向量后, 首先, 计算各个特征在所有样本中出现的频数, 并且根据频数将它们排列; 然后,为排列好的特征建立一个序列字典, 频数高的特征排在前面, 这意味着出现频率越高的特征对应的正整数越小; 构建完字典后, 就可以将之前的表征向量转化为整数向量. 但因为神经网络的输入要求有固定的长度,为了避免向量过于稀疏, 选择适当的向量长度对向量进行处理. 如果一个向量的长度小于设定的长度, 那么我们就在向量末尾添0, 而0在神经网络的计算过程中没有意义; 如果一个向量的长度大于设定的长度, 那就在向量中寻找最大的正整数将它删去, 因为最大的整数对应的是频数最小的特征, 循环往复, 直到向量的长度符合设定的长度. 由此, 我们得到了每份源代码对应的整数向量. 图3给出了从源代码到整数向量的全部流程.2021 年 第 30 卷 第 1 期计算机系统应用图2 示例代码的抽象语法树表1 使用到的所有结点类型类别结点类型方法调用结点MethodInvocation, SuperMethodInvocation声明结点PackageDeclaration, InterfaceDeclaration, ClassDeclaration, MethodDeclaration, ConstructorDeclaration, VariableDeclaration 控制流结点IfStatement,WhileStatement, DoStatement, ForStatement, SwitchStatement, AssertStatement, BreakStatement,ContinueStatement, ReturnStatement, ThrowStatement, TryStatement, SynchronizedStatement, BlockStatement,TryResource, CatchClause, EnhancedForControl其他结点FormalParameter, BasicType, CatchClauseParameter, MemberReference, SuperMemberReference, ReferenceType图3 从源代码到得到整数向量的流程图(①从源代码中解析出抽象语法树; ②从抽象语法树中提取表征向量;③根据提取的特征构建字典; ④将表征向量映射为整数向量)计算机系统应用2021 年 第 30 卷 第 1 期3 卷积神经网络设计与结构卷积神经网络是一种含卷积计算且具有深度结构的前馈式神经网络, 具有表征学习、深度挖掘数据的能力. 卷积神经网络已经被证实在图像处理、语音识别、自然语言处理等领域有着不错的性能表现. 而且,卷积神经网络的隐含层内的卷积核参数共享、层与层之间的稀疏连接使得卷积神经网络能够以较小的计算量对格点化特征.3.1 数据预处理在软件缺陷预测领域, 数据分类不均衡问题是普遍存在的, 如何处理这种不均衡问题也是具有挑战性的. 在获得的数据集中, 往往有缺陷的样本数是要少于没有缺陷的样本数, 如果直接用这样的样本对模型进行训练, 训练出来的模型往往会对样本数量较少的类别的识别能力较弱, 在软件缺陷预测时, 模型便会偏向没有缺陷的结果. 因此, 我们需要对数据进行预处理以弥补数据集分类不均衡带来的偏差.一般而言, 针对数据集中存在的样本分类不均衡问题, 通常采用过采样或欠采样的方法来使得数据集中各类的样本数量达到均衡. 欠采样是从多数样本中随机选择和少数样本一样数量的样本, 以此构建分类平衡的数据样本, 但这样会大大减少数据的训练样本,造成信息的损失, 会造成模型的欠拟合, 因此我们选择过采样的方法来处理分类不均衡问题. 由于AST数值向量并非是特征向量, 所以类似像SMOTE[5]等基于样本间的欧式距离来生成新样本的分类不均衡处理方法并不一定适用. 因此, 在这里, 我们采取简单的随机过采样的方法来对数据进行预处理, 在少数样本即有缺陷的样本中随机选择进行复制, 使得有缺陷的样本数量和没有缺陷的样本数量保持一致, 以此保证数据类别间的均衡. 具体的算法如算法1所示.算法1. 随机过采样算法输入:分类不均衡的数据集D输出: 分类均衡的数据集D'(1)初始化已复制样本集合C为空集.(2)将数据集D复制, 组成数据集D'.(3)在数据集D中筛选出有缺陷的样本集d.(4)在数据集d中随机选择样本a, 如果a不在已复制样本集合C中,将样本a加入数据集D'和已复制样本集合C; 如果已复制样本集C的大小和d一样, 则清空C.(5)重复步骤(4)直至数据集D'中无缺陷样本和有缺陷样本数量保持一致.3.2 网络结构首先介绍所要构建的网络中用到的基础卷积块Inception块[6], 这个卷积模块的结构如图4所示.图4 Inception块如图4所示, Inception块含有4条并行的网络线路. 前三条线路所使用的卷积核大小分别是1×1、3×3、5×5, 以用来抽取不同空间尺寸下的信息, 第2, 3层会先对输入做1×1卷积操作以减少输入通道数, 以降低模型复杂度. 第4条线路会先使用3×3最大池化层, 然后接一个1×1卷积层来改变通道数. 并且, 根据4条线路的具体情况, 设置合适的填充来使得输入和输出的高和宽一致. 最后将每条线路的输出在通道维上连结, 以此完成卷积的功能, 将结果输入到下一层. 相较于普通的卷积层, Inception块因为使用了3个卷积层和1个池化层, 能够更深层次的挖掘数据中的特征,以此帮助模型进行更好的学习分类.为了能够更深层次地挖掘出潜藏在向量中的语法语义特征, 本文基于GoogLeNet[7]设计了一个卷积神经网络, GoogLeNet最初设计出来是用来进行图像处理的, 在I m a g e N e t图像识别挑战赛中大放异彩, GoogLeNet串联了多个Inception块来对图像进行深度挖掘, 以此进行更好的分类. 本文基于GoogLeNet设计一个卷积神经网络, 具体的网络结构如图5所示, 除了最后的输出层使用Sigmoid函数作为激活函数外, 其他层的激活函数均使用ReLU函数, 并且根据实际情况调整网络中各个层的参数, 网络整体分为主要分为以下3个部分:(1)输入层: 输入层主要是一个嵌入层[8], 嵌入层的主要作用是将输入的整数向量中的整数元素转换成整数向量, 使得向量可以进行卷积操作. 嵌入层有两个重要参数: 嵌入层字典的大小(num_embeddings)和每个产出向量的大小(embedding_dim). 这里, 本文将num_embeddings设置为2.3节构建的字典中所含有的2021 年 第 30 卷 第 1 期计算机系统应用特征的数量, 将embedding_dim设置为2.3节中通过映射得到的整数向量的长度. 将长度为n的整数向量输入到嵌入层, 嵌入层将给出一个n×n的矩阵向量. 并且,为了提高内存利用率和训练模型的速度, 本文选择分批量进行训练, 设置每次训练样本个数(批尺寸, Batch_ Size)为16, 即一次输入16个样本进行训练.(2)卷积部分: 卷积部分是网络的主体部分, 共由5个模块组成. 模块与模块之间使用步幅为2的3×3最大池化层来减小输出高度. 第1个模块包含3层的3×3卷积层; 第2个模块使用2个卷积层, 首先接一个64通道的1×1卷积层, 然后接了一个将通道数扩大3倍的3×3卷积层; 第3个模块串联了2个完整的Inception块; 第4模块串联了5个Inception块; 第5模块串联了2个Inception块. 通过多层的不同空间尺寸的卷积操作, 来深度挖掘数据中的特征, 从而进行性能更好稳定性更高的学习分类.(3)输出层: 输出层主要是根据之前卷积层输出的结果来输出分类结果. 首先使用一个全局平均池化层来将每个通道的高和宽都变成1, 然后接上一个全连接层, 输出通道数为标签类别数, 最后, 连结一个Sigmoid 函数构建逻辑回归分类器来计算程序代码的缺陷概率,从而得到分类结果.图5 网络结构图3.3 模型优化之前, 我们在数据预处理时采用随机过采样的方法来解决数据分类不均衡问题, 提升了模型的泛化能力, 但是这样也有一定的过拟合的风险, 因此我们选择使用丢弃法(Dropout)[9], 通过随机丢弃一部分神经元来避免过拟合. 在训练过程中, 随机丢弃一部分隐藏层神经单元, 即所有神经单元都有可能被清零, 这样就减少了神经元之间的依赖性, 输出层的计算也无法过度依赖任何一个隐含层神经元, 从而在训练模型时起到正则化的作用, 用来应对过拟合. 在测试模型时, 为了拿到更加准确的结果, 我们不使用丢弃法.另外, 在训练模型的过程中, 为了得到最优的模型参数, 我们需要根据损失函数的梯度不断地对参数进行迭代, 这里我们选择使用Adam[10]优化器来更新参数. Adam算法结合了AdaGrad和RMSProp两种优化算法的优点[10], 能够自动调整学习率, 并且参数的更新不受梯度的伸缩变换影响. Adam算法能够从梯度均值及梯度平方两个角度进行自适应地调节, 综合考虑梯度的一阶矩估计和二阶矩估计计算出更新步长, 而不是直接由当前梯度决定.4 实验与结果分析4.1 数据集为了评估训练出来的模型的性能, 本文从Promise[11]上下载了5个工程, 总共11个项目, 组成6组软件缺陷预测任务, 用于模型的测试. 在同一软件工程中, 将旧版本的工程项目作为训练集, 将新版本的工程项目作为测试集, 根据测试结果来评估模型的预测能力. 例如, 对于Camel工程, 我们将Camel 1.4版本的工程代码用来训练模型, 然后用Camel 1.6版本的代码用来测试模型. 表2列出了测试时所使用的软件项目的基本信息.表2 测试使用的工程信息工程版本平均代码数平均缺陷率(%) Camel 1.4, 1.691818.1Lucene 2.0, 2.220955.7 Synapse 1.0, 1.1, 1.221225.5Poi 2.5, 3.041364.0Xalan 2.6, 2.784447.3另外, 在数据集中, 每个项目不仅含有工程的源代码, 还统计了源代码的静态代码度量和缺陷注释, 度量方法主要是针对面向对象编程的静态代码度量, 具体的指标内容如表3所示. 这些指标可以用于其他的软件缺陷预测方法, 来和本文模型进行比较.计算机系统应用2021 年 第 30 卷 第 1 期表3 数据集中所使用的20个静态代码度量简写全称LOC Lines of codeDIT Depth of inheritance treeNOC Number of childrenRFC Response for a classCBO Coupling between object classesLCOM Lack of cohesion in methodsLCOM3Lack of cohesion in methodsNPM Number of public methodsDAM Data access metricMOA Measure of aggregationMFA Measure of function abstractionIC Inheritance couplingCAM Cohesion among methods of classCBM Coupling between methodsAMC Average method complexityCa Afferent couplingsCe Efferent couplingsAvg(CC)Average McCabeMax(CC)Maximum McCabeWMC Weighted methods per class4.2 评估指标本文采用AUC[12]和F1-measure[13]这两个指标来评估模型性能, AUC主要用来评估模型的识别缺陷的能力, 而F1-measure主要用来评估模型的稳定性.在二分类的学习预测过程中, 根据分类结果可以将其分为4类: (1)若一个实例为正类且被预测为正类,即为真正类(True Positive, TP); (2)若一个实例为正类但被预测负类, 即为假负类(False Negative, FN); (3)若一个实例为负类但被预测为正类, 即为假正类(False Positive, FP); (4)若一个实例为负类且被预测为负类,即为真负类(True Negative, TN). 基于这4个数据, 可以得到击中概率(TPR)和虚报概率(FPR), 其计算公式如式(1)和式(2)所示:然后以FPR为横轴, TPR为纵轴, 就可以绘制出ROC曲线, 而ROC曲线下的面积就是AUC. 根据AUC的定义, 识别能力更好的模型对应着更高的TPR 和更低的FPR, 所以有AUC值越大的预测方法越好.F1-measure是精确率(P)和召回率(R)的调和平均, 其中精确率和召回率的计算公式如式(3)和式(4)所示:通常情况下, 我们希望精确率越高越好, 召回率也越高越好, 但事实上这两个指标在某些情况下是矛盾的, 而F1-measure则综合考虑了这两个指标. F1-measure 的计算公式如式(5)所示.另外, 用于评估软件缺陷预测模型的指标还有很多, 例如MCC[14]和G-mean[15], MCC考虑所有的有缺陷数据和无缺陷数据来综合评估预测结果和真实结果之间的关系, G-mean是在数据不平衡时十分有参考价值的一个指标, 但因为AUC和F1-measure综合评估了模型的准确性和稳定性, 具有广泛的代表意义.4.3 实验方法为了能够正确估计模型对于软件缺陷预测的性能,将本文提出的模型与以下3种方法进行比较:(1)静态代码度量+逻辑回归(LR): 以数据集中提供的20个静态代码度量作为代码特征, 并用逻辑回归的方法进行分类(2)深度置信网络+逻辑回归(DBN)[2]: 使用深度置信网络从源代码中提取特征, 然后使用逻辑回归的方法进行分类(3)卷积神经网络+逻辑回归(CNN)[4]: 利用单层卷积神经网络对源代码进行特征提取, 然后使用逻辑回归分类器得到分类结果对于传统软件缺陷预测算法, 因为使用的是20个静态代码度量所构成的特征向量, 所以在数据预处理时, 可以使用SMOTE方法进行过采样来处理数据集分类不均衡问题; 而对于DBN、CNN和本文模型, 只能简单地采用随机过采样的方法来对数据进行预处理.本文使用Python环境以及深度学习框架PyTorch 来实现本文提出的模型, 所有的实验均在一台带有NVIDIA GTX 1080的Linux服务器上运行. 此外, 因为随机过采样和丢弃法都具有一定的随机性, 因此实验中每个方法都执行10次, 取平均值来进行模型性能的比较.4.4 实验结果及分析本文采用AUC和F1-measure来比较4种方法在2021 年 第 30 卷 第 1 期计算机系统应用6组预测任务上的性能. 表4和表5分别记录了这4种方法关于AUC和F1-measure的实验结果, 每次测试任务的表现最好的已在表格中加粗.表4 4种方法关于6项测试任务的AUC 训练集测试集LR DBN CNN本文模型Camel 1.4Camel 1.60.5990.6410.6870.709Lucene2.0Lucene2.20.6280.6260.6350.641 Synapse1.0Synapse1.10.6000.6390.5940.646 Synapse1.1Synapse1.20.6370.6970.6220.674Poi2.5Poi3.00.6650.6510.7100.718Xalan2.6Xalan2.70.6510.6830.6750.674平均值0.6300.6560.6540.677表5 4种方法关于6项测试任务的F1-measure 训练集测试集LR DBN CNN本文模型Camel 1.4Camel 1.60.3550.3420.4890.513Lucene2.0Lucene2.20.6110.6660.7090.724 Synapse1.0Synapse1.10.4440.4570.4560.461 Synapse1.1Synapse1.20.4710.4930.4870.473Poi2.5Poi3.00.7070.7160.7560.776Xalan2.6Xalan2.70.6330.6420.6540.681平均值0.5370.5530.5920.605表3和表4分别列出了4种方法关于每个测试任务的AUC值和F1-measure. AUC评估了模型分类的准确性, 而F1-measure评估了模型的稳定性. 从表3和表4中我们可以看到, 总体而言, 本文提出的模型在软件缺陷预测性能方面和模型稳定性明显优于LR、DBN 和CNN的. 而本文模型的AUC和F1-measure的均值也都高于其他方法, 这也证实了本文提出模型的合理性和可行性. 此外, 从两张表中我们可以看出, 相较于传统的软件缺陷预测方法, 应用深度学习方法在软件缺陷预测性能和模型稳定性上都得到一定的提高. 这也证实了, 在软件缺陷预测性能方面, 深度学习方法优于传统的机器学习方法.综上所述, 针对传统软件缺陷预测方法中对源代码语义特征挖掘不足的问题, 本文测试实验结果表明,在软件缺陷预测领域, 相比于传统的预测方法, 应用深度学习方法得到了一定的提高. 而本文也根据前人的工作, 提出了用多层卷积神经网络对基于抽象语法树得到的表征向量进行分类学习, 有效提高了缺陷预测的准确性.5 结束语本文针对传统软件缺陷预测方法应用静态代码度量而忽视代码语义的缺点, 从代码的抽象语法树中提取出向量, 再利用卷积神经网络深度挖掘数据的能力挖掘代码中的语法语义特征, 从而对软件缺陷进行学习分类. 并且, 通过与LR、DBN、MLP方法的实验比较, 由AUC和F1_measure两个指标我们可以看出本文提出的模型在软件缺陷预测性能上得到了一定的提高. 然而, 关于数据集分类不均衡、模型优化等问题,本文的处理方法相对粗糙, 这也是未来需要继续研究的方向.参考文献刘童. 基于机器学习算法的软件缺陷预测技术研究[硕士学位论文]. 武汉: 华中师范大学, 2018.1Wang S, Liu TY, Tan L. Automatically learning semantic features for defect prediction. 2016 IEEE/ACM 38th International Conference on Software Engineering. Austin, TX, USA. 2016. 297–308.2Iqbal A, Aftab S. A classification framework for software defect prediction using multi-filter feature selection technique and MLP. International Journal of Modern Education and Computer Science, 2020, 12(1): 18–25. [doi:10.5815/ijmecs.2020.01.03]3Li J, He PJ, Zhu JM, et al. Software defect prediction via convolutional neural network. 2017 IEEE International Conference on Software Quality, Reliability and Security.Prague, Czech Republic. 2017. 318–328.4Chawla NV, Bowyer KW, Hall LO, et al. SMOTE: Synthetic minority over-sampling technique. Journal of Artificial Intelligence Research, 2002, 16(1): 321–357.5Szegedy C, Ioffe S, Vanhoucke V, et al. Inception-v4, Inception-ResNet and the impact of residual connections on learning. Proceedings of the 31st AAAI Conference on Artificial Intelligence. San Francisco, CA, USA. 2017.4278–4284.6Tang PJ, Wang HL, Kwong S. G-MS2F: GoogLeNet based multi-stage feature fusion of deep CNN for scene recognition. Neurocomputing, 2017, 225: 188–197. [doi: 10.1016/j.neucom.2016.11.023]7Mikolov T, Sutskever I, Chen K, et al. Distributed representations of words and phrases and their compositionality. Proceedings of the 26th International Conference on Neural Information Processing Systems. Red Hook, NY, USA. 2013. 3111–3119.8Ba LJ, Frey B. Adaptive dropout for training deep neural 9计算机系统应用2021 年 第 30 卷 第 1 期。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
0 I 论坛o T
S IN E&T C N L G F R TO CE C E H O O YI O MA I N N
21分析研究
吕方 兴
( 菏泽 学 院计算 机 与信 息工 程 系 山东
菏泽
241) 7 0 5
【 摘 要】 本文介绍 了为什 么要预防软件缺 陷, 并且详细 阐述 了软件缺 陷预防的原则和步骤。 【 关键词 】 陷预防 ; 缺 软件过程 ; 优化过程 ; 防反馈 预
识缺陷 的同时 , 尽可能收集缺陷信息 。 并填写问题报告 。该报告包括 : 缺陷位置 、 发现缺陷的方式 、 问题 报告者 、 问题描述 、 产生缺 陷的阶段 、 缺陷预防是软件项 目管理 的新课题 . 也是 软件项 目管理 的更高要 缺陷的种类以及缺陷可能的原因等 求 C MM将其列为 软件过程等级 的最高级——优化过程 。 32 缺陷原因分析 . 寻找和修复错误要消耗掉大量 的软件开发和维护成本 如果把 审 在着手进行缺陷预防时 , 我们必 须以新的方式认识缺 陷。以前 的 查、 测试 和返工 的成本 包括在 内。 那么会有一 半的资金被用 在发现 和 重点是怎样修复缺陷 , 有时也包括怎 样更有效地发现缺陷 。而现在更 清除错误上。 更糟 的是 , 修改过的软件往往更容易出错。 这就是人们常 需要 的是了解问题 的起 因。这通 常要 了解 程序员的真实想法 . 因此程 说的 . 好产 品一开始就 是好的 , 决不 是改 出来 的。随着社会 需求的增 序员就成为原因分 析工作 的基本组成部分 当然并 不需要把每一个制 长. 需要设计越来越大 、 越来越复杂的软件 . 而且 这些 软件将用于越来 造缺 陷的程 序员都 找来分析一遍 . 重点 是对 软件的缺陷要有更高层次 越敏感 的应用 领域 . 可靠 性要求更高 . 而软件本 身的错误可 能越来越 的认 识 . 要分析 缺陷 的类别及倾 向性 问题 . 分析 的信息量 控制在最 将 多. 越来越难以承受。 小范 围之内 为此人们想到了能不能预防缺陷?进行缺陷预 防的理由包括 : 在 旦发现了一类 缺陷 , 就应尽早 分析原 因。通常是在充分掌握相 软件开发 的过程 中. 随着时间 的推移 . 寻找和修 复缺 陷的成 本会成指 关信 息的基 础上举行 原因分 析会议 。会议 的目标是确定如下问题 : 数地增长 : 即使在开发 过程的初期 . 预防缺 陷的代价通常也 比发现和 ① 是什 么原因导致 了缺 陷? 修复它们低。 ② 主要 的原因种类是什 么? 惠普公司在介绍其 缺陷预防的经验 中指 出 : 1 有 1 3以上 的错误是 ③ 为 了预 防该类 错误或缺 陷再 次发生 .需要采 取哪些措施 与行 由于不 熟悉用 户对界面的需 求而引起的 通过建立大量 的原型和设计 动? 评 审计 划 . 大地减 少了产品发布后的缺陷数 。在他们 4次公布的缺 极 ④应怎样安排这些行动 的优先级? 陷数据中 . 前两次 发布后发现 的缺陷所 占的百分 比为 2 %. 3 5 第 次降 原 因分析会议 的成果是一份关于缺陷问题的详细报 告。 到了 1%以下 , 4 0 第 次则为零 。 可见缺 陷预 防是可以实现 的。 惠普公司 33 缺陷预 防行动 - 消除缺 陷的过程 正是 我们所要研究 的缺陷预防过程 至此. 主要 问题就 是采取实 际预防行动 . 而不再 是通过专家组 研 究, 必须有管理人员 的参与 , 也必须分配职责并跟踪执行情 况。 缺陷预 2 缺 陷预 防 的原 则 防行 动需要一支行动组 。该组的成员应包括 : 软件工程 领域已经设计 出了许 多缺陷预 防的方法 . 如形 式化的规 ① 负责执行行动 的管理人员 , 通常是过程组的领导。 格说 明、 改进 的设计 技术 、 面向对象技 术和原 型技术 。 这些技术以及其 ②一位过程组代表 。 他技术创新将有 助于我们设计 出高质 量的软件 。但是实践 表明 . 即使 ③培训经理 采用 了这些先进 的技术 . 一个 没有 经过规范培训与严格科 学管理的 在 ④一位工具和方法方面 的专家 。 组织 中 . 照样得不 到高质量 的软件产 品。 ⑤来 自 相关产 品组的管理层代表。 软件 缺陷预 防的基本思想 与 目标就是 确保错误在 被标识并被 解 ⑥质量保证人员 决后不会再一次发生 。聪 明的人可 以避免两次犯 同一个错误 . 聪明的 ⑦配置管理人员 。 组织也应如此 。 但是对一个组织来说难度将会大得多 。 软件项 目无法 行动组 的职责是 : 靠个别人来完成 , 也不能零零散散地进行 。 因为所有人员都参与其中 . ①设置各行动项 的优先级 所 以就要改变整个组织 ②为优先级高 的项制订实现计 划。 软件缺陷预 防的准则包括 : ③分配职责 。 ①程 序员必须对 自己的错误 做 出评价 。他们最适 合进行此项 工 ④跟踪执行状况 。 作. 并且能从 中获得最大 收获 ⑤ 向管理人员汇报进展情况 ②反馈是缺 陷预 防的基本组成部 分。如果不及时加强行动 . 工作 ⑥确保能发现所有的成功事迹和所有负责任 的人 。 人员将无法一致地改进正在进行 的工作 ⑦继续进行下一优先级的项。 ③能解决所有 问题 的“ 万灵丹 ” 是不存在 的。 软件过程改进要求每 34 预 防 反 馈 - 次只能清除一个错误原 因 这是一个 长期 任务 . 因为有多少种错误类 建立反馈系统 , 以确保开发人员能得知其 改进行动 的结果 。 型, 就会有多少错误原 因。 多实实 在在的小改进 , 比任何 一次短期 35 改进过程以预防缺陷 许 要 . 的突破要好得多 为配合缺陷预防 . 需要改进软件过程 . 其要素有 : ④过程改进必须是整个软件开发过程 的有机组成部分 。 由于过程 ①对相关缺陷预防方法进行评 审 的变化量在不断增长 . 因此在缺陷预 防上投入 的人力和制订 的规格说 ②将来 自过程任务的数据输入 过程数据库 。 明应该与在缺陷检测和修复上投入的人一样多 这就要求我们 去构建 ③召开原因分析评审会议 . 其作为检查问题和提 出改进建议任 将 和设计过程 。 实施审查 和测试 , 立基线 . 出问题报告 , 建 写 并跟踪 和控 务的一部分