近期对软件行业也给出了很多鼓励政策,软件及相关行业在中国得到了很大的发展,我们也看到了一大批软件企业在国际中也占据了很重要的地位。不过我们发现很多软件公司在重视代码开发的同时,却没有把代码质量跟上去,忽略了测试在整个项目工程的重要性。

可是测试真的是不重要,只是开发的附属品吗?我们列举一个例子说明:美国微软,该公司的开发人员和测试人员的比例是1:1,也是说每个开发人员会配备一名测试人员,而且这名测试人员都是具有和开发人员一样的开发能力的,可以进行大规模自动化测试。微软重视测试的原因也很简单,因为在宽带普及以前,很多更新都是靠邮寄光盘完成的,更新的成本非常高,一定要在出厂前严把质量关。对于一个纯软件公司是如此,那么我们的一些有硬件产品的公司,如果产品是因为软件上面出现了重大缺陷,大规模硬件召回的成本是不是会更高呢?目前在国内,很多的企业也认识到了测试的重要性,可是只是停留在认识阶段,只是做做简单的黑盒测试,功能性测试等。有的负责人也许会谈到,我们的产品是基于互联网产品,软件大部分都是在服务器端,更新的成本大幅降低。那么我们更应该做好产品,让广大的客户端用户对产品有更好的用户体验,给网友们更好的服务,而不是一味的借助于网络更新,在使用中发现错误后去弥补。近一次的暴风影音的“召回门”是一个很好的说明。

对于一些正在成长中的中小企业,由于人力资源有限,目前还没有比较正规的测试,我们还可以理解。可是一些已经形成规模,有一定研发力量的大型企业,是很有必要建立一整套完整的测试流程来完善公司的产品。但是在和大公司负责人沟通得知和我们的期望值还是有一定差距的。他们可能花了大量的人力,物力来通过 CMM,ISO认证,却不能踏实的做好测试。在他们眼里,认证才是一个公司的硬实力体现,测试则是一个可有可无的过程。这一点让人有点黯然,在中国的快餐市场上,我们该如何推动我们软件测试,不是靠你和我,而是靠全民总动员,大家要培养这个意识,把这个意识和行动穿叉在我们研发的全部过程中,难道我们还做不出好的产品吗?

这让我马上我想到了已经和联通签约马上进入中国的IPhone,可以说这一款手机改变了整个世界对手机的使用习惯。IPhone的成功,个人观点,软件质量的稳定性可靠性是为关键的一票。

在我们和客户聊到测试的时候,他们说也是有心无力,只能通过人为的做一些简单的测试来应付。于是我们会给他们介绍一些自动化的测试工具的时候来协助测试,这些企业普遍表现了对这次测试工具的兴趣。不过,这些工具的价格立即扼杀了他们抓测试的信心,他们无法接受一张光盘的叫价超过一辆汽车,他们更喜欢实物。可是他们忘了,软件的价值不是体现在一张光盘上面,而且体现在这个软件能给企业,给人们生活带来的益处。

诚然,价格,技术和企业愿望是目前测试在中国走的很艰难的原因。目前一些测试培训机构也是在积极培养专门的测试人才。我们也希望有国内的企业能做出我们自己比较好的测试工具来打破测试工具昂贵的价格坚冰。我相信有那么中国的软件质量一定会在世界上有属于自己的一席之地。

在这里,也结合我个人的经验,按照开发V模型来分别讲讲几个对应的自动化测试工具。

在软件开发初级阶段,对应于代码做静态分析。目前很多的企业都没有做静态分析,甚至还有企业不太明确静态分析。在这里给大家推荐的工具是QAC和PC-lint。

PC-lint在国内的用户基础比较好,这个工具出来的比较早,由一个大学教授编写,而且价格也不贵,只有命令行模式是它的局限性,检查的代码规则不多。目前有部分企业用这个工具做代码静态分析。

QAC这个工具进入国内也有一段时间,不过推广力度不是很大,目前这个工具在外资企业的研发部门的推广的比较好,国内的一些大企业和一些测试评测中心也在使用该工具,该工具使用起来比较方便,界面形式,也支持命令行模式,还有是MISR的标准制定者之一,所以比较有权威性,专业性很强,在国内也有很好的技术支持。价格相对来说比较贵了。

然后动态单元测试这块,可以看看parasoft旗下的几款产品,有分别针对java语言的,C++语言的版本。该工具使用起来还比较方便,是基于Eclipse框架开发的,界面友好,功能也比较强大,在上海有office.当然是价格不太让人接受。

当然如果只是要做内存泄露这块,可以了解一下parasoft旗下的一个工具insure++。这个工具可以实施监控内存的一个使用情况。

如果是做嵌入式这块单元/集成测试,用户与也可以使用IPL的Cantata++和IBM的RTRT,这两个工具在针对嵌入式这块的单元/集成测试比较强大,特别是Cantata++还支持自动的打桩,封装,这个也是该工具的一个亮点。

上篇中提到要对这几个概念做说明的,这这里作个补充:CANTATA++举例:

1)打桩是对被测函数外部调用的替代,是用来对没有开发的或用户开发的模块进行模拟。对系统函数,由于Cantata++已经作了移植,都可直接使用,不用也不能打桩。不能打桩时,接口数据无法验证。

2)使用封装的before功能,可检测对外部调用的参数数据、全局数据是否满足测试时的要求;并且可以修改参数、全局数据的值,使得外部函数按照测试的要求运行。例如嵌入式应用中经常将一个数据转换为指针,然后使用指针操作相关的内存数据,但在主机环境测试时,由于内存保护,指针指向的地址为空,程序飞了。在这种情况下可以使用before功能定义变量,将变量的地址传送给被调用的函数,从而完整地验证功能和覆盖率。

3)使用封装的after功能迫使外部调用返回很难实现或无法达到的条件,从而使被测模块的功能和分支都得到验证。如在主机环境下对malloc函数封装,在一般情况下是无法实现返回空指针的结果。
利用Cantata++封装的after功能修改返malloc函数返回值为NULL指针,这样被测函数的错误处理功能得到验证。

如果需要对代码做一个质量度量,推荐使用一个质量度量工具McCabe,这个工具不需要执行代码可以完成代码走查,对代码有一个深层次的代码度量,提供多达几十种度量。操作起来很方便,只是要熟悉这个产品,需要对产品有一定的理解,对项目管理有很大的帮助。

至于后面的版本管理工具,CVS,VSS,我在这里不做太多的介绍。