《软件测试》第六章 检查代码

2023-11-13

6.0 前言

本章重点包括:

  • 静态白盒测试的好处
  • 各种类型的静态白盒测试综述
  • 编码规范和标准
  • 如何从整体审查代码错误

6.1 静态白盒测试:检查设计和代码

静态测试是指测试非运行部分——检验和审查。白盒(或者称为透明盒)测试是指访问代码,能够查看和审查。

静态白盒测试是在不执行软件的条件下有条理地仔细审查软件设计、体系结构和代码,从而找出软件缺陷的过程,有时称为结构化分析。

进行静态白盒测试的首要原因是尽早发现软件缺陷,以找出动态黑盒测试难以发现或隔离的软件缺陷。在开发过程初期让测试小组集中精力进行软件设计的审查非常有价值。进行静态白盒测试的另一个好处是,为黑盒测试员在接到软件进行测试时设计和应用测试用例提供思路。他们可能不必了解代码的细节,但是通过听审查评论,就可以确定有问题或者容易产生软件缺陷的特性范围。

6.2 正式审查

正式审查就就是进行静态白盒测试的过程。正式审查有4个基本要素:

  • 确定问题。审查的目的是找出软件的问题——不仅是出错的项目,还包括遗漏项目。全部的批评应该直指代码或设计,而不是其设计实现者。参与者之间不应该相互指责,应把自我意识、个人情绪和敏感丢在一边
  • 遵守规则。审查要遵守一套固定的规则,规则可能设定要审查的代码量(通常有数百行),花费多少时间(数小时),哪些内容要做评价等。其重要性在于参与者了解自己的角色、目标是什么。这有助于使审查进展得更加顺利。
  • 准备。每一个参与者都为审查做准备,并尽自己的力量。根据审查的类型,参与者可能扮演不同的角色。他们需要了解自己的责任和义务,并积极参与审查。在审查过程中找出的问题大部分是在准备期间而不是实际审查期间发现的
  • 编写报告。审查小组必须做出审查结果的书面总结报告,并使报告便于开发小组的成员使用。审查会议结果必须尽快告诉别人——诸如发现了多少问题,在哪里发现的,等等。

进行正式审查要按照已经建立起来的过程执行。随意“聚在一起复查代码”是不够的,实际上还会造成危害。如果执行过程随意,就会遗漏软件缺陷,参与者很可能感觉这样做是在浪费时间

除了发现问题,坚持正式审查还有一些间接效果:

  • 交流。正式报告中未包含的信息得以交流。例如,黑盒测试员可以洞察问题所在。缺少经验的程序员可以向有经验的程序员学习新技术。管理员对于项目如何跟上进度更加心中有数。
  • 质量。程序员的代码经过逐个功能、逐行代码仔细复查,常常会使程序员变得更加仔细。这不是说他粗心大意——只是说如果他自己知道自己的工作要被他人仔细审查,就会多花一些心思保证正确性。
  • 小组同志化。如果审查正确进行,软件测试员和程序员就会对双方技艺相互尊重,并且更好地了解相互的工作及其需求。
  • 解决方案。尽管是否讨论解决方案取决于审查的规则,但是解决方案应该用于处理严重问题。在审查的范围之外讨论解决方案也许更有效。

6.2.1 同事审查

召集小组成员进行初次正式审查最简单的方法就是通过同事审查的方式。这种方法大体类似于“如果你给我看你的,我也给你看我的”类型的讨论。同事审查通常仅在编写代码或设计体系结构的程序员,以及充当审查者的其他一两个程序员和测试员之间进行

这个小团体只是在一起审查代码,寻找问题和失误。为了保证审查的高效率(不致流于休息闲聊),所有的参与者要切实保证正式审查的4个关键要素:查找问题、遵守规则、审查准备和编写报告。

6.2.2 走查

走查是比同事审查更正规化的下一步。走查中编写代码的程序员向5人小组或其他程序员和测试员组成的小组做正式陈述。审查人员应该在审查之前接到软件拷贝,以便检查并编写备注和问题,在审查过程中提问。审查人员之中至少有一位资深程序员是很重要的。

陈述者逐行或者逐个功能地通读代码,解释代码为什么且如何工作。审查人员聆听叙述,提出有疑义的问题。由于公开陈述的参与人数要多于同事审查的,因此,为审查做好准备和遵守规则是非常重要的同样重要的是,审查之后陈述者要编写报告说明发现了哪些问题,计划如何解决发现的软件缺陷

6.2.3 检验

检验是最正式的审查类型,具有高度组织化,要求每一个参与者都接受训练。检查与同事审查和走查的不同之处在于表述代码的人——表述者或者宣读者——不是原来的程序员。这就迫使他学习和了解要表述的材料,从而有可能在检验会议上提出不同的看法和解释。

其余的参与者称为检验员,其职责是从不同的角度如用户、测试员或者产品支持人员的角度审查代码。检查员甚至要担负着倒过来(也就是说,从尾至头)审查代码的责任,确保材料的彻底和完整。

有些检验员还同时被委任为会议协调员和会议记录员,以保证检验过程遵守规则及审查有效进行

召开检验会议之后,检验员可能再次碰头讨论他们发现的不足之处,并与会议协调员共同准备一份书面报告,明确解决问题所必须重做的工作。然后程序员进行修改,由会议协调员验证修改结果。根据修改的范围和规模以及软件的关键程度,可能还需要进行重新检验,以便找到其余的软件缺陷。

检验经证实是所有软件交付内容中,特别是设计文档和代码中发现软件缺陷非常有效的方法。

6.3 编码标准和规范

标准是建立起来、经过修补和必须遵守的规则——做什么和不做什么。规范是建议最佳做法、推荐更好的方式。标准没有例外情况,缺少结构化的放弃步骤。规范就要松一些,不如标准严格。

6.4 通用代码审查清单

6.4.1 数据引用错误

数据引用错误是指使用未经正确声明和初始化的变量、常量、数组、字符串或记录而导致的软件缺陷。

  • 是否引用了未初始化的变量?查找遗漏之处与查找错误同等重要。
  • 数组和字符串的下标是整数值吗?下标总是在数组和字符串长度范围之内吗?
  • 在检索操作或者引用数组下标时是否包含“丢掉一个”这样的潜在错误?
  • 变量是否被赋予不同类型的值?
  • 为引用的指针分配内存了吗?
  • 一个数据结构是否在多个函数或者子程序中引用,在每一个引用中明确定义结构了吗?

数据引用错误是缓冲区溢出的主要原因——一个造成许多软件安全问题的缺陷

6.4.2 数据声明错误

数据声明错误产生的原因是不正确地声明或使用变量和常量。

  • 所有变量都赋予正确的长度、类型了吗?
  • 变量是否在声明的同时进行了初始化?是否正确初始化并与其类型一致?
  • 变量有相似的名称吗?这基本上不算软件缺陷,但有可能程序中其他地方出现名称混淆的信息。
  • 存在声明过但从未引用或者只引用过一次的变量吗?
  • 所有变量在特定模块中都显式声明了吗?如果没有,是否可以理解为该变量与更高级别的模块共享?

6.4.3 计算错误

计算或者运算错误实质上是糟糕的数学问题——计算无法得到预期结果。

  • 计算中是否使用了不同数据类型的变量,例如将整数与浮点数相加?
  • 计算中是否使用了类型相同但是长度不同的变量——例如,将字节与字相加?
  • 计算时是否了解和考虑到编译器对类型或长度不一致的变量的转换规则?
  • 赋值的目的变量是否小于赋值表达式的值?
  • 在数值计算过程中是否可能出现溢出?
  • 除数/模是否可能为0?
  • 对于整型算术运算,处理某些计算(特别是除法)的代码是否会导致精度丢失?
  • 变量的值是否超过有意义的范围?例如,可能性的计算结果是否小于0%或者大于100%?
  • 对于包含多个操作数的表达式,求值的次序是否混乱,运算优先级对吗?需要加括号使其清晰吗?

6.4.4 比较错误

小于、大于、等于、不等于、真、假——比较和判断错误很可能是由于边界条件问题。

  • 比较得正确吗?虽然听起来简单,但是比较应该是小于还是小于或等于常常发生混淆。
  • 存在分数或者浮点值之间的比较吗?如果有,精度问题会影响比较吗?1.00000001和1.00000002极其接近,它们相等吗?
  • 每一个逻辑表达式都正确表达了吗?逻辑计算按预计的进行了吗?求值次序有疑问吗?
  • 逻辑表达式的操作数是逻辑值吗?例如,是否包含整数值的整型变量用于逻辑计算中?

6.4.5 控制流程错误

控制流程错误的原因是编程语言中循环等控制结构未按预期方式工作。它们通常由计算或者比较错误直接或间接造成。

  • 如果程序包含begin…end和do…while等语句组,end是否明确给出并与语句组对应?
  • 程序、模块、子程序和循环能否终止?如果不能,可以接受吗?
  • 可能存在永远不停的循环吗?
  • 循环是否可能永不执行?如果是这样,可以接受吗?
  • 如果程序包含像switch…case语句这样的多个分支,索引变量能超出可能的分支数目吗?如果超出,该情况能正确处理吗?
  • 是否存在“丢掉一个”错误,导致循环意外的流程?

6.4.6 子程序参数错误

子程序参数错误的来源是软件子程序不正确地传递数据:

  • 子程序接收的参数类型和大小与调用代码发送的匹配吗?次序正确吗?
  • 如果子程序有多个入口点,引用的参数是否与当前入口点没有关联?
  • 常量是否当作形参传递,在子程序中被意外改动?
  • 子程序更改了仅作为输入值的参数吗?
  • 每一个参数的单位是否与相应的形参匹配,例如,英尺对米?
  • 如果存在全局变量,在所有引用子程序中是否有相同的定义和属性?

6.4.7 输入/输出错误

输入/输出错误包括文件读取、接受键盘或者鼠标输入以及向打印机或者屏幕等输出设备写入错误。下列条目非常简单、通用,应该在使用时补充,以涵盖所测试的软件。

  • 软件是否严格遵守外部设备读写数据的专用格式?
  • 文件或者外设不存在或者未准备好的错误情况有处理吗?
  • 软件是否处理外部设备未连接、不可用,或者读写过程中存储空间占满等情况?
  • 软件以预期方式处理预计的错误吗?
  • 检查错误提示信息的准确性、正确性、语法和拼写了吗?

6.4.8 其他检查

这个压轴清单定义了一些不适合放在其他类别的条目。这不是为了完整,而是为了定制软件项目清单应该加入的内容。

  • 软件是否使用其他外语?是否处理扩展ASCII字符?是否需要用统一编码取代ASCII?
  • 软件是否要移植到其他编译器和CPU,具有这样做的许可吗?如果没有计划或者测试,那么,移植性可能成为一个大难题。
  • 是否考虑了兼容性,以使软件能够运行于不同数量的可用内存、不同的内部硬件(例如图形和声卡)、不同的外设(例如打印机和调制调解器)?
  • 程序编译是否产生“警告”或者“提示”信息?这些信息通常指示进行了有疑问的处理。纯粹主义者可能认为警告信息是不可接受的。

6.5 小结

检查代码——静态白盒测试——被证实是早期发现软件缺陷最有效的方法。虽然这是一项需要大量准备工作才能有成效的任务,但是许多研究表明花费的时间与得到的好处相比是值得的。为了使这项任务更有吸引力,现在有了能自动执行大量静态白盒测试工作的商业软件,即静态分析程序。该程序读入程序的源文件,并根据公开标准和自定义规范进行检查。编译器也提高了能力,如果启用所有等级的错误检查,它将捕捉到前面通用代码审查清单列出的许多问题,有些编译器甚至不允许使用具有安全问题的函数。这些工具不是要取消代码审查或者检查任务,只是使任务更容易完成,并给软件测试员更多时间来挖掘更深的软件缺陷。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《软件测试》第六章 检查代码 的相关文章

  • 软件测试开发/全日制/测试管理丨Docker容器技术

    Docker 是一种轻量级的容器技术 通过将应用程序及其所有依赖项封装到一个可移植的容器中 实现了应用程序的便携性 可部署性和可伸缩性 下面是关于 Docker 容器技术的主要概念和优势 主要概念 容器 Container 容器是一个轻量级
  • 软件测试开发/全日制/测试管理丨用户端 Web 自动化测试

    随着Web应用的普及和不断发展 用户端Web自动化测试成为确保Web应用质量的重要手段 这种测试方法不仅提高了测试效率 也帮助团队及时发现和解决潜在问题 确保用户体验的连贯性和稳定性 工具选择 用户端Web自动化测试的第一步是选择适当的工具
  • 真的干不过,00后整顿职场已经给我卷麻了,想离职了...

    在程序员职场上 什么样的人最让人反感呢 是技术不好的人吗 并不是 技术不好的同事 我们可以帮他 是技术太强的人吗 也不是 技术很强的同事 可遇不可求 向他学习还来不及呢 真正让人反感的 是技术平平 却急于表现自己的人 每天加班到12点 在老
  • “揭秘性能测试工具:优化软件性能的关键秘籍“

    性能测试工具的设计宗旨是为了模拟用户对软件应用程序或系统的各种操作 旨在评估关键的性能指标 包括响应时间 吞吐量 并发能力和资源利用率 通过这些工具模拟的多用户环境 我们能够产生与实际工作负载相似的条件 并监测系统在这种情况下的性能表现 一
  • Python接口自动化测试处理不同接口间参数依赖

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 2k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • Jenkins 插件下载速度慢、安装失败了!我教你怎么解决!

    Jenkins部署完毕 如果不安装插件的话 那它就是一个光杆司令 啥事也做不了 所以首先要登陆管理员账号然后点击系统管理再点击右边的插件管理安装CI CD必要插件 但是问题来了 jenkins下载插件速度非常慢 而且经常提示下载插件失败 真
  • Jmeter 性能-并发量计算

    并发概念 指网站在同一时间访问的人数 人数越大瞬间带宽要求更高 服务器并发量分为 业务并发用户数 最大并发访问数 系统用户数 同时在线用户数 估算业务并发量的公式 C nL T C C 3 C的平方根 说明 C是平均的业务并发用户数 n是l
  • APP端网络测试与弱网模拟

    当前APP网络环境比较复杂 网络制式有2G 3G 4G网络 还有越来越多的公共Wi Fi 不同的网络环境和网络制式的差异 都会对用户使用app造成一定影响 另外 当前app使用场景多变 如进地铁 上公交 进电梯等 使得弱网测试显得尤为重要
  • 测试工程师能否作为一份「终身职业」?30岁+怎么办?

    讨论 测试工程师可否作为一份终生的职业 这是我在论坛看到的一个讨论 你的答案是什么呢 我希望大家能认真思考后给出一个属于自己的答案 无论你是新手入门 还是资深专家 回答这个问题请不要凭一腔热血 也不用过分消极 别总和钱挂钩 平心而论即可 就
  • 微信小程序的自动化测试框架

    微信发布了小程序的自动化测试框架Minium 提供了多种运行验证方式 其特点 支持一套脚本 iOS Android 模拟器 三端运行 提供丰富的页面跳转方式 看不到也能去得到 可以获取和设置小程序页面数据 让测试不止点点点 可以直接触发小程
  • 软件测试|深入了解Python中的super()函数用法

    简介 Python中的super 函数是一种强大的工具 用于在子类中调用父类的方法 它在面向对象编程中非常有用 可以让你轻松地扩展和重用现有的类 本文将详细介绍super 函数的用法 并提供一些示例来帮助你更好地理解它的功能 什么是supe
  • 软件测试|使用matplotlib绘制多种折线图

    简介 在数据可视化领域 Matplotlib是一款非常强大的Python库 它可以用于绘制各种类型的图表 包括折线图 本文将介绍如何使用Matplotlib创建多种不同类型的折线图 并提供示例代码 创建模版 在绘图之前 我们可以先创建我们的
  • Jmeter 性能-阶梯负载最终请求数

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 摸爬滚打多年的打工人,总结了三条职场真理,绝不假大空!

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 甜蜜而简洁 —— 深入了解Pytest插件pytest-sugar

    在日常的软件开发中 测试是确保代码质量的关键步骤之一 然而 对于测试报告的生成和测试结果的可读性 一直以来都是开发者关注的焦点 Pytest插件 pytest sugar 以其清晰而美观的输出 为我们提供了一种愉悦的测试体验 本文将深入介绍
  • 2024拒绝行业内卷!八年软件测试20K*16薪行业心得 想入行必看

    目前工作做软件测试工作8年 属于高级测试员那个级别吧 现在看到各行各业的人都在转行学习软件测试 想给大家一些学习建议和忠告 很多粉丝都跟我说今年行情很差 找不到工资 真的找不到工作了吗 我们常在网上看到的 程序员饱和 程序员过剩 其实一般是
  • 外包干了2个月,技术倒退2年。。。

    先说一下自己的情况 本科生 20年通过校招进入深圳某软件公司 干了接近4年的 功能测试 今年国庆 感觉自己不能够在这样下去了 长时间呆在一个舒适的环境会让一个人堕落 而我已经在一个企业干了四年的功能测试 已经让我变得不思进取 谈了3年的女朋
  • 15:00面试,15:06就出来了,问的问题有点变态。。。

    从小厂出来 没想到在另一家公司又寄了 到这家公司开始上班 加班是每天必不可少的 看在钱给的比较多的份上 就不太计较了 没想到9月一纸通知 所有人不准加班 加班费不仅没有了 薪资还要降40 这下搞的饭都吃不起了 还在有个朋友内推我去了一家互联
  • 一文从0到1手把手教学UI自动化测试之数据驱动!

    在UI的自动化测试中 我们需要把测试使用到的数据分离到文件中 如果单纯的写在我们的测试模块里面 不是一个好的设计 所以不管是什么类型的自动化测试 都是需要把数据分离出来的 当然分离到具体的文件里面 文件的形式其实有很多的 这里主要说明JSO
  • Airtest自动化测试工具

    一开始知道Airtest大概是在年初的时候 当时 看了一下官方的文档 大概是类似Sikuli的一个工具 主要用来做游戏自动化的 通过截图的方式用来解决游戏自动化测试的难题 最近 移动端测试的同事尝试用它的poco库来做自动化 看样子还不错

随机推荐

  • Unity3D 车流线

    效果图 因为是静态图片可能不太能看出效果 车流线主要是用来模拟城市中行动的车 直接使用车模型 会在大场景中看不清楚 效果不会很好 一 实现原理 车流线肯定是需要绘制线条的 我这里直接使用TrailRender 这个拖尾功能可能很好帮助我们控
  • NPM酷库:accounting,格式化数字和货币

    NPM酷库 每天两分钟 了解一个流行NPM库 上次 我们了解到如何使用numeral库格式化数字 今天我们继续认识另外一个用来格式化数字的库accounting accounting accounting 主要提供的方法有 formatMo
  • Shuffle过程详解

    Shuffle过程详解 Shuffle过程是MapReduce的核心 最近看了很多资料 网上说法大体相同 但有些地方有一点点出入 就是各个阶段的执行顺序 总个shuffle过程可以看做是从map输出到reduce输入的这个中间过程 在这个中
  • Java 学习路线

    文章目录 Java基础 1 Java 基本功 1 1 Java 入门 基础概念与常识 1 2 Java 语法 1 3 基本数据类型 1 4 方法 函数 2 Java 面向对象 2 1 类和对象 2 2 面向对象三大特征 2 3 修饰符 2
  • web前端面试的自我介绍

    开始背景 1 面试官在你自我介绍的时候 才有时间看你的简历 人太多没时间看 看了也记不住 2 你在自我介绍中 他在想问你什么问题 3 了解你语言 表达能力 自信气场 仪表形态 常规低级错误 1 对面试官说 简历上有你自己看吧 2 对照简历就
  • .sh文件中第一行 #!/bin/bash -il 是什么

    sh文件中第一行 bin bash il 是什么 是执行该脚本文件的解释器的路径和选项 在一个 shell 脚本文件的第一行加上 符号 称为 shebang 它告诉系统使用哪个解释器执行这个脚本 在 bin bash 的例子中 它告诉系统使
  • Deep learning-based CSI Feedback for Beamforming 1

    1 Abstract The potentials of massive multiple input multipleoutput MIMO are all based on the available instantaneous cha
  • 目标检测综述-------深度学习用于目标检测的近期进展 introduction(一)

    论文题目 Recent Advances in Deep Learning for Object Detection 论文地址 摘要 目标检测是计算机视觉一个重要的视觉问题并且在最近得到了广泛的研究 视觉目标检测致力于在给定的图像内找到带有
  • “No input file specified “问题的处理

    接手新项目 配置的时候 遇上了 No input file specified 的问题 第一反应 是上网搜 关于这个问题的帖子有很多 总的来说 得到的问题原因有 一 跟路径有关系 路径没指对 二 可能是权限的问题 如 不允许访问 三 SCR
  • 《实现VM机与本机互ping》

    实现VM机与本机互ping 1 安装VM机及对应的OS gt 到本机检测VMware Network Adapter VMnet8是否已经生成 网上邻居 网络连接 2 查看 VMware Network Adapter VMnet8 网络I
  • C++ for循环跳过某一项求和

    include
  • 双三次插值及Matlab实现

    双三次插值及Matlab实现 一 简单实例 采用简单实例进行对双三次插值的介绍 由于双三次插值对于目标图像的某一像素进行估计时 所采用的像素信息为其周围16个像素点信息 因此不同于最近邻插值和双线性插值 此时假设有 5 5 5 times5
  • feign.FeignException: status 400 reading xxx#xxxx(String); content:

    网上有很多不一样的说话 我这个主要是因为feign的那个方法使用的 RequestParam注解 这个接收的参数长度过长造成的 这也是feign就算使用post方法 RequestParam的那个参数他会放在请求地址后面 而不是放在请求体
  • JupyterNotebook设置Python环境的方法步骤

    不多说 看链接 https stackoverflow com questions 39604271 conda environments not showing up in jupyter notebook conda activate
  • LAMP架构(qq农场)、部署jira、Java+数据库环境、

    LAMP架构 论坛 yum y install httpd yum y install mariadb mariadb server yum y install php php fpm php mysql php gd gd systemc
  • Linux多线程

    什么是线程 线程是OS调度的基本单位 其实在Linux环境下 线程可以看做是轻量级线程 Linux的线程本质仍然是进程 Linux先有进程后有线程 当创建了一个进程时 系统给他分配一段4G的虚拟内存 并在其内生成进程的PCB 当他调用相关函
  • 2023年网络安全趋势【网安人必看】

    数据安全越来越重要 我国 数据安全法 提出 建立健全数据安全治理体系 各地区部门均在探索和简历数据分类分级 重要数据识别与重点保护制度 数据安全治理不仅是一系列技术应用或产品 更是包括组织构建 规范制定 技术支撑等要素共同完成数据安全建设的
  • android Native和 Flutter 通信

    android 工程集成Flutter 集成方式主要是两种 1 工程的方式集成 首先创建android 和flutter工程 工程路径必须在同一路径下 1 在android 工程的settings gradle 文件中添加 rootProj
  • oracle的jdbc的版本与jdk对应关系

    连接类型 1 JDBC OCI oci是oracle call interface的缩写 此驱动类似于传统的ODBC 驱动 因为它需要Oracle Call Interface and Net8 所以它需要在运行使用此驱动的JAVA程序的机
  • 《软件测试》第六章 检查代码

    软件测试 第六章 检查代码 6 0 前言 6 1 静态白盒测试 检查设计和代码 6 2 正式审查 6 2 1 同事审查 6 2 2 走查 6 2 3 检验 6 3 编码标准和规范 6 4 通用代码审查清单 6 4 1 数据引用错误 6 4