啊胡

V1

2022/09/11阅读:40主题:自定义主题1

白盒测试之 静态测试

白盒测试可分为静态测试和动态测试。

静态测试是一种不通过执行程序而进行测试的技术,其关键是检查软件的表示和描述是否一致,是否存在冲突或者歧义。静态测试瞄准的是纠正软件系统在描述、表示和规格上的错误,是任何进一步测试的前提。

动态测试需要软件的执行,当软件系统在模拟的或真实的环境中执行之前、之中和之后,对软件系统行为的分析是动态测试的主要特点。动态测试主要验证一个系统在检查状态下是正确还是不正确。动态测试技术主要包括程序插桩、逻辑覆盖、基本路径测试等。

最常见的静态测试是找出源代码的语法错误,这类测试可由编译器来完成,因为编译器可以逐行分析检验程序的语法,找出错误并报告。除此之外,测试人员需要采用人工的方法来检验程序,因为程序中有些地方存在非语法方面的错误,只能通过人工检测的方法来判断。人工检测的方法主要有代码检查法静态结构分析法等。

代码检查法

代码检查法代码检查法主要是通过桌面检查代码审查走查方式,对以下内容进行检查。

• 检查代码和设计的一致性。

• 代码的可读性以及对软件设计标准的遵循情况。

• 代码逻辑表达的正确性。

• 代码结构的合理性。

• 程序中不安全、不明确和模糊的部分。

• 编程风格方面的问题等。

桌面检查

桌面检查是指程序设计人员对源程序代码进行分析、检验,并补充相关的文档,发现程序中的错误。代码检查项目(采用分析技术)通常包括以下内容。

• 检查变量的交叉引用表:检查未说明的变量、违反了类型规定的变量以及变量的引用和使用情况。

• 检查标号的交叉引用表:验证所有标号的正确性以及转向指定位置的标号是否正确。

• 检查子程序、宏、函数:验证每次调用与所调用位置是否正确,调用的子程序、宏、函数是否存在,参数是否一致,并检验调用序列中调用方式与参数顺序、个数、类型上的一致性。

• 等价性检查:检查全部等价变量的类型的一致性。

• 常量检查:确认常量的取值和数制、数据类型,检查常量每次引用同它的取值、数制和类型的一致性。

• 设计标准检查:检查程序是否违反设计标准的问题。

• 风格检查:检查程序的设计风格方面的问题。

• 比较控制流:比较设计控制流图和实际程序生成的控制流图的差异。

• 选择、激活路径:在设计控制流图中选择某条路径,到实际的程序中激活这条路径,如果不能激活,则程序可能有错。用这种方法激活的路径集合,应保证源程序模块的每行代码都被检查,即桌前检查应至少达到语句覆盖。

• 对照程序的规格说明,详细阅读源代码:对照程序的规格说明书、规定的算法和程序设计语言的语法规则,仔细地阅读源代码,逐字逐句进行分析和思考,将实际的代码和期望的代码进行比较,从它们的差异中发现程序的问题和错误。

代码审查

代码审查一般由程序设计人员和测试人员组成审查小组,通过阅读、讨论,对程序进行静态分析。

首先小组成员提前阅读设计规格书、程序文本等相关文档,然后召开程序审查会,在会上,首先由程序员逐句讲解程序的逻辑,在讲解过程中,程序员能发现许多原来自己没有发现的错误,而讨论和争议则促进了问题的暴露。

例如,对某个局部性小问题修改方法的讨论,可能发现与之牵连的其他问题,甚至涉及模块的功能说明、模块间接口和系统总体结构的大问题,从而导致对需求的重定义、重设计和重验证,进而大大改善了软件质量。

在会前,应当给审查小组每位成员准备一份常见错误的清单,把以往所有可能发生的常见错误罗列出来,供与会者对照检查,以提高审查的实效。这个错误清单也称为检查表,它把程序中可能发生的各种错误进行分类,对每一类别再列举出尽可能多的典型错误,然后把它们制成表格,供再审查时使用。

走查

走查一般由程序设计人员和测试人员组成审查小组,通过逻辑运行程序,发现问题。

首先小组成员提前阅读设计规格书、程序文本等相关文档,然后利用测试用例,使程序逻辑运行,记录程序的踪迹,发现、讨论、解决问题。

在走查过程中,借助测试用例的媒介作用,对程序的逻辑和功能提出各种疑问,结合问题开展热烈的讨论,能够发现更多的问题。

代码审查前,应准备好需求描述文档、程序设计文档、程序的源代码清单、代码编码标准和代码缺陷检查表等。

在实际使用中,代码检查能够快速找到缺陷,通常可发现30%~70%的逻辑设计缺陷和编码缺陷。但是代码检查非常耗费时间,而且代码检查需要知识和经验的积累。

静态结构分析法

测试人员通常通过使用测试工具分析程序源代码的系统结构、数据结构、数据接口、内部控制逻辑等内部结构,生成函数调用关系图、模块控制流图、内部文件调用关系图等各种图形、图表,清晰地标识整个软件的组成结构。

通过分析这些图表(包括控制流分析、数据流分析、接口分析、表达式分析等),可以检查软件有没有存在缺陷或错误。静态结构分析法通常采用以下一些方法进行源程序的静态分析。

生成各类图表

通过生成各种图表,来帮助对源程序的静态分析。常用的各种引用表如下。

标号交叉引用表。列出在各模块中出现的全部标号,并标出标号的属性,包括已说明、未说明、已使用、未使用等属性。表中还包括在模块以外的全局标号、计算标号等。

变量交叉引用表。变量交叉引用表即变量定义与引用表。在表中应标明各变量的属性,包括已说明、未说明、隐式说明以及类型及其使用情况等属性,进一步还可区分是否出现在赋值语句的右边,是否属于公共变量、全局变量或特权变量等属性。

子程序(宏、函数)引用表。在表中列出各个子程序、宏和函数的属性,包括已定义、未定义、定义类型等属性,还要列出参数表,包括输入参数个数、顺序、类型,输出参数的个数、顺序、类型,已引用、未引用、引用次数等属性。

等价表。等价表需要列出在等价语句或等值语句中出现的全局变量和标号。

常数表。常数表需要列出全部数字常数和字符常数,并指出它们在哪些语句中首先被定义。

这些表可为源程序的静态分析提供辅助信息。例如,利用子程序(宏、函数)引用表、等价(变量、标号)表、常数表等,可以直接从表中查出说明/使用错误等;利用循环层次表、变量交叉引用表、标号交叉引用表等,可以做错误预测和程序复杂程度计算。

常用的的各种关系图、控制流图主要有函数调用关系图模块控制流图

函数调用关系图列出所有函数,用连线表示调用关系,通过应用程序各函数之间的调用关系展示了系统的结构,利用函数调用关系图可以检查函数的调用关系是否正确,是否存在孤立的函数而没有被调用,明确函数被调用的频繁度,对调用频繁的函数可以重点检查。通过查看函数调用关系图,可以发现系统是否存在结构缺陷,发现哪些函数是重要的,哪些是次要的,需要使用什么级别的覆盖要求等。

模块控制流图是由许多结点和连接结点的边组成的图形,其中每个结点代表一条或多条语句,边表示控制流向,模块控制流图可以直观地反映出一个函数的内部结构。

静态错误分析

静态错误分析主要用于确定在源程序中是否有某类错误或“危险”结构。

类型和单位分析。类型和单位分析主要为了强化对源程序中数据类型的检查,发现在数据类型上的错误和单位上的不一致性。

引用分析。最广泛使用的静态错误分析方法就是发现引用异常。如果沿着程序的控制路径,变量在赋值以前被引用,或变量在赋值以后未被引用,这时就发生了引用异常。

为了检测引用异常,需要检查通过程序的每一条路径。通常采用类似深度优先的方法遍历程序流程图的每一条路径,也可以建立引用引出探测工具,这种工具包括2个表:定义表未引用表。每张表中都包含一组变量表。未引用表中包含已被赋值但还未被引用的一些变量。当扫描抵达一个长度大于1的节点V时,深度优先探索算法要求先检查最左分支的那一部分程序流程图,然后再检查其他分支。在最左分支检查完之后,算法控制返回到节点V,从栈中恢复该节点的定义表和未引用表的以前的副表,然后再去遍历该节点的下一个分支,这个过程要继续到全部分支检查完为止。

表达式分析。对表达式进行分析,可以发现和纠正在表达式中出现的错误。表达式分析主要包括以下几个方面内容。

• 在表达式中不正确地使用了括号造成的错误。

• 数组下标越界造成错误。

• 除数为0造成错误。

• 对负数开平方,或对π求正切值造成错误。

最复杂的一类表达式分析是对浮点数计算的误差进行检查,由于使用二进制数不精确地表示十进制浮点数,常常使计算结果出乎意料。

接口分析。接口分析可以检查模块之间接口的一致性和模块与外部数据库之间接口的一致性。程序关于接口的静态错误分析主要检查过程、函数过程之间接口的一致性。因此,要检查形式参数与实际参数在类型、数量、维数、顺序、使用上的一致性,检查全局变量和公共数据区在使用上的一致性。

分类:

后端

标签:

软件测试

作者介绍

啊胡
V1