UML软件工程组织

 

 

有效利用白盒工具提高代码质量

2008-11-06 来源:51CTO.COM

 

代码质量是在软件满足了设计功能的前提下,对软件代码执行的可靠性、稳定性和高性能的一种更高的要求。如何能够有效提高代码质量,又节约程序员查找和修复bug的时间,成了一个难题。白盒测试工具的引入,恰好解决了这一难题。本文将通过多个专题,阐述程序员如何有效利用白盒测试工具,提高代码质量和开发效率。

提高代码质量的巨大经济收益

从提高软件投资回报的角度出发,企业应在降低开发成本的同时,提高软件的可用性,这就意味着尽量减少应用程序中的bug和性能缺陷。而由于代码编写过程的人为因素,代码中的bug是不可避免的。据统计,每千行软件代码中,就可能存在20到30个bug。在无法避免bug产生的情况下,如何发现并及时消除这些bug,就成了提高软件投资回报的唯一可行办法。

首先,我们来看看修复一个bug所需要的成本。在软件交付周期的不同阶段,修复一个bug所需的成本差别非常之大。越是到了软件交付的后期,修复bug越困难,成本也就越高。从图1可以看出,在测试阶段修复bug的代价是开发阶段的几倍,而一旦产品上线,进入维护期后,所需的代价更是达到几十倍。

根据国际上的经验,在测试阶段修复一个bug的时间往往要比在代码编写阶段要多出15到75倍。

因此,越早发现bug,越早解决,企业所付出的代价就越小。我们建议在软件进入测试阶段之前就解决掉大部分的bug,即交付高质量代码的意义所在。

提高代码质量的几个关注点

代码质量是在程序满足了设计功能的前提下,对软件代码执行的可靠性、稳定性和高性能的一种更高的要求。为了保证交付给测试人员的代码能够满足上述质量方面的要求,在开发阶段应该对代码进行如下方面的测试:
1.静态代码分析

为保正团队内各程序员之间编写习惯的一致性和规范性,消除容易导致错误的语法隐患,通常会制定一系列的编程规范。静态代码分析,即要求程序员对所有代码行进行规范性检查,消灭潜在隐患,提高代码的可靠性。

静态代码分析的好处在于能发现大量潜在的软件缺陷。比如下面一段VB .NET代码中,使用Asc()函数返回ASCII码。

If (Asc(mChar) <> 13) And (Asc(mChar) <> 10) Then

从语法上分析,这段代码是完全正确的。但若mChar为空,Asc()就会抛出ArgumentException错误,导致程序异常或中断。因此,从代码可靠性的角度出发,在使用Asc()之前,应对引用的字符串作判断,如下:

If Len(strchars) > 0 And strchars <> nothing Then Ascii = Asc(strchars)

这样,就可以避免潜在的异常错误。而类似的这样问题,IDE的语法检查通常没有办法,只有通过手工或自动化的代码检查来发现和解决。

没有经过静态分析的程序可能跑起来不错,而实际上可能像一块奶酪一样,满身是漏洞,问题一出现就很严重而且直接面对问题的是可能是最终用户。

2、代码覆盖率分析
只有经过充分测试的代码,质量才是有保障的。而程序员在做单元测试时,往往很难遍历所有的分支情况,尤其是程序对错误输入的反应往往被忽略。因此,对代码的测试覆盖率分析是保证交付高质量代码的关键。利用一些代码覆盖率检查工具,不仅可以了解代码的整体测试水平,也能够指出未经过测试的代码,给程序员以方向上的指引。

3、运行时内存分析
内存往往是导致严重性能故障的根本原因,而一些不良的编程习惯经常会导致运行时的内存泄露。这类问题几乎无法通过单元测试或功能验证来发现,而又经常被程序员忽视,直到软件投入生产后才逐渐暴露出来,这时再查找和修复内存问题就非常困难了。因此,应尽量在代码交付之前消灭内存问题。运行时内存分析,即在代码调试阶段,对所有对象的内存占用状态的运行时分析,查找内存泄露的隐患。

运行时内存分析的第一步就是内存使用的监控,以便了解在运行期间,程序对内存的使用和释放情况,查找程序对内存的不当使用。

如下图所示,在A点位置,程序稳定运行,对内存的使用也基本稳定。在B点,我们打开程序的某个窗口时,程序使用了更多的内存来储存新的对象。当窗口关闭时,这些对象被释放,内存也应随之释放。而从图上B点之后的内存使用情况来看,这些内存并没有被释放。因而,可能存在着内存泄露。在C点和D点再次打开前面的窗口,内存还是不断增加而没有回收。可以断定,该窗口对应的代码存在内存泄露的问题。

虽然无论是Java还是.Net,都提供了自动的内存回收机制,但内存泄露仍是引起应用系统性能劣化的一个主要原因。除此之外,运行时的内存分析还应深入的对每个对象、方法的内存占用进行分析,以便为内存使用的优化提供方向。

4、性能分析和优化

代码的执行效率,直接影响着应用程序的可用性和可靠性。因此,软件的性能问题应该在开发阶段就充分加以考虑,提高代码的执行效率,而不是把性能问题全部留到压力测试阶段去解决。

性能分析和优化,即要求在代码提交之间,对每一个功能实现的响应时间以及每个方法的效率进行分析,并对运行效率较低的代码进行优化,从而提高代码的整体性能,保证交付高质量的代码。

程序员总是被要求优化某段代码,缩短执行时间,但这并不是一件容易的事情。困难就在于,代码执行是一个非常复杂的过程,包含了太多的分支和无数的方法、代码行,往往让程序员无从着手。这就需要借助一些动态的代码分析工具,帮助程序员了解每个方法及代码行的执行效率,从而有针对性地对那些执行时间最长的方法或代码行进行性能改进。动态代码分析工具应能够提供诸如运行期间调用了哪些文件、方法、代码行,每个文件、方法和代码行的执行时间、对总体运行时间的影响程度等等。有了这些信息,程序员就能够找出影响执行时间的关键路径,有效改进代码性能。

5、 线程分析、错误检测

在Java编程中,线程是一个非常好的技术,它可以让程序更加灵活 更加强大。但是,线程技术的误用 同样也会带来非常严重的问题,而且线程问题是最难定位和修复的问题之一。在代码交付之前,程序员应充分分析和判断代码执行过程中是否存在线程死锁以及代码在什么位置使用了锁和同步机制等等,避免将线程问题拖延到系统测试阶段。与性能分析类似,线程的死锁很难通过手工的方式去判断,必须日借助动态的代码分析工具,了解线程间的调用次序、同步机制以及判断死锁。

告别“刀耕火种”的手工时代

随着软件应用环境的日趋复杂,对软件质量的要求越来越高。而随着敏捷式开发等新的开发方式的出现,开发的周期越来越短。显然,再依靠过去人工的方式逐行Review代码、统计测试覆盖率、查找bug等,实在是力不从心。幸运的是,越来越强大的白盒测试工具的出现,弥补了这一点人力的不足。

自动化白盒工具的引入

目前市场上存在着多种多样的白盒测试工具,有的是只为某项测试而设计的开源软件,如仅限于代码覆盖率的检查,也有功能强大、覆盖面广的商业套装软件,如Compuware的DevPartner系列、IBM的Rational系列工具等。笔者在这里简单介绍几款主流工具,供有兴趣的读者参考。

1、Compuware DevPartner工具。

虽然Compuware在国内的知名度还不是很高,但在北美市场,其白盒测试工具DevPartner却是声名远播、屡屡获奖,在最近的Visual Studio杂志的2008年工具评选中,其DevPartner Studio再次赢得了最受读者青睐奖 。

DevPartner主要有面向.Net和Java两个版本,提供代码覆盖率统计、静态代码检查、内存分析和性能分析等多种分析手段,使用相对简单,可以与Visual Studio或Eclipse等开发工具IDE集成,但暂时还没有中文版本。

2、IBM Rational工具集
IBM的Rational系列也是一套为广大读者熟知的白盒工具集,如用于覆盖率检查的PureCoverage和内存检查的Purity。Rational系列工具对使用人员的专业技能要求较高,要想把这个工具用好,要求每个成员至少有两年的使用经验。

3、C++ Test
C++ TesT是ParASoft公司出品的一个针对C/C++源代码进行自动化单元测试的工具,支持白盒测试、黑盒测试以及回归功测试。C++ Test对于简单的静态代码分析和边界测试来说,是一款非常不错的工具,但由于自身性能问题,笔者认为不适合用于大型项目的开发。

如何挑选白盒测试工具工欲善其事,必先利其器。挑选一款合适的白盒测试工具,能够有效的提高代码质量和节约开发人员的时间。下面笔者就结合自己所知,尝试解读挑选白盒测试工具的几个考虑因素。

1.功能因素

首先,应考虑工具支持的语言和平台。目前主流测试工具支持的开发语言包括.Net和Java,针对不同的语言,实现方式一般有较大差异。其次,选择适合的功能。并非功能越丰富越好,而是应该选择适用于自己应用场景和测试要求的工具。若对软件质量的要求较为严格,如军工、航天软件,则需要更多、更强的的白盒测试手段支持。若一般的自用或简单商用软件,则可以考虑某些功能简单又有较强针对性的工具,甚至是开源工具。再次,要考虑工具的集成能力。那些提供与开发环境向集成的白盒测试工具,能够避免程序员在开发和调试阶段在多个窗口之间频繁切换,节约宝贵的时间。

2、价格因素

任何一个软件的开发,都必须考虑成本的压力。对功能的要求越高,相应的工具软件肯定越昂贵,例如Rational就不是每个企业都负担得起的。

3、易用性

在选择白盒工具时,还要考虑到使用人员的技术素养以及工具的易用性。某些工具虽然功能强大,但易用性不高,需要较长时间摸索学习。一般,提供网上下载试用的工具会有比较好的易用性,如Compuware的DevPartner。
如何有效利用白盒工具提高代码质量

为了让读者对白盒工具的使用有一个直观、深入的认识,本文将分为四个专题,选择白盒测试的典型应用,阐述如何利用白盒测试工具提高代码质量。

1.静态代码分析(JAVA)

2.运行时内存分析(JAVA)

3.性能优化及分析(JAVA)

4.运行时内存分析、死锁检测以及测试覆盖率分析(JAVA)

 

组织简介 | 联系我们 |   Copyright 2002 ®  UML软件工程组织 京ICP备10020922号

京公海网安备110108001071号