11/06/2008

Notes: "The Art of Software Testing" - 1


  虽然从事软件开发工作也有一段时间了,但因主要专注于开发,对测试的一致停留在直观了解的层次上。最近读了这本关于测试的经典著作,对很多概念有了更加清晰而系统的了解。特此记录从书中学到的一些理论和概念,其中也加入了一些自己平时工作的经验和体会,以作自己知识的总结、也方便以后的回顾。


The Art of Software Testing


Part I - 关于测试的基本理论



一、测试心理学

1. 测试是为发现错误而执行程序的过程,而不是为了证明没有错误.这背后的原因在于:

  1). 人类的行为总是倾向于有高度的目标性,确立一个正确的目标有着重要的心理学影响.将目标设置为找到错误,那么发现问题的几率将会增加.
  2). 人们在面对完成的可能性较大(更加现实)的任务时,表现出的效率和积极性更加的高.将软件测试定义为发现错误的活动,而不是证明没有错误,会让这个活动的目标更加切实可行.
  3). 当程序作了不应该做的事情时,也是一种错误.测试过程也许要覆盖程序不应该做的事情.

2. 软件的开发,是一个建设性的过程;而软件测试,则是一个破坏性的过程.

3. 我们希望最后的程序达到这个目标:"做了该做的,没做不该做的."但是通过不断去寻找程序中的错误和问题,是达到这个目标的最佳途径.


二、软件测试的策略

1. 黑合测试 - 数据驱动的测试或者输入输出驱动的测试.测试的目标与程序的内部机制和结构无关.从软件规范出发,进行正面和反面两方面进行测试.

2. 白盒测试 - 逻辑驱动的测试.通常从程序的内部构造和逻辑出发,构造测试输入,以覆盖尽可能多的语句路径.但是,即使测试覆盖了所有的语句路径,程序中也有可能存在错误,这些错误与输入数据相关.


三、软件测试的经济学

1. 要发现程序中所有可能的问题,理论上需要穷举所有的数据输入,这在现实中往往不可能.白盒测试中的路径覆盖是一种很好的简化,但是无法发现所有可能的错误,并且列举空间也非常大.

2. 测试在经济学上的考虑是怎样使用最少的时间,最少的资源(人员、软硬件)发现更多的错误和问题.


四、软件测试的基本原则

1. 对每一个测试用例,都需要对输入和输出的定义.这样我们才能明确判断用例是通过还是失败.

2. 开发人员应该尽量避免测试自己开发的代码.因为他们的头脑处于"建设性"思考的状态,不利于发现存在的问题.

3. 测试应该同时包含正向的和反向的.也就是作,应该覆盖"应该做的",也应该包含“不应该做的”.

4. 尽量保留已有的测试,让测试自动化,可重复,以方便地进行回归测试.

5. 错误通常是聚集出现.如果一个模块错了较多的错误,它出现更多错误的可能性将会更高.

6. 错误发现得越早,改正的成本越低.不要等到项目的最后才开始测试.

No comments: