一.静态技术与测试过程
- 静态测试不以测试数据的执行而是对测试对象的分析过程
- 静态测试存在于软件生命周期的各级测试。如,需求分析、概要设计、 详细设计及组件测试、集成测试和系统测试的阶段或层级。
- 静态测试的方法,主要有人工(手工)评审与==静态分析(人工或机器自 动检测)==两大类。通常可分别采用一种方法或混合使用两种方法。
- 静态测试中的评审(或审查)的基本思想和目标是对软件缺陷或错误的一种预防措施。因而软件技术文档的审查是静态测试的主要任务之一。
- 静态测试的技术方法构成和说明。
静态测试和动态测试的区别
与动态测试相比,静态测试更容易发现如下问题:与标准之间的偏差、需求的遗漏和错误、设计的缺陷、软件可维护性差和错误的接口说明等,而这些文档往往在动态测试过程中作为重要的测试依据。如果这些作为动态测试依据的文档的质量无法保障,则动态测试本身的质量也就值得怀疑,更无法有效保障被测对象的质量
二.评审
评审类型是多样化的,采取什么样的评审类型由评审的目标决定,评审目标可以是发现缺陷、增加理解、培训测试人员和团队其他成员或对讨论和决定达成共识等。
正式评审过程
正式的评审过程由6个阶段组成:计划阶段、预备会阶段(Kick Off Meeting )、个人准备阶段、评审会议阶段、返工阶段和跟踪结果阶段
- 计划阶段:为了有效开展评审活动,首先需要进行评审计划
- 预备会阶段:假如评审计划中无法明确一些事情和注意事项,有时候在评审计划之后,还需要召开评审预备会。
- 个人准备阶段:评审员明确了评审目的和各自的任务之后,接下来进入个人准备阶段
- 评审会议阶段:加入满足了评审的入口准则,就可以进入评审会议阶段
- 返工阶段:返工阶段的主要活动是修改发现的缺陷,通常由作者负责返工工作
- 跟踪结果阶段:跟踪结果阶段的主要活动包括检查缺陷是否已经修改、收集度量和检查出口准则
角色与职责
角色 |
经理或管理者 |
主持人 |
作者 |
评审员 |
记录员 |
职责 |
经理或管理者决定文档或者代码是否需要进行评审,若需要,则在项目计划中保留和分配足够的时间和资源。同时,在评审结束之后判断是否达到评审的目标。经理选择评审对象并确保基础文档和必需的资源可用,以及确定主持人和评审员的人选 |
主持人负责文档或文档集的评审活动,其主要的职责包括制定评审计划、召开评审会议和跟踪评审结果,以及负责和评审有关的管理工作,确保评审有序进行从而达到期望的目标。主持人的另一个重要职责是收集评审数据和发布评审报告,用于软件开发和测试过程以及评审过程的改进。主持人还需要进行评审员不同观点之间的协调 |
作者是提交评审的文档的创建者。如果多个人参与文档的创建,该文档的主要负责人可以指定为作者,由他负责该角色相关的职责和任务 |
评审员一般是指具有专门技木或业务背景的人员,也称为检验员(Checker)、审查员(Inspector),他们在必要的准备后,标识和描述被评审对象存在的问题(缺陷)。他们是涉及评审对象内容相关技术方面的专家 |
记录员记录所有在评审会议中提出的不足 问题(包括采取的措施、决定和建议等),以及在会议过程中标识的末解决的问题。记录员必须能够以简短和准确的方式记录评审中发现的问题,抓住评审过程中讨论的中心思想,清晰地表达问题 |
评审类型
类型 |
非正式评审 |
走查 |
技术评审 |
审查 |
特点 |
1.没有正式的过程 2.可以由程序员的同行们或技术负责人对设计和代码进行评审3.评审结果可以文档化4.评审者不同,评审作用可能会不同4.其主要目的是以较低的成本获得收益 |
1由作者召集开会2.以情景、演示的形式开展走查活动,并且以同行参加的方式进行3.开放式模式4.评审会议之前的准备、评审报告 发现的问题和记录员(不是作者本人)都不是必需的5.在实际情况中可以是非常正式的,也可能是非正式的6.其主要目的是学习、增加理解、发现缺陷 |
1.对发现的缺陷需要进行文档化。2.需要同行和技术专家的参与3.没有管理者参与的同行评审4.理想情况下由专门接受过培训的主持人(不是作者本人)来主持5.会议之前需要进行准备6.可以使用检查表、评市报告、发现的问题列表等7.在实际情况中可以是非常正式的,也可能是非正式的8.其主要目的是讨论、评估、发现缺陷,解决技术问题,检查与规格及标准的符合程度 |
1.由专门接受过培训的主持人(不是作者本人)来主持2.通常是同行检查3.定义工不同的角色4.引人了度量5.根据人口准则、出口准则和检查表定义正式的评审过程6.会议之前需要进行准备7.需要审查报告和发现问题列表8.有正式的跟踪过程9.可以进行过程改进10.其主要目的是发现缺陷 |
三.静态分析和工具支持
所谓静态测试(static testing)就是不实际运行被测软件,而只是静态地检查程序代码、界面或文档中可能存在的错误的过程。
从概念中我们可以知道,其包括对代码测试、界面测试和文档测试三个方面:
对于代码测试,主要测试代码是否符合相应的标准和规范。
对于界面测试,主要测试软件的实际界面与需求中的说明是否相符。
对于文档测试,主要测试用户手册和需求说明是否符合用户的实际需求
编译器分析工具
主要用途是通过编译器分析工具可以发现编程语言语法错误,并且以错误或警告的方式进行报告。很多的编译器也会产生其他的信息,并且执行其他的检查
规范标准一致性
主要用途是通过静态分析工具还可以检查测试对象是否与规范、标准相一致,例如是否遵循了编程规范和标准。
数据流分析
数据流分析主要是通过检查程序代码中的数据流来发现数据流异常。需要注意的是数据流分析通常发现的是数据流异常,不一定是缺陷。异常指的是由于不一致而可能导致的失效,也可能是代码的冗余。异常是一种风险,可能会触发系统的失效。
除此之外,数据流根据每个变量的使用情况定义了三种不同的变量状态:
- 己定义(D-Defined):变量已经赋值,表示此变量有确定的值
- 被引用(R-Referenced),读取或使用变量的值,表示此变量的值被使用了
- 未定义(U-Undefined):命名了变量,但还没有对变量赋值,或己经释放了变量(模块或函数结束时),此时的变量没有确定的值
控制流分析
假如将程序的结构以控制流图的方式表示,控制流图中的节点代表代码中的可执行语句。可以将没有分支的顺序系列语句表示为一个节点,因为这一系列语句在程序执行时其控制流并不会发生变化。假如执行这系列语句的第一句,系列内的其他语句也一定会被执行到。
圈复杂度
圈数可以用来测量程序代码结构的复杂度,所以也称作圈复杂度。
对于程序或程序模块的控制流图 G,它的圈复杂度(圈数)可以通过下面的公式计算得到:
v(G) = e -n + 2
其中:
v(G)为控制流图G 的圈数,
e为控制流图中的边数;
n为控制流图的节点数。
图 3-1 表示了程序模块的控制流,它是可以被调用的函数。圈数的计算式如下。
v(G) = e -n + 2 = 17 - 13 + 2 = 6
其中e为控制流图的边数= 17,n为控制流图的节点数= 13,计算得到的圈数为6