本篇博文将对静态黑盒测试、动态黑盒测试、静态白盒测试以及动态白盒测试进行简单描述,这部分是学习测试的基础,并对后面的测试技术来说非常重要。
假如有幸在项目早期介入,并有权修改初期的产品说明书,在此阶段找出软件缺陷极有可能为项目节省大笔开销和时间。
产品说明书:通常是利用文字和图形描述产品的书面文档。除了大爆炸模式之外,每一种模式中开发小组都要根据需求文档编写一份产品说明书,用以定义软件是什么样的。
黑盒测试:在黑盒测试中,软件测试员只需知道软件要做什么——而无法看到盒子里的软件是如何运行的。只要进行一些输入,就能得到某种输出结果。他不知道软件如何让运行,为什么会这样,只知道程序做了什么。
白盒测试:(透明盒测试)软件测试员可以访问程序员的代码,并通过检查代码的线索来协助测试——可以看到盒子里面。测试员根据代码检查结果判断或多或少可能出错的数目,并据此定制测试。
静态测试:是指测试不运行的部分——只是检查和审核。
动态测试:是指通常意义上的测试——使用和运行软件。
综上,对于产品说明书的测试属于静态黑盒测试。
测试产品说明书的第一步不是马上钻进去找缺陷,而是站在一个高度上进行审查。审查产品说明书是为了找出根本性的问题、疏忽或遗漏之处。也许这更像是研究而不是测试,但是研究的根本是为了更好地了解软件该做什么。如果能够很好地理解产品说明书后的诸多为什么和怎么做,就可以更好地进行细节检查。
质量的定义是“满足客户要求”,软件测试员必须了解并测试软件是否符合那些要求。熟悉软件应用领域的相关知识有很大的帮助。如果审查产品说明书的某一部分时不理解,不要假定它是对的而把它放掉。在使用时,客户也许会假设软件是安全的,但软件测试员不能假定程序员会正确处理安全问题。
下面是可以考虑作为标准和规范的一些例子。
软件测试员的任务不是定义软件要符合何种标准和规范,这是项目经理或者编写产品说明书的人的任务。软件测试员要做的是观察,“检查”采用的标准是否正确、有无遗漏。在对软件进行确认和验收时,还要注意是否与标准和规范相抵触,把标准和规范视为产品说明书的一部分。
了解软件最终结果的最佳方法是研究类似软件,例如竞争对手的产品或者小组开发的类似产品。
在审查竞争产品时要注意的问题包括:
问题用语通常表明功能没有仔细考虑——可能归结于前文所述的某一属性。从产品说明书中找出这样的用语,仔细审查它们在上下文中是怎样使用的。产品说明书后面可能会阐释或掩饰,也可能含糊其辞——无论是哪一种情况,都可视为软件缺陷。
高级审查技术可以查出遗漏和缺失之处,低层次测试技术确保所有细节都被定义。
不深入代码细节测试软件的方法称为动态黑盒测试。
测试员输入数据、接受输出、检验结果。动态黑盒测试常被称为行为测试,因为测试的软件是在使用过程中的实际行为。
有效的动态测试需要关于软件行为的一些定义——也即需求文档或者产品说明书。清楚了被测试软件的输入和输出之后,接下来要开始定义测试用例,测试用例是指进行测试时使用的特定输入,以及测试软件的过程步骤。
在没有产品说明书时,尽管这对于软件测试员不是理想的状况,但是此时可以采取称为探索测试的解决方案——了解软件、设计测试、执行测试同时进行。这就需要把软件当做产品说明书来对待。系统地逐项了解软件的功能、记录软件的执行情况、详细描述功能。
等价类划分是指分步骤地把海量(无限)的测试用例集减的很小,但过程同样有效。
一个等价类或者等价划分是指测试相同目标或者暴露相同软件缺陷的一组测试。
对软件最简单的认识就是将其分成两部分:数据(或其范围)和程序。
对数据进行测试,就是在检查用户输入的信息、返回的结果以及中间计算结果是否正确。
数据的例子如下:
如果软件能在其边界运行,那么在正常情况下就应该不会有什么问题。
边界条件是指软件运行在计划操作界限的边界的情况。
如果要选择在等价划分中包含哪些数据,可以根据边界来选择。
越界测试的做法通常是简单地对于最大值加1或者很小的数,以及对于最小值减1或者很小的数。
在软件的每一个部分不断寻找边界是极为重要的,寻找做的越多,边界就会发现的越多,可能找出的软件缺陷就越多。
缓冲区溢出是由边界条件缺陷引起的,它是造成软件安全问题的头号原因。
例如:2的幂和ASCII表
一种看起来很明显的软件缺陷来源于当软件要求输入时,根本没有输入任何内容。这种情况在产品说明书中常常忽视,程序员也经常遗忘,但是在实际使用中却时有发生。
好的软件会处理这种情况。它通常将输入内容默认为边界内的最小合法值,或者在合法划分中间的某个合理值;或者返回错误提示信息。
数据测试的最后一种数据类型是垃圾数据。这是失效性测试的对象。此类测试没有实际的规则,只是设法破坏软件。要发挥创造力,要会走偏门。
软件状态是指软件当前所处的条件或模式。软件测试员必须测试程序的状态及其转换。
访问所有状态通常是可以实现的。困难在于除了极其简单的程序之外,基本上不可能走遍所有分支,达到所有状态。软件的日益复杂化,尤其是为了迎合日益丰富的用户界面,提供了太多选择和选项,致使程序分支数量呈指数式增长。
对于软件测试,解决方法是运用等价划分技术选择状态和分支。因为选择不做完全测试,所以要承担一定的风险,但是通过合理选择减少风险。
状态转换图应该表示出以下项目:
多任务 是指操作系统设计用来同时执行多个独立的进程。
在真正的多任务环境中,软件设计绝对不能想当然,必须处理随时被终端的情况,能够与其他任何软件在系统中同时运行,并且共享内存、磁盘、通信以及其他硬件资源。
时序发生错乱 几个事件恰巧挤在一起,由于软件未预料到运行过程会被中断,以致造成混乱。
竞争条件测试难以设计,最好是首先仔细查看状态转换图中的每一个状态,以找出哪些外部影响会中断该状态。考虑要使用数据如果没有准备好,或者在用到时发生了变化,状态会怎样。
以下是可能会面临竞争条件的例子情形:
重复、压迫和重负测试应联合使用,同时进行,这是找出以其他方式难以发现的严重缺陷的一个可靠的方法。
静态白盒测试 是在不执行软件的条件下有条理地仔细审查软件设计、体系结构和代码,从而找出软件缺陷的过程,有时称为结构化分析。
正式审查就是进行静态白盒测试的过程。正式审查的含义很广,从两个程序员之间的简单交谈,到软件设计和代码的详细、严格检查均属于此过程。正式审查的方法包括:同事审查、走查、检验等。
除了发现问题,坚持正式审查还有一些间接效果:
动态白盒测试 是指利用查看代码功能(做什么)和实现方式(怎么做)得到的信息来确定哪些需要测试、哪些不需要测试、如何开展测试。动态白盒测试的另一个常用名称是结构化测试。
动态白盒测试不仅仅是查看代码的运行情况,还包括直接测试和控制软件。动态白盒测试包括以下4个部分:
动态白盒测试和调试这两项技术表面上很相似,因为它们都包括处理软件缺陷和查看代码的过程,但是它们的目标大不相同。动态白盒测试的目标是寻找软件缺陷,调试的目标是修复缺陷。然而,它们在隔离软件缺陷的位置和原因上确实存在交叉现象。
在底层进行的测试称为单元测试或者模块测试。单元经过测试,底层软件缺陷被找出并修复之后,就集成在一起,对模块的组合进行集成测试。这个不断增加的测试过程继续执行,加入越来越多的软件片段,直至整个产品——至少是产品的主要部分——在称为系统测试的过程中一起测试。
这种递增测试有两条途径:自底向上和自顶向上。
静态黑盒测试 是指检查产品说明书,并在软件编写之前找出问题。
动态黑盒测试 是指在不了解软件如何工作的前提下进行测试。
静态白盒测试 是指通过正式审查和检验检查代码的细节。
动态白盒测试 是指在看到软件的工作方式时,根据获得的信息对软件进行测试。