软件测试——动态白盒测试

摘要:
本文主要讲述的是软件测试的动态白盒测试。有人称之为带上X光眼镜测试软件,因为可以看透盒子,看到盒子里面的东西,因此这类测试可以更加有针对性。

动态白盒测试

  • 用一句话概括,动态白盒测试是指利用查看代码和实现方式,得到信息来确定:哪些需要测试?哪些不需要测试?如何开展测试?动态白盒测试的另一种常用名称是结构化测试,因为软件测试员可以查看并使用代码的内部结构,从而设计和执行测试。
  • 动态板和测试包括以下四个部分:
    • 直接测试底层函数,过程制程序和库;
    • 以完整程序的方式从顶层测试软件,但是根据对软件运行的了解,调整测试用例;
    • 从软件获得读取变量和状态信息的访问权,以便确定测试与预期结果是否相符,同时,强制软件已正常测试,难以实现的方式运行;
    • 估算执行测试,使命中的代码量和具体代码,然后调整测试,去掉多余的测试用例,补充遗漏的用例。

动态白盒测试和调试

  • 动态白盒测试和调试看起来很相似,但实际上,他们的目标大不相同。动态白盒测试的目标是寻找软件缺陷,调试的目标是修复缺陷,然而他们在隔离转件缺陷的位置和原因上确实存在交叉现象。

分段测试

  • 单元测试和集成测试
    在底层进行的测试,称为单元测试或者模块测试。单元经过测试后,底层软件缺陷被找出并修复之后,就集成在一起,对模块的组合,进行集成测试。这是个不断增加的测试过程,随着测试的进行,加入越来越多的软件片段,直至整个产品,至少是产品的主要部分,在称为系统测试的过程中一起测试。
  • 这种底层测试有两条途径,自底向上和自顶向下。
    • 在自底向上测试中,要编写称为测试驱动的模块调用正在测试的模块。编写一小段称为桩的代码充当接口模块。
  • 如果作为软件测试员,受命对一个模块进行动态白盒测试,该怎么办?
    • 首先确定该模块属于程序中的底层模块,可以由高层模块调用,但是自己不能调用其他模块,通过查看内部代码可以确认这一点。如果是这样,合理的做法是编写一个测试驱动,以独立于程序其他部分的形式,测试该模块。
    • 在进行白盒测试之前,一定要根据说明书建立黑盒测试用例,用这种方式可以真正测试模块的功能和作用。可以先分析说明书,确定应该采用的黑盒测试用例,然后用等价类划分技术,减少测试用例集,最后研究代码,看函数是如何实现的,应用模块的白盒子来增减测试用例。
    • 如果先从模块的白和角度建立测试用例,检查代码,就会偏向于模块工作方式建立测试用例,程序员或许误解了说明,于是测试用例就会不对,虽然测试用例精确完整的测试了模块,但是可能不准确,因为没有测试预期的操作。
    • 根据白盒知识增减测试用例其实是根据程序内部的信息,对等价划分的进一步提炼。

数据覆盖

  • 进行白盒测试的合理方法,像黑盒测试那样把软件分成数据和状态,从同样的角度看世界,可以相当容易的把白盒的信息映射到已经写完的黑盒测试用例上。
  • 数据流覆盖,主要是指在软件中完全跟踪一批数据。如果在底层测试函数,就会使用调试器观察变量在程序运行时的数据,通过黑盒测试知道变量开始和结束的值。通过动态白盒测试,还可以在程序运行期间检查变量的中间值,根据观察结果就可以决定改某些测试用例,保证变量得到感兴趣的,甚至具有风险的中间值。
  • 次边界,是导致软件缺陷的最常见的例子,而软件的各个部分都有自己独立的次边界。
    • 如果进行白盒测试,就需要仔细查看代码,找到次边界条件,并建立能测试他们的测试用例,询问编写代码的程序员是否知道这些条件,并对内部数据表给予特别的注意,因为这里聚集了大量次边界条件。
  • 代码当中,常常深藏着公式和等式。白盒测试的时候,可以撇开代码中的公式和等式,查看他们使用的变量,在程序正常输入和输出之外,为其建立测试用例和等价划分。
  • 数据测试的最后一种类型是强制错误,强制错误是一种有效的工具,可以执行其他方式难以实现的测试用例,但是要注意,不要设置现实世界中不可能出现的情况,如果程序员在函数开头检查n必须大于零,而且n仅用于该公式中,那么将n值设为零,使程序失败的测试用例就是非法的。要仔细检查和选择错误强制情况,并和程序员一起反复检查,以确认它们是合法的。
  • 强制显示错误提示信息,使用错误强制的上好方法是迫使软件中的所有错误提示信息显示出来,这不是测试检测错误的代码,而是显示错误的代码。

程序状态以及流程

  • 测试数据只是一半工作,为了全面的覆盖,还必须测试程序的状态以及程序流程,必须设法进入和退出每一个模块,执行每一行代码,进入软件每一条逻辑和决策分支,这种类型的测试叫做代码覆盖测试。代码覆盖测试是一种白盒测试,因为它要求通过完全访问代码一查看运行测试用例时,经过哪些部分。代码覆盖测试,最简单的形式是利用编译环境的调试器,通过单步执行程序查看代码。
  • 对大多数程序进行代码覆盖测试要用到成为代码覆盖率分析器的专用工具。利用代码覆盖率分析器可以得到一些数据,利用这些数据可以得到,测试用例没有覆盖软件的哪些部分如果某个模块的代码从未执行,就需要额外编写测试该模块函数的用例;哪些测试用例是多余的,如果执行一系列测试用例,而为增加代码覆盖率的百分比,那么这些测试用例就可能处在同一个等价划分;为了使覆盖率更好,需要建立什么样的新测试用例,通过观察覆盖率低的代码,看他如何工作,做了什么,从而建立可以更彻底地测试他的新测试用例。此外还可以得到软件质量的大致情况,如果测试用例覆盖了软件的90%,而未发现任何软件缺陷,就说明软件质量非常好;相反,如果测试纸覆盖了软件的50%,仍然发现了一些软件缺陷,就说明软件还要大加改进。

  • 代码覆盖最直接的形式,称为语句覆盖或者代码行覆盖,但是,语句覆盖是一种误导,可以说即使全部语句都被执行了,但是不能说走遍了软件的所有路径。

试图覆盖软件中的所有路径,称为路径覆盖,路径测试最简单的形式称为分支覆盖测试。关于路径测试还有一个复杂的问题,是条件覆盖,比如说if语句的包含两个条件,则有:错-错,错-对,对-错和对-对。条件覆盖测试,将分支语句的条件考虑在内。代码覆盖率分析器可以被设置为在报告结果时将条件考虑在内。

总结

软件测试的基础,静态黑盒测试是纸检查产品说明书,并在软件编写之前找出问题,动态黑盒测试是指在不了解软件如何工作的前提下进行测试,静态白盒测试是指通过正式审查和检验检查代码的细节,动态白盒测试,是指在看到软件的工作方式时,根据获得的信息对软件进行测试,从某种意义上讲,这篇加上前面的三篇就是软件测试的基本内容了。