浅谈软件静态测试中的代码审查

摘要:本文描述了软件代码审查的作用、代码审查内容、代码审查过程,并列举一些常见代码审查问题。

  关键词:软件测试;代码审查;

  一、引言

  软件测试常用方法可分为动态测试和静态测试,只有动态测试和静态测试有效结合,才能更好的完成软件测试工作。代码审查是软件静态测试中常用的软件测试方法之一,代码审查时,只要测试人员方法得当、足够细心,往往能够产生意想不到的效果。

  二、代码审查的作用

  代码审查是在不执行软件的条件下有条理的仔细审查软件代码,从而找出软件缺陷的过程。

  代码审查可以找出动态测试难以发现或隔离的软件缺陷。在开发过程初期让测试人员集中精力进行软件代码审查非常有价值:可以提高代码质量;在项目的早期发现缺陷,将损失降至最低;促进团队沟通、促进知识共享、共同提高。

  代码审查还可以为动态测试时设计和执行测试用例提供思路。通过代码审查,可以确定有问题或者容易产生软件缺陷的特性范围。

  三、代码审查的过程

  代码审查过程可分为:代码审查策划阶段、代码审查实施阶段以及代码审查总结阶段。

  (一)代码审查策划阶段

  1、项目负责人分配代码审查任务;

  2、确定代码审查策略:依据软件开发文档,确定软件关键模块,作为代码审查重点;将复杂度高的模块也作为代码审查的重点;

  3、项目负责人确定代码审查单,审查内容一般可包括:

  (1)可追溯性:

  ――代码是否遵循详细设计?

  ――代码是否与需求一致?

  (2)逻辑:

  ――表示优先级的括号用法是否正确?

  ――代码是否依赖赋值顺序?

  ――“if…else”和“switch”使用是否正确清晰?

  ――循环能否结束?

  ――复合语句是否正确地被花括号括起来?

  ――case语句是否所有可能出现的情况均已考虑?

  ――“goto”是否使用?

  (3)数据:

  ――变量在使用前是否已初始化?

  ――变量的声明是否按组划分为外部的和内部的?

  ――除最明显的声明外,是否所有声明都有注释?

  ――每个命名是否仅用于一个用途?

  ――常量名是否都大写?

 ――常量是否都是通过“#define”定义的?

  ――用于多个文件中的常量是否在一个头文件中定义?

  ――头文件中是否存在可执行的代码?

  ――定义为指针的变量是否作为指针使用(而不是作为整数)?

  ――指针是否初始化?

  ――释放内存后是否将指针立即设置为NULL(或0)?

  ――传递指针到另一个函数的代码是否首先检查了指针的有效性?

  ――通过指针写入动态分配内存的代码是否首先检查了指针的有效性?

  ――宏的命名是否都大写?

  ――数组是否越界?

  (4)接口:

  ――在所有的函数及过程调用中,参数的个数都正确吗?

  ――形参与实参类型匹配吗?

  ――参数顺序正确吗?

  ――如果访问共享内存,是否具有相同的共享内存结构模式?

  (5)文档:

  ――软件文档是否与代码一致?

  (6)注释:

  ――注释与代码是否一致?

  ――用于理解代码的注释是否提供了必要的信息?

  ――是否对数组和变量的作用进行了描述?

  (7)异常处理:

  ――是否所有可能的错误都已加以考虑?

  (8)内存:

  ――在向动态分配的内存写入之前是否检查了内存申请是否成功?

  ――若采用动态分配内存,内存空间分配是否正确?

  ――当内存空间不再需要时,是否被明确的释放?

  (9)其它:

  ――是否检查了函数调用返回值?

  ――所有的输入变量都用到了吗?

  ――所有的输出变量在输出前都已赋值了吗?

  4、确定代码审查进度安排,项目负责人负责安排代码审查的进度。

  (二)代码审查实施阶段

  1、代码讲解:软件开发人员详细向测试人员讲解如何以及为何这样实现,测试人员提出问题和建议。通过代码讲解,测试人员对被审查的软件有了一个全面的认识,为后续代码审查打下良好的基础。

  2、静态分析:一般采用静态分析工具进行,主要分析软件的代码规模、模块数、模块调用关系、扇入、扇出、圈复杂度、注释率等软件质量度量元。静态分析在代码审查时应优先进行,有利于软件测试人员在后续代码审查时对软件建立宏观上认识,在审查中容易做到有的放矢,更易于发现软件代码中的缺陷。

  3、规则检查:采用静态分析工具对源程序进行编码规则检查,对于工具报出的问题再由人工进行进一步的分析以确认软件问题,是一种比较有效的方法。

  4、正式代码审查:代码审查可分两步进行:独立审查和会议审查。根据情况,这两步可以反复进行多次。

  (1)独立审查:测试人员根据项目负责人的工作分配,独自对自己负责的软件模块进行代码审查。测试人员根据代码审查单,对相关代码进行阅读、理解和分析后,记录发现的错误和疑问。

  (2)会议审查:项目负责人主持召开会议,测试人员和开发人员参加;测试人员就独立审查发现的问题和疑问与开发人员沟通,并讨论形成一致意见;对发现的问题汇总,填写软件问题报告单,提交开发人员处理。

  5、更改确认:开发人员对问题进行处理,代码审查人员对软件的处理情况进行确认,验证更改的正确性,并防止出现新的问题。

  (三)代码审查总结阶段

  代码审查工作结束后,项目负责人总结代码审查结果;编写测试报告,对软件代码质量进行评估,给出合理建议。

  把代码审查提出的所有问题、亮点及最终结论详细的记录下来,供其他软件项目代码审查借鉴。必要时,可建立常见软件代码缺陷数据库,为软件代码审查人员培训和执行代码审查提供数据支持,也可以为软件编码规则制定规范提供实践依据。

  四、代码审查中的常见问题

  如果软件测试人员熟悉常见的软件代码审查问题,对代码审查效率是很有帮助的。笔者根据自己的应验,列举部分常见软件代码审查问题如下(仅供参考):

  (1)浮点数相等比较:可能造成程序未按设计的路径执行;

  (2)因设计原因导致某些代码不能执行:如逻辑表达式永远为真(或假)造成某分支不能执行、代码前面有return语句、某模块从未被调用等;

  (3)switch语句没有break语句(有意如此设计时除外);

  (4)数组越界使用:数组越界容易发生在数组下标是计算得到的情况下,而且审查时很难发现这种代码缺陷,应加以重视;

  (5)变量未初始化就使用或者是条件赋值就使用;

  (6)程序中存在未使用的多余变量;

  (7)复合逻辑表达式没有使用括号造成运算顺序错误;

  (8)有返回值的函数中return没有带返回值;

  (9)逻辑判别的表达式不是逻辑表达式;

  (10)动态分配的内存没有及时释放:忘记写内存释放代码或由于其它逻辑缺陷导致内存释放代码未得到执行;

  (11)没有对缓冲区溢出进行必要的防护;

  (12)访问空指针,即指针未初始化就使用;

  (13)指针指向的内存释放后,未将指针置为NULL:其它函数访问该指针时,判断指针不为空,当作有效指针使用,会造成内存访问错误;

  (14)注释说明与程序代码实现不一致,甚至相反;

  (15)循环存在不能跳出的可能,程序中没有相应的保护机制。

  五、结束语

  软件代码审查是重要的软件测试方法之一,软件测试单位应建立完善的代码审查规程,规范代码审查过程。代码审查人员应善于使用软件静态分析工具,善于总结代码审查经验。软件代码审查工作做得扎实,可以发现很多软件编码隐含的缺陷,提高软件的可靠性,为后续的动态测试打下良好的基础。

====================================分割线================================

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-11-29 04:19:58

浅谈软件静态测试中的代码审查的相关文章

浅谈软件项目管理之测试

笔者从事软件行业相关工作将近十年,其中与测试相关时间有7年之久,现浅谈软件项目管理中测试的必要性,供大家参考. 一.测试的必要性 为什么需要测试,那是因为由于分工的精细化,软件开发必须经历客户.需求.设计.开发多个环节.为了保证最终的结果符合要求,上下游是需要确认的. 用户告诉我们:我需要什么?软件企业需要在理解正确.表达正确的情况下完成需求规则说明书,把客户的原始需求转变为IT需求,表达出能够提供什么 需求的下一环节是设计,设计主要是要要说清楚:我要让软件做什么.需要与前一环节确认理解正确了.

用户体验设计:浅谈可用性测试中沟通的技巧

文章描述:如何快速解除用户防备?--浅谈可用性测试中沟通的技巧.   一般来说,在产品的设计和开发过程中,不同阶段会使用到不同的用户研究方法.比如,在产品正式发布之前,通常会进行可用性测试.可用性测试,是指让一群有代表性的用户尝试对产品进行典型操作,同时观察员和开发人员在一旁观察.聆听.记录.该产品可能是一个网站.软件,或其他任何产品,它可能已经做好,也可能尚未成型. 对于一个典型的可用行测试,我们可以:1. 通过观察用户在使用产品过程中出现的一些问题,发现产品的可用性问题2. 从测试参与者的表

浅谈云计算发展中亟待解决的问题

发展云计算不能"跟风攀比""乱云飞渡"--浅谈云计算发展中亟待解决好的几个问题 到目前为止,中国已经掀起了一场云计算发展的热潮.从媒体的热炒,到资本的造势,再到大量学术活动裹挟着的商务宣传,已经拼命地为云计算概念加温.加上Google.IBM.微软等IT巨头们以前所未有的速度和规模进行云计算的推广和炒作,更是把云计算推上了峰巅.云规划,云纲要,云项目.云基地似乎已经成为各级政府新的发展规划中一道最亮丽的风景线. 随着各地云计算热情的空前高涨,一时间多地政府纷纷出台优

浅谈软件项目管理环境下的质量管理

浅谈软件项目管理环境下的质量管理 摘要:软件项目管理是为了使软件项目能够按照预定的成本.进度.质量顺利完成,而对成本.人员.进度.质量.风险等进行分析和管理的活动.软件项目的质量管理就是产出的软件,满足客户明确需求.隐含需求的能力的所有特性.在现实生活中,监控所有对质量有影响的关键点,采用有效的测量手段来管理软件的质量,从而实现软件项目的"高"质量.使软件项目管理较之其他项目管理而言有其特殊性.采用CMM标准可以确保软件项目的质量,CMM是美国卡纳基梅隆大学软件工程研究所提出的软件研发

浅谈网站SEO中避免pr高权重外链建设误区

做网站优化的站长需要经常要去发外链或者是交换友情链接,网站外链的数量和质量对网站的关键词排名有着非常重要的影响.我们去和别的网站交换友情链接,首先要考虑的就是对方网站是否和我们的网站门当户对.大家都喜欢高pr和高权重,认为权重高的网站自然能传递给我们网站不错的权重,从而提高我们网站的关键词排名.但事实上高pr和高权重并不一定会给我们网站带来好处,有时候还会影响搜索引擎对我们网站的印象. 网站优化中做外链最主要的就是把其他页面的权重传递给我们的网站,提高我们网站自身的权重,从而使关键词在搜索引擎中

浅谈SQL Server中的快照

原文:浅谈SQL Server中的快照 简介     数据库快照,正如其名称所示那样,是数据库在某一时间点的视图.是SQL Server在2005之后的版本引入的特性.快照的应用场景比较多,但快照设计最开始的目的是为了报表服务.比如我需要出2011的资产负债表,这需要数据保持在2011年12月31日零点时的状态,则利用快照可以实现这一点.快照还可以和镜像结合来达到读写分离的目的.下面我们来看什么是快照.   什么是快照     数据库快照是 SQL Server 数据库(源数据库)的只读静态视图

浅谈PHP正则中的捕获组与非捕获组_php实例

今天遇到一个正则匹配的问题,忽然翻到有捕获组的概念,手册上也是一略而过,百度时无意翻到C#和Java中有对正则捕获组的特殊用法,搜索关键词有PHP时竟然没有相关内容,自己试了一下,发现在PHP中也是可行的,于是总结一下,分享的同时也希望有大神和细心的学习者找到我理解中出现的问题. 什么是捕获组 我们先看一下PHP的正则匹配函数 int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags =

浅谈spring容器中bean的初始化_java

当我们在spring容器中添加一个bean时,如果没有指明它的scope属性,则默认是singleton,也就是单例的. 例如先声明一个bean: public class People { private String name; private String sex; public String getName() { return name; } public void setName(String name) { this.name = name; } public String get

浅谈MySQL存储过程中declare和set定义变量的区别_Mysql

在存储过程中常看到declare定义的变量和@set定义的变量.简单的来说,declare定义的类似是局部变量,@set定义的类似全局变量. 1.declare定义的变量类似java类中的局部变量,仅在类中生效.即只在存储过程中的begin和end之间生效. 2.@set定义的变量,叫做会话变量,也叫用户定义变量,在整个会话中都起作用(比如某个应用的一个连接过程中),即这个变量可以在被调用的存储过程或者代码之间共享数据.如何理解呢?可以看下面这个简单例子,很好理解.  (1)先执行下面脚本,创建