白盒测试方法
白盒测试,英文是White Box Testing。又称结构测试或者逻辑驱动测试。
白盒测试是把测试对象看作一个打开的盒子。利用白盒测试法进行动态测试时,需要测试软件产品的内部结构和处理过程,不需测试软件产品的功能。
白盒测试法的覆盖标准有逻辑覆盖、循环覆盖和基本路径测试。其中逻辑覆盖包括语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖。
白盒测试是知道产品内部工作过程,可通过测试来检测产品内部动作是否按照规格说明书的规定正常进行,按照程序内部的结构测试程序,检验程序中的每条通路是否都有能按预定要求正确工作,而不顾它的功能,白盒测试的主要方法有逻辑驱动、基路测试等,主要用于软件验证。
白盒测试常用工具有:Jtest、VcSmith、Jcontract、C++ Test、CodeWizard、logiscope。
在白盒测试中,可以使用各种测试方法进行测试。但是,测试时要考虑以下5个问题:
1)测试中尽量先用自动化工具来进行静态结构分析。
2)测试中建议先从静态测试开始,如:静态结构分析、代码走查和静态质量度量,然后进行动态测试,如:覆盖率测试。
3)将静态分析的结果作为依据,再使用代码检查和动态测试的方式对静态分析结果进行进一步确认,提高测试效率及准确性。
4)覆盖率测试是白盒测试中的重要手段,在测试报告中可以作为量化指标的依据,对于软件的重点模块,应使用多种覆盖率标准衡量代码的覆盖率。
5)在不同的测试阶段,测试的侧重点是不同的。
在单元测试阶段:以程序语法检查、程序逻辑检查、代码检查、逻辑覆盖为主。
在集成测试阶段:需要增加静态结构分析、静态质量度量、以接口测试为主。
在系统测试阶段:在真实系统工作环境下通过与系统的需求定义作比较,检验完整的软件配置项能否和系统正确连接,发现软件与系统/子系统设计文档和软件开发合同规定不符合或与之矛盾的地方;验证系统是否满足了需求规格的定义,找出与需求规格不相符或与之矛盾的地方,从而提出更加完善的方案,确保最终软件系统满足产品需求并且遵循系统设计的标准和规定。
验收测试阶段:按照需求开发,体验该产品是否能够满足使用要求,有没有达到原设计水平,完成的功能怎样,是否符合用户的需求,以达到预期目的为主。
1、代码检查
代码检查是静态测试的主要方法,它包括代码走查、桌面检查、流程图审查等。下面通过如下几点来介绍代码检查。
(1)概述
代码检查主要检查代码和流图设计的一致性,代码结构的合理性,代码编写的标准性、可读性,代码的逻辑表达的正确性等方面。它包括变量检查,命名和类型审查,程序逻辑审查,程序语法检查和程序结构检查等内容。
最常见的静态测试是找出源代码的语法错误,这类测试可由编译器来完成。
(2)代码检查的目的
代码检查是为达到以下目的:
检查程序是不是按照某种标准或规范编写的。
发现程序缺陷。
发现程序产生的错误。
检查代码是不是流程图要求的。
检查有没有遗漏的项目。
使代码易于移植,因为代码经常需要在不同的硬件中运行,或者使用不同的编译器编译。
使代码易于阅读、理解和维护。
(3)代码检查需要的文档
在进行代码检查前应准备好需求文档、程序设计文档、程序的源代码清单、代码编码标准、代码缺陷检查表和流程图等。
2、代码检查的方式
代码检查的方式有3种,下面分别介绍。
1)桌面检查
桌面检查是程序员对源程序代码进行分析、检验,并补充相关的文档,发现程序中的错误的过程。
由于程序员熟悉自己的程序,可以由程序员自己检查,这样可以节省很多时间,但要注意避免自己的主观判断。
2)走查
走查是程序员和测试员组成的审查小组通过逻辑运行程序,发现问题。小组成员要提前阅读设计规格书、程序文本等相关文档,利用测试用例,使程序逻辑运行。
走查可分为以下两个步骤:
① 小组负责人把材料发给每个组员,然后由小组成员提出发现的问题。
② 通过记录,小组成员对程序逻辑及功能提出自己的疑问,开会探讨发现的问题和解决方法。
3)代码审查
代码审查是程序员和测试员组成的审查小组通过阅读、讨论、分析技术对程序进行静态分析的过程。
代码审查可分为以下两个步骤:
① 小组负责人把程序文本、规范、相关要求、流程图及设计说明书发给每个成员。
② 每个成员将所发材料作为审查依据,但是由程序员讲解程序的结构、逻辑和源程序。在此过程中,小组成员可以提出自己的疑问;程序员在讲解自己的程序时,也能发现自己原来没有注意到的问题。
为了提高效率,小组在审查会议前,可以准备一份常见错误清单,提供给参加成员对照检查。
在实际应用中,代码检查能快速找到20%~30%的编码缺陷和逻辑设计缺陷,代码检查看到的是问题本身而非问题的征兆。代码走查是要消耗时间的,而且需要知识和经验的积累。
3、代码检查项目
下面介绍代码检查项目。
1.目录文件组织
目录文件组织要遵循以下原则:
1)所有的文件名简单明了,见名知意。
2)文件和模块分组清晰。
3)每行代码在80个字符以内。
4)每个文件只包含一个完整模块的代码。
2.检查函数
检查函数要遵循以下原则:
1)函数头清晰地描述了函数的功能。
2)函数的名字清晰地定义了它所要做的事情。
3)各个参数的定义和排序遵循特定的顺序。
4)所有的参数都要是有用的。
5)函数参数接口关系清晰明了。
6)函数所使用的算法要有说明。
3.数据类型及变量
数据类型及变量要遵循以下原则:
1)每个数据类型都有其解释。
2)每个数据类型都有正确的取值。
3)数据结构尽量简单,降低复杂性。
4)每一个变量的命名都明确地表示了其代表什么。
5)所有的变量都?皇褂谩?
6)全部变量的描述要清晰。
4.检查条件判断语句
检查条件判断语句要遵循以下原则:
1)条件检查和代码在程序中清晰表露。
2)if/else的使用正确。
3)数字、字符和指针判断明确。
4)最常见的情况优先判断。
5.检查循环体制
检查循环体制要遵循以下原则:
1)任何循环不得为空。
2)循环体系清晰易懂。
3)当有明确的多次循环操作时使用for循环。
4)循环命名要有意义。
5)循环终止条件清晰。
6.检查代码注释
检查代码注释时要遵循以下原则:
1)有一个简单的关于代码结构的说明。
2)每个文件和模块都要有相应的解释。
3)源代码能够自我解释,并且易懂。
4)每个代码的解释说明要明确地表达出代码的意义。
5)所有注释要具体、清晰。
6)所有无用的代码及注释要删除。
7.桌面检查
进行桌面检查时要注意以下问题:
1)检查代码和设计的一致性。
2)代码对标准的遵循、可读性。
3)代码逻辑表达的正确性。
4)代码结构的合理性。
5)程序编写与编写标准的符合性。
6)程序中不安全、不明确和模糊的部分。
7)编程风格问题等。
8.其他检查
其他检查包括如下内容:
1)软件的扩展字符、编码、兼容性、警告/提示信息。
2)检查变量的交叉引用表:检查未说明的变量和违反了类型规定的变量,以及变量的引用和使用情况。
3)检查标号的交叉引用表:验证所有标号的正确性。
4)检查子程序、宏、函数:验证每次调用与所调用位置是否正确,调用的子程序、宏、函数是否存在,参数是否一致。
5)等价性检查:检查全部等价变量的类型的一致性。
6)常量检查:确认常量的取值和数制、数据类型。
7)标准检查:检查程序中是否有违反标准的问题。
8)风格检查:检查程序的设计风格。
9)比较控制流:比较设计控制流图和实际程序生成的控制流图的差异。
10)选择、激活路径:在设计控制流图中选择某条路径,然后在实际的程序中激活这条路径,如果不能激活,则程序可能有错。
11)补充文档:根据以上检查项目,可以编制代码规则、规范和检查表等作为测试用例。
12)对照程序的规格说明,详细阅读源代码,比较实际的代码,从差异中发现程序的问题和错误。
13)检查必须遵守规定代码的语法格式和规则(如排版、注释、标识符命名、可读性、变量、函数、过程、可测性、程序效率、质量保证、代码编辑、编译、审查、代码测试、维护、宏)等各方面的编码要求。
在进行人工代码检查时,可以制作代码走查缺陷表。在缺陷检查表中,我们列出工作中遇到的典型错误,如下所示:
(1)格式部分
嵌套的IF是否正确地缩进。
注释是否准确并有意义。
使用的符号是否有意义。
代码基本上是否与开始时的模块模式统一、一致。
是否遵循了全套的编程标准。
(2)入口和出口的连接
初始入口和最终出口是否正确。
被传送的参数值是否正确地设置了。
对关键的被调用的模块的意外情况是否有所处理(如丢失、混乱)。
对另一个模块的每一次调用时,全部所需的参数是否传送给每一个被调用的模块。
(3)存储器问题
每一个域在第一次使用前是否正确地初始化。
规定的域是否正确。
每个域是否有正确的变量类型声明。
(4)判断及转移
用于判断的是否是正确的变量。
是否判断了正确的条件。
每个转移目标是否正确地并且至少执行了一次。
(5) 性能
性能是否最佳。
(6) 可维护性
清单格式是否适用于提高可读性。
各个程序块之间是否符合代码的逻辑意义。
(7) 逻辑
全部设计是否已经实现。
代码所做的是否是设计规定的内容。
每一个循环是否执行了正确的次数。
(8) 可靠性
对从外部接口采集的数据是否确认过。
(9) 内存设计
数组或指针的下标是否越界。
是否修改了指向常量的指针的内容。
是否有效地处理了内存耗尽的问题。
是否出现了不规范指针(指针变量没有被初始化、用free或者delete释放了内存之后,忘记将指针设置为Null)。
是否忘记为数组和动态内存赋初值。
用malloc或者new申请内存之后,是否立即检查指针值是否为Null。
(10) 关于类的高级特性
是否违背了继承和组合的规则
2.2.4 静态结构分析
静态结构分析主要是以图形的方式表现程序的内部结构,例如函数调用关系图、函数内部控制流图。
静态结构分析是测试者通过使用测试工具分析程序源代码的系统结构、数据结构、数据接口、内部控制逻辑等内部结构,生成函数调用关系图、模块控制流图、内部文件调用关系图等各种图形图表,清晰地标识整个软件的组成结构,便于理解,通过分析这些图表(包括控制流分析、数据流分析、接口分析、表达式分析),检查软件是否存在缺陷或错误。
通过应用程序各函数之间的调用关系展示了系统的结构,这可以通过列出所有函数,用连线表示调用关系和作用来实现。静态结构主要分析以下内容:
1)检查函数的调用关系是否正确。
2)是否存在孤立的函数没有被调用。
3)明确函数被调用的频繁度,对调用频繁的函数可以重点检查。