随着项目的复杂度日趋复杂,设计及实现的重构日趋频繁,项目对过程质量管理的要求也越来越高。项目质量管理所涉及的内容是多方面的,本文根据过程质量管理的实践积累,结合作者所管理项目的质量提升过程,讲述了几种项目过程质量管理方法的组合应用,并对项目质量管理工作的一些心得及经验进行了总结。
一、过程质量管理—-前言
软件项目的质量管理指的是保证项目满足其目标要求所需要的过程,它涵盖了项目开发的整个生命周期,从项目初期质量计划的编制、质量目标的设定,到项目需求分析、设计、实现、测试等过程中的质量控制、质量保证,到最后的项目验收。本文并不涉及项目质量管理的所有方面,而是描述了所在项目对质量控制的几种具有代表性的重要手段,并将项目质量控制工作的一些心得与大家分享,真诚希望能够为进行改进的组织带来帮助。
二、过程质量管理—背景
在宝信研究开发部,所有项目的开发均遵循CMM/CMMI的过程模型,成熟的过程使得这些项目的质量一直保持在一个可控的范围内,且随着组织过程的持续改进与完善,项目的质量也在持续不断地提升。
在部门过程的指导下,作者所管理的项目的定量项目管理工作不断深入,且建立了项目级的过程能力基线。通过对以往项目的历史数据的分析以及多个项目的积累,项目组陆续在同行评审、静态代码分析、自动化测试、持续集成等几方面进行了深入的探索,并逐步将项目的过程质量管理提升到一个更高的水平。
三、过程质量管理—做法与实践
1、同行评审
小规模、高覆盖率、高频率的同行评审。
同行评审是由同行对软件工作产品实行的有组织、有计划的检查,以找出缺陷和需要更改的地方。同行评审的基本目标是在软件工程过程的早期,通过协助软件开发人员标识和修复其工作中的错误,改进软件质量。在以往的项目实践中,虽然项目组在项目的各个阶段都进行同行评审活动,但由于一些方面的原因(例如执行时间、频率),使得同行评审没有达到预期的效果。例如,对于需求说明书,如果在所有功能模块都分析完成后才进行同行评审,很显然,花1~2小时的时间去评审一份长达上百页、花费数周完成的文档,效果是可想而知的。
针对同行评审执行效果不佳的问题,项目组在每次评审的规模、评审覆盖率及评审频率三方面进行了改进。对于每次评审的规模,项目组认为不应过多,最好是进行小规模的同行评审,例如,每次评审一个需求用例、一个模块的接口设计、一个实现类的代码等等,随着每次评审规模的减小,每次评审将更具针对性,当然也就能发现更多的潜在缺陷。由于评审规模的减小,每次评审的覆盖率将极大提升,例如,花1小时从1万行源代码中选择500行代码进行评审,评审的覆盖率为5%,而花10分钟评审100行代码,则可以做到100%的覆盖率。小规模、高覆盖率的同行评审是一种“轻量级”的同行评审,每次评审均只针对一个原子级的工作产品(例如一个用例、一个类等),在这种“轻量级”的评审方式的推动下,项目组的同行评审活动的频率非常高,平均达到每周进行6~7次同行评审,且每次都力争做到100%的覆盖率,这使得项目组的同行评审缺陷密度较之历史数据提升了数倍。
2、自动化测试
高覆盖率的单元测试、功能验证测试、界面测试及负载测试。
自动化测试是保证项目质量的一种重要手段,随着项目的复杂度日趋复杂,设计及实现的重构日趋频繁,自动化测试在项目质量控制中的作用将更加显着。在项目的需求、设计及编译阶段,项目组就始终如一地贯彻了自动化测试的思想。提起自动化测试,首先让人想到的就是单元测试,确实,项目组引入的第一种自动化测试便是单元测试。单元测试是一种白盒测试,针对实现代码进行逻辑验证。单元测试的引入虽然提升了项目质量,但由于单元测试主要关注于“单元”,因此,对于功能模块的集成、用户需求的验证以及性能的测试,单元测试就难以满足要求了。
经过几个项目的实践及改进,在单元测试的基础上,项目组陆续引入了功能验证测试、界面测试及负载测试。功能验证测试是对用户操作场景进行集成测试,以验证用户提出的需求是否实现;界面测试则是通过录制测试脚本,模拟用户对软件进行操作,以达到功能测试的目的;按照一定的策略,通过模拟多个用户并发操作,可以进行项目的负载测试。功能验证测试、界面测试及负载测试是对单元测试的重要补充。
目前,过程质量管理项目组通过单元测试、功能验证测试、界面测试及负载测试等的配合使用,非界面代码自动化测试的代码覆盖率达到80%左右,主场景界面的测试覆盖率达到60%左右,这极大地降低了项目的缺陷密度,使得项目的质量提升到一个较高的水平。
3、静态代码分析
静态代码分析是对同行评审及自动化测试的有力补充及支持。
与自动化测试、同行评审对应的,在编码阶段,项目组还引入了新的静态代码检测工具(FxCop,集成到VisualStudio2005TeamSuite中),通过静态代码检测,项目组发现并解决了包括安全性、性能、可靠性、可移植性、命名规范等方面的大量缺陷。静态代码分析同时具备了同行评审及自动化测试的部分特点,静态代码分析所发现的缺陷与同行评审缺陷类似,但却具备了自动化执行的优点。静态代码检测的引入间接地提升了人工代码同行评审的效率,因为它使得项目组人为进行的代码同行评审更关注于一些逻辑方面的、“更高层次”的缺陷。
通过将静态代码分析与源代码管理工具的签入策略相结合,可以保证只有通过静态代码分析的源代码才能被签入,从而从管理的角度将静态代码分析的作用提升了一个层次。
4、持续集成
持续集成是各种质量控制手段的综合表现形式。
许多项目组把持续集成简单地等同为日编译,认为只要项目每天都进行编译,项目组就拥有了持续集成的能力,但持续集成真的只是做项目最基本的编译工作吗?事实上,编译只是持续集成中的很小一部分,持续集成是各种质量控制手段的综合表现形式。
经过几个项目的实践及改进,项目组在持续集成上的积累也越来越多,如下图所示。如果说源代码管理、基线管理、日编译、一键部署及发布、静态代码分析、自动化测试、缺陷跟踪及管理等都是进行项目质量控制的重要方法的话,那么持续集成就是定期、按时、并严格遵循各种方法的质量控制执行者。
四、过程质量管理—成果
经过多个项目的积累及改进,项目组在质量控制方面的能力得到了较大的提升。
1、缺陷方面
随着同行评审、静态代码分析、自动化测试、持续集成等几方面执行力度的加强,项目组的测试缺陷密度明显降低,如图:
项目测试缺陷密度,图中蓝实线的纵坐标是1、0
与测试缺陷密度对应,项目组的同行评审、静态代码分析、自动化测试等发现的缺陷数量明显上升,以近期项目组的编码阶段的同行评审缺陷密度为例,缺陷密度中值为24、975个/千行,相对于历史相似项目提升了近5倍。
项目组编码阶段同行评审缺陷密度控制图
2、工作量方面
由于项目组在同行评审、静态代码分析、自动化测试、持续集成等几方面的工作开展较好,使得大量的缺陷在需求、设计及编码阶段被发现并解决,这也使得项目组在测试阶段的缺陷及花在解决缺陷上的时间非常少;与历史相似项目数据比较,项目组最近一个小版本在测试阶段的工作量约为历史数据的1/5。
由于项目质量的提升,产品发布后,现场支持的工作量也明显减少。与历史相似项目数据比较,项目组最近一个小版本发布后,现场支持的工作量约为历史数据的1/3。
五、过程质量管理小结
项目质量管理涉及的方面较多,而本文过程质量管理只是描述了所在项目对质量控制的几种具有代表性的重要手段,但这几种手段确实对提升项目的质量起着至关重要的作用。其实同行评审、自动化测试、静态代码分析、持续集成等都不是什么新概念,相信大家也都有比较深刻的了解,但通过改变执行的策略及加强执行的力度,确实起到了与众不同的效果,对项目质量的提升也是非常显着的。