广义上讲,测试是指软件产品生存周期内所有的检查、评审和确认活动,如设计评审、系统测试。狭义上讲,测试是对软件产品质量的检验和评价,它一方面检查软件产品质量中存在的质量问题,同时对产品质量进行客观的评价。
Glen Myers对软件测试提出了以下观点:
(1) 测试是一个程序的执行过程,其目的在于发现错误;
(2) 一个好的测试用例很可能是发现至今尚未察觉的错误;
(3) 一个成功的测试用例是发现至今尚未察觉的错误的测试。
总体来说,软件测试的目标在于以最少的时间和人力系统地找出软件中潜在的各种错误和缺陷。建立正确的目标具有重要的心理因素,如果测试的目标是证明软件是正确的,那么人们就会选用那些使程序出错可能性较小的数据作为测试用例;如果测试的目标是证明软件中有错,那么人们就会选用那些易于发现程序错误的数据作为测试用例。所谓"好"与"坏"或称"成功"与"失败"的测试用例,也同样有心理学的问题。
下面是软件测试的一些基本原则,了解这些原则有助于理解测试的整个过程。
完全测试程序是不可能的
人们对测试的直接想法就是进行完全测试,找出所有的软件缺陷,但这是不可能的,即使最简单的程序也不行。例如,假设一个程序P有输入量X和Y及输出量Z。在字长为32位的计算机上运行。若X、Y取整数,按黑盒方法进行穷举测试,可采用的测试数据组的个数为232×232
= 264。如果测试一组数据需要1毫秒,一年工作365× 24小时,完成所有测试需5亿年。
软件测试是有风险的
如果不能测试所有的情况,那么就是选择了风险。软件测试人员应该掌握的原则是如何将无边无际的可能减少到可以控制的范围,以及如何针对风险制订作出明智抉择,去粗存精。如图5.1说明了测试量和发现的软件错误数量之间的关系。

图5.1 软件项目的最优测试量
如果试图测试所有情况,费用将大幅增加,而软件错误漏掉的数量并不会因费用上涨而显著下降。如果减少测试或者错误确定测试对象,那么费用会降低,但是会漏掉大量的软件错误。我们的目标是找到合适的测试量,使测试效果最好。
开发人员或开发组织不应测试自己设计的程序
开发和测试生来就是不同的活动。开发是创造或者建立什么东西的行为,一个模块或者整个系统;而测试的唯一目的是证明一个模块或者系统工作不正常。这两个活动之间有着本质的矛盾,一个人不太可能把两个截然对立的角色都扮演的很好。基于这个想法,应该限制开发者在测试中的参与,给他们比较合适的任务是进行有可能的最低层的测试,即单元测试。
当一个程序员在完成了设计和编写程序的建设性工作后,要一夜之间突然改变他的观点,设法对程序形成一个完全否定的态度,那是非常困难的。所以,大部分程序员都由于不能使自己进入必要的精神状态,即不是抱着要揭露出自己程序中错误的态度,因而不能有效地测试自己的程序。除了这个心理学问题之外,还有一个重要的问题:程序中可能包含由于程序员对问题的叙述或说明的误解而产生的错误。如果是这种情况,当程序员测试自己的程序时,往往还会带着同样的误解致使问题难以发现。这并不意味着程序员不可能测试自已的程序,不过相比之下,如果由另外-些人来进行程序测试,就会更有效且更成功。
软件测试由独立测试机构承担有许多好处,所谓独立测试是指软件测试工作由在经济上和管理上独立于开发机构的组织进行。独立测试可以避免软件开发者测试自己开发的软件,还可以避免软件开发机构测试自己的软件。软件产品的开发过程受到时间、成本和质量三者的制约,时间和成本指标便于衡量,而质量却很难度量,因此在软件开发过程中,当时间、成本和质量三者发生矛盾时,质量最容易被忽视,如果测试组织与开发组织来自相同的机构,测试过程就会面临来自与开发组织同一来源的管理方面的压力,使测试过程受到干扰。
采用独立测试方式,无论在技术上还是管理上,对提高软件测试的有效性都具有重要意义。
测试无法显示潜在的软件错误
软件测试只能证明已发现的软件错误,却无法报告潜在的软件错误,也不能保证软件错误全部找到。唯一的办法是继续测试,可能还会找到一些软件错误。
测试用例需要认真设计
在测试用例的设计中,不仅要有确定的输入数据,而且要有确定预期输出的结果。测试用例的设计不仅要有合理的输入数据,而且要有不合理的输入数据。在实际工作中有这样的情况,当以特殊方式使用软件时,常常会突然发现软件中存在许多错误,因此,使用预期不合理的输入数据进行软件测试,比用合理的数据收获要大。
找到的软件错误越多,就说明存在的软件错误越多
软件错误就像寄生虫一样,发现一个之后,就会接二连三地找到更多。换句话说,软件中的错误似乎是成群出现的。例如,在IBM370的某个操作系统中,由用户发现的错误有47%集中在4%的模块中,尽管至今还没有人能对这种现象作出令人满意的解释,但这一现象告诉人们,为了提高测试效率,要集中对付那些容易出错的程序段。
并非所有的软件错误都能修复
在软件测试中,令人沮丧的现实是,即使竭尽全力,也不是所有的软件错误都能够修复。由于时间紧迫、修复风险太大、不值得修复等原因,开发人员也许暂时不纠正所发现的错误,但是对是否修复的决策一定要由软件测试人员、项目管理人员和开发人员共同参与,认真评价不同的观点,避免做出错误的决策。
测试人员在产品小组中不受欢迎
软件测试人员的任务是检查和批评同事的工作,挑毛病,公布发现的问题,因此,这项工作不受人的欢迎。测试人员应该保持与小组成员的和睦关系,建议采取以下的工作态度:
* 尽早找出软件错误,避免产生更大的影响;
* 发现严重错误时注意控制情绪,不要过分炫耀自己;
* 不要总是报告坏消息,平时注意与开发人员的沟通和交流。
总之,测试是一项非常复杂的、需要有创造性和高度智慧的任务。虽然已经有了一些测试方法,但都不是很完善,使用时仍然需要测试人员的经验和创造力。
|