发布新日志

  • 什么是软件测试?

    2007-12-07 02:43:30

     在G.J.Myers的经典著作《软件测试之艺术》(The Art of Software Testing)中,给出了测试的定义:“程序测试是为了发现错误而执行程序的过程”。这个定义,被业界所认可,经常被引用。除此之外,G.J.Myers还给出了与测试相关的三个重要观点,那就是:

      测试是为了证明程序有错,而不是证明程序无错误;

      一个好的测试用例是在于它能发现至今未发现的错误;

      一个成功的测试是发现了至今未发现的错误的测试。

      实际上,这里暗示了“软件测试”在不同侧面上的含义,也就决定了对软件测试不同的定义和不同的理解。根据作者多年的经验和理解,软件测试的不同视野,概括为如下5类:

      软件测试的狭义论和广义论——静态和动态的测试

      软件测试的辨证论——正向思维和反向思维

      软件测试的风险论——测试是评估

      软件测试的经济学观点——为盈利而测试

      软件测试的标准论——验证和确认

      1. 软件测试的狭义论和广义论

      G.J.Myers所给出了测试定义——“程序测试是为了发现错误而执行程序的过程”,实际是一个狭义的概念,因为他认为测试是执行程序的过程,也就是传统意义上的测试——在代码完成后,通过运行程序来发现程序代码或软件系统中错误。但是,这种意义上的测试是不能在代码完成之前发现软件系统需求、发现设计上的问题,把需求、发现设计上的问题遗留到后期,这样就会可能造成设计、编程的部分返工。增加软件开发的成本、延长开发的周期等。需求阶段和设计阶段的缺陷产生的放大效应会加大。这非常不利于保证软件质量。这种狭义论是受软件开发瀑布模型影响。

      正是为了更早地发现问题,所以将测试延伸到需求评审、设计审查活动中去,也就是将“软件质量保证”的部分活动归为测试活动。实际上,在软件开发实际操作中,常常将软件测试和质量保证——这两种努力(efforts)合并起来。

      延伸后的软件测试,被认为是一种软件测试的广义概念。这就引出软件测试的两个概念“静态测试”和“动态测试”,如 测试方法的辩证统一 (1)所述,这样就由静态测试和动态测试构成一个全过程的、完整的软件测试,而且静态测试显得更为重要。

      2.软件测试的辨证论

      G.J.Myers的第2个观点“测试是为了证明程序有错,而不是证明程序无错误”,引出了软件测试的另外一个争论,软件测试究竟是证明所有软件的功能特性是正确的呢?还是其反向思维——对软件系统进行各种试探和攻击,找出软件系统中不正常或不工作的地方呢?从我个人理解,这两个方面都有一定道理,前者(证明所有软件的功能特性是正确的)是从质量保证的角度来思考软件测试,后者(证明程序有错)从软件测试的直接目标和测试效率来思考,两者应该相辅相成。在后者的思想背景下,我们认为,测试不是为了证明所有的功能可以正常工作,恰恰相反,测试就是为了找出那些不能正常工作、不一致性的地方。也就是说,测试的一般工作就是发现缺陷 (detect bug),即在软件开发过程中,分析、设计与编码等工作都是建设性的,而测试是带有“破坏性”的工作。

      对于不同的应用领域,两者的比重是不一样的,如国防、航天、银行等软件系统,承受不了任何系统失效,因为一次系统的失效完全有可能导致灾难性的损失,所以强调前者以保证非常高的软件质量。而一般的软件服务应用则不同,强调后者,质量目标设置在“用户可接受水平”,不要国度追求质量,从而可以降低软件开发成本。作者建议,在我们实际操作中,可以分阶段实施不同的测试思想,在早期阶段集中在“证明程序有错”—— 发现Bug,后期集中在验证所有特性是否正常工作——降低风险,见作者的另外一篇讨论:测试执行中非常有效的策略

      下面就是这两种观点的基本描述:

      验证软件是验证软件是“工作的”,以正向思维,针对软件系统的所有功能点,逐个验证其正确性。其代表人物是软件测试领域的先驱Dr. Bill Hetzel (代表论著《The Complete Guide to Software Testing》)。

      证明软件是“不工作的”,以反向思维方式,不断思考开发人员理解的误区、不良的习惯、程序代码的边界、无效数据的输入以及系统的弱点,试图破坏系统、摧毁系统,目标就是发现系统中各种各样的问题。其代表人物就是上面多次提到的G.J.Myers。他强调,一个成功的测试必须是发现Bug Bug的测试,不然就没有价值。
  • 测试新手从何处入手(转贴)

    2007-12-02 16:17:17


      当你刚被聘用到一个测试小组时,作为新手,可能你应该按别人指定的测试计划执行测试。这并不是说你没有能力制定这样的计划,而是别人制定的测试计划可能比你的好(这是一个公认的事实)。按别人的计划执行,并记下那些可以用不同方式完成的部分和优秀之处。用不了多久,你就有自己作主的权利了,最开始要从你负责组件的测试计划作起。充分利用你的笔记和经验,这有助于你在第一次就能够写出一个高效、专业的测试计划。
        当你在执行其他人的计划时,你可以考虑另外可尝试的测试用例。有一些可能不适用,但对于软件其他部分仍是好的测试用例,只是不是你负责的而已。不要低估自己作为测试人员的能力,要相信自己也能发现好的测试用例。
        制定测试计划时应该考虑可用的资源和需要组织涉及参与的活动。不管是低级别的计划还是高级别的计划,都需要详细地规定工作的责任人、各人的工作任务,以及任务完成的时间。没有经过彻底交流过的计划是不可能有效的。最无效的计划就是那些没人知道其存在的计划。
                                                     谢谢: 踏雪无痕
  • 给新人的几点建议(转贴)

    2007-12-02 15:53:06

    看到越来越多的新人加入到测试的行业当中是一件欣慰的事,这也说明测试作为一个新兴行业正在不断发展,相较于软件行业中的其它职业――例如软件开发,测试行业还显得比较稚嫩和混乱,人员水平也是良莠不齐,我想就个人经验谈几点看法。

    1.从何入手?
    刚开始接触测试,头脑里面还没有什么概念,心里也没底,不知道测试到底是做什么,怎么做。对于这样的朋友我建议可以先看看各种各样的文章和随笔,先把眼界拓宽,了解测试中有哪些相关概念,接触得越多越好,这样才不至于思维狭窄坐在井底就以为看到了整个世界。初期阶段我不建议匆匆忙忙去看一些测试书籍,因为书籍主要是理论性的抽象,对于实际工作指导作用不高,而且这时候还缺少基本的判断能力,很容易被一些过时或者滥竽充数的书籍所祸害。打好基础以后,再找些有针对性的书籍来深入学习效果会更好。

    2.没有编程经验可以做测试吗?
    很多人问过这个问题,那么有没有想过什么不学习编程呢?做测试编程经验并不是必须的,在开始测试的初期阶段。但是想要做好测试,专业化测试,那么编程技术你就必须当作一项基本技能来掌握。试问如果对软件的内部结构不清楚,又怎么可能会很好地知道产品如何工作呢?小时候我们对闹钟很好奇,可能就会打开它再把各个零件拆下来仔细研究,如果没有动手拆卸的勇气而只是抱着闹钟在那里呆呆地看着,就很难知道闹钟的工作原理。国外很多的测试人员都是在做了多年的开发之后转换过来的,国内由于一些特殊原因,测试工作常常交给一些新手去做,而且还有一种“重女轻男”的说法,一直没搞懂是为什么。

    3.充分利用互联网
    Internet是我们最好的老师,你所需要的一切都可以在这里找到。在测试领域没有笨蛋,只有懒汉,你没有别人做得好不是因为你天资不够,而是你不如别人努力。大家如果遇到了什么问题应该积极在网上寻找答案,国内的几个论坛如果不能帮你解决问题的话,一定要勇敢走出去,到国外的一些论坛和网站去找寻答案。基本上一些商业工具供应商都有一些专门的顾问和技术支持人员活跃在一些大型论坛和官方网站解答各种问题,对于所有的提问都是一视同仁耐心解答。

    4.面试注意事项
    找工作的时候除了充分表现自己以外,也要注意观察面试的公司。一般来说面试都会和你以后的直接领导有所接触,留意他的问题,因为好的问题有时比好的答案更重要。从提问的技巧可以看出你的领导有多少斤两,如果遇到一个无知的领导那么可要慎重考虑这份工作了。那么如何判断呢?如果他的问题基本都是泛泛而谈,那么很可能这人对测试理解不深,相反,一个资深的测试人员问题很有针对性,而且可能会根据你的答案提出新的问题,而不是像考试一样一二三条这样死板地问下来。总而言之,你在找工作的同时,企业也在招人才,所以面试时要保持平常心,如果希望了解多一些不妨主动提出一些问题,看看对方如何回应。

数据统计

  • 访问量: 3258
  • 日志数: 6
  • 建立时间: 2007-12-02
  • 更新时间: 2008-01-10

RSS订阅

Open Toolbar