按是否执行程序的角度划分:静态测试、动态测试

1.静态测试(Static testing)

定义

静态方法是指不运行被测程序本身,而只是静态地检查程序代码、界面或文档中可能存在的错误的过程。仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性,对需求规格说明书、软件设计说明书、源程序做结构分析、流程图分析、符号执行来找错的过程。

静态测试主要包括各阶段的评审(人工检查)、代码检查、静态结构分析、代码质量度量等,用于对被测程序进行特性分析。

分析如下:

检查项:代码风格和规则审核;程序设计和结构的审核;业务逻辑的审核;走查、审查与技术复审手册。

静态质量:度量所依据的标准是ISO9126。在该标准中,软件的质量用以下几个方面来衡量,即功能性(Functionality)、可靠性(Reliability)、可用性(Usability)、有效性(Efficiency)、可维护性(Maintainability)、可移植性(Portability)。具体到静态测试,这里主要关注的是可维护性。要衡量软件的可维护性,可以从四个方面去度量,即可分析性(Analyzability)、可改变性(Changeability)、稳定性(Stability)以及可测试性(Testability)。具体到软件的可测试性怎么去衡量。又可以从三个度量元去考虑,例如圈复杂度、输入/输出的个数等。圈复杂度越大,说明代码中的路径越多;路径越多,意味着要去做测试,需要写更多的测试用例。输入/输出的个数同样的道理。

为什么要进行静态测试?

静态分析潜在收益是很高的: 在软件开发生命周期中,越是后来发现的缺陷,其去除成本呈指数上涨,所以缺陷越早发现越好。静态分析是所有测试中可以最先发现缺陷的方法,极大的降低了软件的修复成本。

对软件经理,静态分析有助于:

1) 减少部署后存在错误的风险,去除此时发现的错误是非常昂贵的;

2) 缩短产品上市时间;

3) 减少代码审查和测试的成本和时间;

4) 自动化(部分)审查,没有或多个有限的人工检查;

5) 消除明显的错误以便改善测试的速度和重点;

6) 提高代码质量(坚持编码标准);

7) 实现更高的覆盖率(更多的代码检查):与测试覆盖率相关但并不完全一样,因为重点不同。

对软件开发人员,静态分析有助于:

1) 提早找到/阻止错误(在错误变得很难处理之前):工具可用作开发周期的一部分,像编译器;更直接,明显的反馈。

2) 发现/阻止“难以测试”的错误:例如,静态分析善于检测潜在的内存泄露和缓冲区溢出,从而使开发人员更高效,花费更少的时间调试。

包括三个方面

代码测试、界面测试和文档测试

 对于代码测试,主要测试代码是否符合相应的标准和规范。

 对于界面测试,主要测试软件的实际界面与需求中的说明是否相符。

 对于文档测试,主要测试用户手册和需求说明是否符合用户的实际需求。

对界面和文档的静态测试相对容易,只要测试人员对用户需求仔细分析研究,就很容易发现界面和文档中的缺陷。对程序代码的静态测试相对复杂,需要按照相应语言的代码规范模板(无统一标准,各公司有自己的标准)来逐行检查程序代码。

静态测试主要检查点:

 

下面分别从代码、界面、文档三个方面进行详细说明每一部分应该如何进行测试。

1) 界面测试:

 

 

 

主要从联机功能、接口测试、报表测试和批量测试几个方面进行阐述。

2) 文档测试

主要是需求文档与实际设计和实现是否相符,可以根据界面测试中的点进行测试。

3) 代码测试

程序代码的静态测试要复杂得多,需要我们按照相应的代码规范模板来逐行检查程序代码。

对代码的检查我们推荐使用现有的工具进行。那么我们从哪里获得这个规范模板呢?其实没有一个统一的标准,每个公司内部一般都有自己的编码规范,比如《c/c++编码规范》,你只需要按照上面的条目逐条测试就可以了。

 

这段C语言编写的小程序,比较简单,实现的功能为:在主函数里输入两个单精度的数a和b,

然后调用max子函数来求a和b中的大数,最后将大数输出。我们现在就对代码进行静态分析,主要根据一些C语言的基础知识来检查。

我们把问题分为两种,一种必须修改的,另一种建议修改的。

必须修改的问题有三个:

1)程序没有注释。

注释是程序中非常重要的组成部分,一般占到总行数的1/4左右。程序开发出来不仅是给程序员看,其他程序员和测试人员也要看。有了注释,别人就能很快地了解程序实现的功能。注释应该包含作者,版本号、创建日期等,以及主要功能模块的含义。

2)子函数max没有返回值的类型。

由于类型为单精度,我们可以在max()前面加一个float类型声明。

3)精度丢失问题。

大家注意“c=max(a,b)”语句,我们知道c的类型为整型int ,而max(a,b)的返回值z为单精度float, 将单精度的数赋值给一个整型的数,c语言的编译器会自动地进行类型转换,将小数部分去掉,比如z=2.5,赋给c则为2,最后输出的结果就不是a和b 中的大数,而是大数的整数部分。

建议修改的问题也有三个;

1)Main函数没有返回值类型和参数列表。

虽然main函数没有返回值和参数,但是我们将其改为void main(void),来表明main函数的返回值和参数都为空,因为在有的白盒测试工具的编码规范中,如果不写void会认为是个错误。

2)一行代码只定义一个变量。

3)程序适当加些空行。空行不占内存,会使程序看起来更清晰。

解释和说明一下静态测试技术

静态测试不以测试数据的执行而是对测试对象的分析过程。 

静态测试存在于软件生命周期的各级测试。如:需求分析、概要设计、详细设计及组件测试、集成测试和系统测试的阶段或层级。 

静态测试的方法主要有人工(手工)评审与静态分析(人工或机器自动检测)两大类。通常可分别采用一种方法或混合使用两种方法。 

静态测试中的评审(或审查)的基本思想和目标是对软件缺陷或错误的一种预防措施。因而软件技术文档的审查是静态测试的主要任务之一。

静态测试的技术方法构成和说明:

 

针对需求分析和概要设计进行的评审。评审在需求分析和概要分析阶段 建立的评审基础上开展,有人工评审和静态技术分析两个过程。 

人工评审分为正式评审和非正式评审。正式评审是执行对被测对象(文档或程序)检查的活动及过程(也称为技术评审);非正式评审主要采用对文档或程序的走查活动及过程。如,对某一个具体程序的走查。走查通常采用单独或集体审阅的方式进行。

静态测试内容及过程

(1)静态测试内容 

静态测试的内容包含:测试需求分析、测试概要分析、测试详细设计、测试执行与测试结果分析 

(2)静态测试过程 

进行测试需求分析:这是静态测试过程的首个阶段,将确定测试的需求,建立起测试基础与评审基础。 

进行测试概要设计:在测试需求分析基础上,完成对测试方案的制定。如,测试内容、测试目标、测试策略、测试方法等。 

进行测试详细设计:这个阶段主要完成测试进程中,各项具体任务安排和实施的细节考虑。如,测试用例设计等。 

测试执行与结果分析:根据静态测试的计划进行静态测试执行的过程,各项测试任务的完成,并提交测试工作交付物。 

静态测试的实施与执行 

(1) 静态测试的实施 

静态测试通常采用两种策略:人工静态分析和借用工具静态分析。 

人工静态分析发挥人的智力和具有的逻辑思维优势,在分析过程中也常借助专用的静态测试分析工具来辅助。目前,实际工作中基本都是采用两种方法的混合模式,既充分发挥了发挥人的智慧,又运用了机器(工具)分析的高效便捷。

(2) 静态分析的过程有别于编译过程 

编译的功能是不能替代测试的。虽然编译系统也能检查软件(程序)中的错误,但其主要的作用是检查程序的语法等错误。这是因为编译系统并不具备软件测试的功能,并无针对性的去寻找特定的软件测试对象中的缺陷、错误的功效。

而测试通常是要通过执行测试用例来实现的。同时,编译是无法检测到程序的逻辑错误或缺陷的。 

(3) 代码检查 

代码检查的内容主要包括:代码走查、桌面检查、代码审查等活动及过程。主要检查代码和设计的一致性,代码对标的遵循、可读性,代码的逻辑表达的正确性,代码结果的合理性等方面。

代码检查的具体内容:变量检查、命名和类型审查、程序逻辑审查、程序语法检查和程序结构检查等。

代码检查的优点:是能快速找到软件缺陷或错误。测试业界实践表明,通过代码(通常是源代码)的走查过程,可检查到程序中 30-70%的程序逻辑设计及编码中的缺陷或者错误。代码检查在实际软件开发过程中被普遍采用,特别是针对组件(即单元)测试。

代码检查的缺点:非常耗费时间,而且代码检查需要知识和经验的积累。 

一般代码审查以下方面:

1、 代码是否与设计一致,是否符合软件需求、概要和详细设计,这不仅可以看出代码问题,也可以反过来更早发现需求或设计是否正确。

2、 代码书写的规范性和可读性。每个项目都有代码编写规范,如Java编写规范,C语言编写规范等。规范的代码包括清晰且充分的注释、漂亮的对齐、没有冗余、规范的命名等等。

3、 代码逻辑是否正确,有没有死循环、内存泄露,异常处理是否充分,事务处理是否正确等等。

4、 代码是否有安全漏洞、易被攻击。

5、 代码文件组织目录是否合理,代码的结构是否合理

6、 代码的重用性或复用性是高还是低

7、 代码嵌套调用是否过多等等

静态测试的结构分析方法 

(1)以图形方式表现程序内部结构 

静态结构分析主要以图形的方式来表达程序内部的结构关系。如,函数调用关系图,函数内部控制流图等。函数调用关系图是以直观的图形方式描述一个程序中各个函数的调用和被调用的关系; 函数内部控制流图以有向图来表达函数内部的程序控制逻辑。 

(2) 以程序的控制流图显示程序函数的逻辑结构 

程序的控制流图由多个节点和连接的边所构成。一个节点代表一条语句或数条语句,连接结点叫作边,边表示节点之间的控制流向。 

 

(3)检查项 

静态测试的检查项,主要有:代码风格和规则的审核;程序设计和结构的审核;业务逻辑的审核。 

(4) 代码的质量度量 

针对软件的可测试性、可读性(可维护性),通常有 3 种不同的代码质量度量 

参数。 

 Line(行)复杂度。Line 复杂度是以代码的行数作为计算度量的基准。

 Halstead(运算符与运算元)复杂度。Halstead 复杂度是以程序中使用到的运算符与运算元数量作为计数目标(直测指标),据此来计算程序的容量和工作量。 

 McCabe(圈)复杂度。它是将程序流程图结构转化为有向图结构,以图形(有向图)为基础来衡量软件或程序的复杂度度量。 

代码质量度量常常通过静态测试来获得,所以静态测试方法也称为静态分析,静态测试是对被测程序进行质量特性分析方法的总称。 

(5)检查与规范、标准的一致性 

通过静态测试工具可检查测试对象是否与应用的程序规范、标准的相一致,以检查软件程序是否遵循了大部分的编程规则与标准规范。以工具检查的优势是可快速并准确的帮助开发者与测试人员进行自动化检测过程,以发现被测对象与规范、标准的一致性。 

2.动态测试(Dynamic testing)

动态测试是指通过运行被测程序,输入相应的测试数据,检查实际输出结果与预期结果的差异,并分析运行效率、正确性、健壮性、性能等。

(1)动态测试有三部分组成:构造测试用例、执行程序、分析程序的输出结果。

(2)大多数软件测试都属于动态测试。所谓软件的动态测试,就是通过运行软件来检验软件的动态行为和运行结果的正确性。目前,动态测试也是公司的测试工作的主要方式。

是否查看代码角度和是否执行程序角度的关系

黑盒测试有可能是动态测试(运行程序,只看输入和输出),也有可能是静态测试(不运行程序,只是查看界面)

白盒测试有可能是动态测试(运行程序,并分析代码结构),也有可能是静态测试(不运行程序,只是静态查看代码)

动态测试有可能是黑盒测试(运行程序,只看输入和输出),也有可能是白盒测试(运行程序,并分析代码结构)

静态测试有可能是黑盒测试(不运行程序,只是查看界面),也有可能是白盒测试(不运行程序,只是静态查看代码)

posted @ 2020-05-16 11:57  都依昵  阅读(2510)  评论(0编辑  收藏  举报