【软件测试】学习笔记-代码级测试的基本理念与方法

通常情况下,代码级测试的工作都是由开发人员完成,但是测试框架选型、覆盖率统计工具选型、测试用例设计原则等都需要资深的测试工程师或者测试架构师参与。

为了能更好地协助开发人员做好代码级测试,这篇文章是根据实际工程项目中的实践,总结了五种常见的代码错误,以及对应的四大类代码级测试方法。

掌握了这些错误类型、测试方法,相信你就可以搞定代码级测试了,即使自己不用去完成测试工作,也可以让开发人员对你另眼相看,可以更高效地互相配合完成整个项目。

这里需要注意的是,代码级测试的测试方法一定是一套测试方法的集合,而不是一个测试方法。 因为单靠一种测试方法不可能发现所有潜在的错误,一定是一种方法解决一部分或者一类问题,然后综合运用多种方法解决全部问题。

本着先发现问题,然后解决问题的思路,在正式介绍代码级测试方法之前,先来概括一下常见的代码错误类型,然后我们再一起讨论代码级测试有哪些方法。这样,我们就可以清晰地看出,每一种代码级测试方法都能覆盖哪些类型的代码错误。

根据过往的经验来看,代码错误,可以分为“有特征”的错误和“无特征”的错误两大类。“有特征”的错误,可进一步分为语法特征错误、边界行为错误和经验特征错误;“无特征”的错误,主要包括算法错误和部分算法错误。

接下来,将详细介绍这五类代码错误的具体含义是什么。

常见代码错误类型

第一,语法特征错误

语法特征错误是指,从编程语法上就能发现的错误。比如,不符合编程语言语法的语句等。

如果你使用IDE环境进行代码开发,那么IDE可以提示你大部分的这类错误,而且只有解决了这类错误,才能编译通过。但是,还会有一些比较隐晦的语法特征错误,IDE不能及时发现,而且也不会影响编译,只会在运行阶段出错。

void demoMethod(void)
{int a[10];a[10]=88;...
}

比如,这段C语言代码就存在数据越界的问题。

很显然,你从语法上很容易就能发现,这段代码初始化了一个长度为10的整型数组a,但数组下标从0开始,所以最大可用的数组空间应该是a[9],而这里却使用了a[10],造成数组越界,访问了未被初始化的内存空间,代码运行时(Runtime)就会造成意想不到的结果。

第二,边界行为特征错误

边界行为特征错误是指,代码在执行过程中发生异常,崩溃或者超时。之所以称为“边界”,是由于此类错误通常都是发生在一些边界条件上。

int Division(int a, int b)
{return a/b;
}

这段C语言代码就存在具有边界行为特征的错误。当b取值为0时,Division函数就会抛出运行时异常。

第三,经验特征错误

经验特征错误是指,根据过往经验发现代码错误。

void someMethod(void)
{...if(i=2){// if the value of i equals to 2, call method "operationA"operationA();}else{// if the value of i doesn't equal to 2, call method "operationB"operationB();}
}

这段C语言代码,就是一个典型的具有经验特征错误的代码片段。代码想要表达的意思是:如果变量i的值等于2,就调用函数operationA;否则,调用函数operationB。

但是,代码中将“if(i==2)”错误地写成了“if(i=2)”,就会使原本的逻辑判断操作变成了变量赋值操作,而且这个赋值操作的返回结果永远是true,即这段代码永远只会调用operationA的分支。

显然,“if(i=2)”在语法上没有错误,但是从过往经验来看,这就很可能是个错误了。也就是说,当你发现一个原本应该出现逻辑判断语句的地方,现在却出现了赋值语句,那就很有可能是代码写错了。

第四,算法错误

算法错误是指,代码完成的计算(或者功能)和之前预先设计的计算结果(或者功能)不一致。

这类错误直接关系到代码需要实现的业务逻辑,在整个代码级测试中所占比重最大,也是最重要的。但是,完全的算法错误并不常见,因为不能准确完成基本功能需求的代码,是一定不会被递交的。所以,在实际工程项目中,最常见的是部分算法错误。

第五,部分算法错误

部分算法错误是指,在一些特定的条件或者输入情况下,算法不能准确完成业务要求实现的功能。这类错误,是整个代码级测试过程中最常见的类型。

int add(int a, int b)
{return a+b;
}

这段C语言代码,完成了两个int类型整数的加法运算。在大多数情况下,这段代码的功能逻辑都是正确的,能够准确地返回两个整数的加法之和。但是,在某些情况下,可能存在两个很大的整数相加后和越界的情况,也就是说两个很大的int数相加的结果超过了int的范围。这就是典型的部分算法错误。

代码级测试常用方法

介绍完了语法特征错误、边界行为特征错误、经验特征错误、算法错误、部分算法错误这五类代码错误后,我们再回过头来看看代码级测试的方法有哪些,这些测试方法又是如何揭露这五类代码错误的。

在我看来,代码级测试方法主要分为两大类,分别是静态方法和动态方法。

  • 静态方法,顾名思义就是在不实际执行代码的基础上发现代码缺陷的方法,又可以进一步细分为人工静态方法和自动静态方法;
  • 动态方法是指,通过实际执行代码发现代码中潜在缺陷的方法,同样可以进一步细分为人工动态方法和自动动态方法。

这里需要注意到的是,我在这篇文章中只会和你分享这四种方法具体是什么,各有何局限性和优势,分别可以覆盖哪些错误类型。而对于,具体如何用这四种方法完成代码级测试,测试用例如何设计、常用的测试工具如何使用,我会在后面两篇文章(《深入浅出之静态测试方法》和《深入浅出之动态测试方法》)中详细展开。

第一,人工静态方法

人工静态方法是指,通过人工阅读代码查找代码中潜在错误的方法,通常采用的手段包括,开发人员代码走查、结对编程、同行评审等。

理论上,人工静态方法可以发现上述五类代码错误,但实际效果却并不理想。 这个方法的局限性,主要体现在以下三个方面:

  1. 过度依赖于代码评审者的个人能力,同样的评审流程,发现的问题却相差悬殊;
  2. 如果开发人员自行走查自己的代码,往往会存在“思维惯性”,开发过程中没有能考虑的输入和边界值,代码走查时也一样会被遗漏;
  3. 由于完全依赖人工,效率普遍较低。

第二,自动静态方法

自动静态方法是指,在不运行代码的方式下,通过词法分析、语法分析、控制流分析等技术,并结合各种预定义和自定义的代码规则,对程序代码进行静态扫描发现语法错误、潜在语义错误,以及部分动态错误的一种代码分析技术。

自动静态方法可以发现语法特征错误、边界行为特征错误和经验特征错误这三类“有特征”的错误,但对于算法错误和部分算法错误这两种“无特征”的错误却无能为力。根本原因在于,自动静态方法并不清楚代码的具体业务逻辑。

目前,自动静态方法无论是在传统软件企业,还是在互联网软件企业都已经被广泛采用,往往会结合企业或项目的编码规范一起使用,并与持续集成过程紧密绑定。

你需要根据不同的开发语言,选择不同的工具。目前有很多工具都可以支持多种语言,比如Sonar、Coverity等,你可以根据实际需求来选择。

第三,人工动态方法

人工动态方法是指,设计代码的输入和预期的正确输出的集合,然后执行代码,判断实际输出是否符合预期。我在之前的第三篇文章《什么是单元测试?如何做好单元测试?》中介绍的单元测试,采用的测试方法本质上就是人工动态方法。

在代码级测试中,人工动态方法是最主要的测试手段,可以真正检测代码的逻辑功能,其关注点是“什么样的输入,执行了什么代码,产生了什么样的输出”,所以最善于发现算法错误和部分算法错误。

目前,不同的编程语言对应有不同的单元测试框架,比如,对Java语言最典型的是Junit和TestNG,对于C语言比较常用的是Google Test等。

第四,自动动态方法

自动动态方法,又称自动边界测试方法,指的是基于代码自动生成边界测试用例并执行,以捕捉潜在的异常、崩溃和超时的方法。

自动动态方法,可以覆盖边界行为特征错误, 通常能够发现“忘记处理某些输入”引起的错误(因为容易忘记处理的输入,往往是“边界”输入)。但是它对于发现算法错误无能为力,毕竟工具不可能了解代码所要实现的功能逻辑。

总结

这篇文章主要介绍了代码级测试中的常见代码错误类型,以及常用测试方法。

代码错误,可以划分为“有特征”的错误和“无特征”的错误两大类。其中,“有特征”的错误,又可以进一步细分为语法特征错误、边界行为特征错误和经验特征错误;而“无特征”的错误,主要包括算法错误和部分算法错误两类。

针对这五种代码错误,代码级测试的方法分成了静态方法和动态方法两大类。顾名思义,静态方法不需要执行实际代码,而动态方法需要通过执行具体的代码去发现代码错误。而每一类方法又可以根据执行方式,进一步细分。也因此,每种测试方法,所能覆盖的错误类型也不同,所以进行代码级测试时,你需要综合运用这些方法,并结合所在公司或者项目的编码规范一起使用。

这四类测试方法的特点,以及可以覆盖的错误类型,可以概括如下:

  • 人工静态方法,本质上通过开发人员代码走查、结对编程、同行评审来完成的,理论上可以发现所有的代码错误,但也因为其对“测试人员”的过渡依赖,局限性非常大;
  • 自动静态方法,主要的手段是代码静态扫描,可以发现语法特征错误、边界行为特征错误和经验特征错误这三类“有特征”的错误;
  • 人工动态方法,就是传统意义上的单元测试,是发现算法错误和部分算法错误的最佳方式;
  • 自动动态方法,其实就是自动化的边界测试,主要覆盖边界行为特征错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/617553.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js逆向第19例:猿人学第17题天杀的Http2.0

文章目录 一、前言二、定位关键参数三、代码实现四、参考文献一、前言 任务十七:抓取这5页的数字,计算加和并提交结果 题目已经给出来标准答案,而且此题设置为“非常简单”其关键就是HTTP/2.0请求,打开控制台查看请求接口数据如下: 二、定位关键参数 可以看到控制台显示…

Linux系统——DNS解析详解

目录 一、DNS域名解析 1.DNS的作用 2.域名的组成 2.1域名层级结构关系特点 2.2域名空间构成 2.3域名的四种不同类型 2.3.1延伸 2.3.2总结 3.DNS域名解析过程 3.1递归查询 3.2迭代查询 3.3一次DNS解析的过程 4.DNS系统类型 4.1缓存域名服务器 4.2主域名服务器 4…

MES系统如何进行产品的质量管理

质量管理重点是对产品的检验,这里面包括:采购来料检验、工序检验、入库前检验等几个检验环节,并根据系统设定的检验标准进行检验,检验不通过的不能留到下个环节。质量管理也是万界星空科技云MES中的一个重要组成部分,旨…

Java接入Apache Spark(入门环境搭建、常见问题)

Java接入Apache Spark(环境搭建、常见问题) 背景介绍 Apache Spark 是一个快速的,通用的集群计算系统。它对 Java,Scala,Python 和 R 提供了的高层 API,并有一个经优化的支持通用执行图计算的引擎。它还支…

vue3 源码解析(3)— computed 计算属性的实现

前言 本文是 vue3 源码分析系列的第三篇文章,主要介绍 vue3 computed 原理。computed 是 vue3 的一个特性,可以根据其他响应式数据创建响应式的计算属性。计算属性的值会根据依赖的数据变化而自动更新,而且具有缓存机制,提高了性…

Unity 工具 之 Azure 微软连续语音识别ASR的简单整理

Unity 工具 之 Azure 微软连续语音识别ASR的简单整理 目录 Unity 工具 之 Azure 微软连续语音识别ASR的简单整理 一、简单介绍 二、实现原理 三、注意实现 四、实现步骤 五、关键脚本 一、简单介绍 Unity 工具类,自己整理的一些游戏开发可能用到的模块&#x…

TIDB的忘了root用户密码和数据库密码解决办法

方法一: 1、修改配置文件重启tidb,无密码登录修改root密码 找到配置文件 tidb.toml ,在[security] 作用域下增加如下配置: [security] skip-grant-tabletrue 重启tidb: sh run_tidb.sh 2、重启后,就可以无密…

Vue:将以往的JQ页面,重构成Vue组件页面的大致思路梳理(组件化编码大致流程)

一、实现静态组件 组件要按照功能点拆分,命名不要与HTML元素冲突。 1、根据UI提供的原型图,进行结构拆分,拆分的粒度以是否方便给组件起名字为依据。并梳理好对应组件的层级依赖关系。 2、拆分好结构后,开始对应的写组件&#x…

怎么节约cdn流量- 速盾网络(Sudun)

节约CDN流量的有效方法:速盾网络(Sudun)的实用建议 在当今数字化时代,网站和应用程序依赖于CDN(内容分发网络)来加速内容传输,提高用户体验。然而,有效地管理CDN流量对于优化成本和…

vue3-响应式基础之reactive

reactive() 还有另一种声明响应式状态的方式&#xff0c;即使用 reactive() API。与将内部值包装在特殊对象中的 ref 不同&#xff0c;reactive() 将使对象本身具有响应性&#xff1a; 「点击按钮1」 <script lang"ts" setup> import { reactive } from vuec…

ATECLOUD-POWER测试系统如何检测电源稳定性?

电源模块做为一种电源供应器为电子设备提供供电&#xff0c;广泛应用于汽车电子、航空航天、医疗、通信等各个领域&#xff0c;因此检测电源模块的稳定性是非常重要的&#xff0c;确保其为电子设备提供稳定的电压和电流&#xff0c;保证电子设备可以正常稳定工作。 电源模块的稳…

四川古力未来科技有限公司:抖音小店的崛起之路

随着互联网的飞速发展&#xff0c;电子商务已经成为人们日常生活中不可或缺的一部分。作为一家以科技为核心的公司&#xff0c;四川古力未来科技有限公司在电子商务领域中崭露头角&#xff0c;特别是其抖音小店的发展引人注目。 四川古力未来科技有限公司的抖音小店自开业以来&…

【docker】Docker Stack 详细使用及注意事项

一、什么是 Docker Stack Docker Stack 是 Docker Swarm 环境中用于管理一组相关服务的工具。它使得在 Swarm 集群中部署、管理和扩展一组相互关联的服务变得简单。主要用于定义和编排容器化应用的多个服务。以下是 Docker Stack 的一些关键特点&#xff1a; 服务集合&#xf…

RT-Thread:STM32 PHY 调试,使用软件包 WIZNET 驱动 W5500

说明&#xff1a; 1. 本文记录使用 RT-Thread 软件包 WIZNET驱动 W5500 的调试笔记。 2. 采用 RT-Thread Studio 工程 STM32F407VET6 芯片&#xff0c;W5500 PHY芯片&#xff0c;两者之间使用SPI接口链接 。 注意&#xff1a; 1.在按流程建立工程&#xff0c;和移植完 wizn…

SQL语句详解三-DML(数据操作语言)

文章目录 DML添加数据删除数据修改数据 DML DML(数据操作语言)&#xff1a;增删改表中数据&#xff0c;针对的对象是数据库中表格的数据。 添加数据 语法 -- 方式一 insert into 表名(列名1 , 列名2 , ... , 列名n) values(值1 , 值2 , ... , 值n); -- 方式二 insert into 表…

LeetCode---121双周赛---数位dp

题目列表 2996. 大于等于顺序前缀和的最小缺失整数 2997. 使数组异或和等于 K 的最少操作次数 2998. 使 X 和 Y 相等的最少操作次数 2999. 统计强大整数的数目 一、大于等于顺序前缀和的最小缺失整数 简单的模拟题&#xff0c;只要按照题目的要求去写代码即可&#xff0c;…

2-Linux-应用-部署icwp-Linux虚拟机【Django+Vue+Nginx+uwsgi+Linux】

本文概述 本文章讲述基于Linux CentOS 7系统&#xff08;虚拟机&#xff09;&#xff0c;部署DjangoVue开发的前后端分离项目。 项目源码不开放&#xff0c;但是操作步骤可以借鉴。 该文章将项目部署在Linux虚拟机上&#xff0c;暂不使用Docker 相关指令尽量展示执行路径&am…

通义灵码 - 免费的阿里云 VS code Jetbrains AI 编码辅助工具

系列文章目录 前言 通义灵码&#xff0c;是阿里云出品的一款基于通义大模型的智能编码辅助工具&#xff0c;提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码注释生成、代码解释、研发智能问答、异常报错排查等能力&#xff0c;并针对阿里云 SDK/OpenAPI 的使用…

最强联网Chat GPT 火爆全网高速 永久免费

&#x1f534;高速联网 秒响应支持语音通话&#x1f388; 首先介绍一下她的功能吧&#x1f601; 女友消息代回机&#x1f44c;&#x1f3fb; 朋友圈文案&#x1f44c;&#x1f3fb; 聊天话术&#x1f44c;&#x1f3fb; 高情商回复&#x1f44c;&#x1f3fb; 脱单助…

redis缓存雪崩、穿透和击穿

缓存雪崩 对于系统 A&#xff0c;假设每天高峰期每秒 5000 个请求&#xff0c;本来缓存在高峰期可以扛住每秒 4000 个请求&#xff0c;但是缓存机器意外发生了全盘宕机或者大量缓存集中在某一个时间段失效。缓存挂了&#xff0c;此时 1 秒 5000 个请求全部落数据库&#xff0c;…