究竟什么是软件测试?

上一篇 / 下一篇  2012-06-14 11:36:07

“什么是软件测试”是一个最基本的问题,但凡从事软件测试的人都能回答这个问题,而且多数测试人员的答案不外乎是下面两种叙述的一种:

  软件测试是为了发现程序或软件系统中问题而进行的一系列活动。

  软件测试是为了验证程序或软件系统是否符合设计要求、是否符合满足客户的需求。

  这并没有错,也就是软件测试认识的正向思维和逆向思维的不同观点的表现:

  证明软件是“不工作的”,以反向思维方式,不断思考开发人员理解的误区、不良的习惯、程序代码的边界、无效数据的输入以及系统的弱点,试图找出各种各样的问题。毕竟开发人员力求构造软件,所以开发人员的思维方式以正向为主,测试人员的工作可以看做开发工作的一个补充,逆向思维更为重要,而且这样的工作效率也更高。

  验证软件是验证软件是“工作的”,以正向思维,针对软件系统的所有功能点,逐个验证其正确性。这是传统工业的质检工作在软件业的自然延伸。

  但仅仅这样理解软件测试还不够,需要更全面的理解软件测试,就可以更好地做好工作,也可以适应不同的软件开发过程所带来的挑战,包括敏捷方法带给软件测试的极大挑战。

  将近30年前,在G.J.Myers的经典著作《软件测试之艺术》(The Art of Software Testing)中,给出了测试的定义:“程序测试是为了发现错误而执行程序的过程”。那时对软件测试的认识还非常具有局限性,这也是受软件开发瀑布模型的影响,认为软件测试是编程之后的一个阶段。只有等待代码开发出来之后,通过执行程序,像用户那样操作软件发现问题,这就是“动态测试”。

  如果在此时发现功能设计不合理或性能不好,就需要修改需求或修改设计,那就不得不返工到需求定义或系统设计阶段,造成很大的代价。所以,有必要将软件测试延伸到需求、设计阶段,对需求、设计进行验证,因为需求定义文档、设计的技术文档也都是产品的组成部分,即阶段性的成果输出,只要有输出就需要验证。通过需求评审、设计审查活动,可以更早地发现问题,及时地修正问题。这就是静态测试,即对软件开发过程中阶段性产品进行互为评审、走读或会议评审,发现其中的问题。通过静态测试,可以更早地发现问题,把问题消灭在萌芽之中,将每个阶段产生的缺陷及时清除。所以,通过需求评审、设计评审和代码评审等,能够提高产品的质量,并能大大降低企业的成本。

  软件测试是由“静态测试”和“动态测试”构成,不仅仅对软件的主题——程序进行检验,还有对阶段性半产品也要进行检验,确保软件开发过程中的输出都能满足要求。所以,软件测试是贯穿整个软件开发生命的质量保证活动,是软件质量保证的重要手段之一。从本质上看,软件测试还是事后检验,是对产品(包括阶段性产品和最终产品)的检验,也就是说对产品质量的评估。通过对软件产品的各个质量属性(功能、性能、安全性、兼容性、易用性等)进行检查,从而了解软件产品在这些方面满足事先设定要求的程度。从这个意义上看,软件测试是对软件质量的全面评估,以决定软件产品能否发布出去。而且,通过对软件质量的全面评估,了解、确定开发人员容易犯的错误,为软件开发过程的改进提供依据。贯穿整个软件开发生命的软件测试活动,就可以看作对软件产品质量的持续评估。所以,在敏捷方法中,不仅提倡持续集成,而且提倡持续测试,就是持续的质量评估,如图1所示。更重要的是,持续集成是为了持续测试、持续的质量评估。

图1 软件测试是持续的质量评估

  同时,我们知道“不能穷举测试”,即对复杂的或大规模的软件系统,测试的覆盖度不能做到100%,即使能够百分之百地覆盖代码、分支和条件,也不能百分之百地覆盖路径组合、不能覆盖各种输入数据、各种使用条件和环境的组合等。所以,软件测试总是存在风险的,软件的风险还来源于需求不明确、标准不够充分。从风险角度看,软件测试是找到最大的风险、主要的风险,从而消除这些风险。举一个例子,当你的经理给你安排一个测试任务时,按照实际情况和高质量的要求,要完成这个任务需要两周时间,现在你的经理只给你一周时间。这时,你当然可以争取更多的测试时间,但是如果你的经理说,时间不能商量,只能给一周时间,而且也没有更多的人可以给。这时,你也无需拒绝任务,也无需加班,而只是设法缩小测试范围,按照测试优先级来决定测试的工作,并将更大的风险告诉经理。也就是说,两周的测试会消除更多的风险,包括非常小的风险,达到非常高的质量水准。而一周的测试会增加风险,但我们可以消除绝大部分的主要风险,只是承担一些比较小的风险,也能达到较高的质量水准。在基于风险的测试概念下,首先,我们要评估测试的风险,功能出问题的概率有多大?哪些是用户最常用的20%功能——Pareto原则(也叫80/20原则)?如果某个功能出问题,其对用户的影响有多大?然后根据风险大小确定测试的优先级。优先级高的测试,优先得到执行,一般来讲,针对用户最常用的20%功能(优先级高)的测试会得到完全执行,而低优先级的测试(另外用户不经常用的80%功能)就不是必要的,如果时间或经费不够,就暂时不做或少做。

  “一个好的测试用例是在于它能发现至今未发现的错误”,体现了软件测试的经济学观点。实际上,软件测试经济学问题至今仍是业界关注的问题之一。经济学的核心就是要盈利,盈利的基础就是要有一个清楚的商业性目标。同样,商业性目标是否正确,直接决定了企业是否盈利的结果。多数情况下,软件测试是在公司内的执行。正是公司的行为目的,决定了软件测试含义或定义的经济性一面。正如,对软件质量的定义不仅仅局陷于“和客户需求的一致性、适用性”,而且要增加其它的要求——“预算内、按时发布、易于维护”。软件测试所花费的成本可以看作是保障性成本,而由于软件缺陷引起的成本是劣质成本,从经济观点来看,当保障性成本小于或远远小于劣质成本,软件测试的工作才有意义。所以,软件测试也不可能无止境地进行下去,也是适可而止,即软件测试的目标是“足够的好(good enough)”,而不追求完美。这一点,在敏捷开发中、在互联网软件行业体现得更为充分。

  从标准论来看软件测试,可以定义为软件测试就是“验证(Verification)”和“有效性确认(Validation)”活动构成的整体,即软件测试 = V&V。

  “验证”是检验软件是否已正确地实现了产品规格书所定义的系统功能和特性。验证过程提供证据表明软件相关产品与所有生命周期活动的要求(如正确性、完整性、一致性、准确性等)相一致。相当于,以Spec为标准进行软件测试活动,验证软件产品和Spec的一致性。

  “有效性确认”是确认所开发的软件是否满足用户真正需求的活动。相当于,保持对软件需求定义、设计的怀疑,一切从客户出发,理解客户的需求,发现需求定义和产品设计中的问题。这主要通过各种软件评审活动来实现。

  究竟什么是软件测试呢?综上所述,软件测试是贯穿整个软件开发生命周期、对软件产品(包括阶段性产品)进行验证和确认的活动过程,是持续的质量评估过程,其目的是尽快尽早地发现在软件产品中所存在的各种问题,尽最大可能消除软件质量问题所带来的风险,使企业获得良好的竞争力和效益。


TAG:

 

评分:0

我来说两句

Open Toolbar