浅论静态测试的价值

2023-10-31

    曾经看过一篇介绍某静态测试工具的文章,说该工具可以发现所有的代码错误,我觉得很好奇,问:如果我写了一个加法函数,把加号写成减号,如int add(int a, int b){return a-b;};,可以找出来吗?答:这是代码功能错误,当然不能找出来。愣了半天,没想明白:难道代码的功能错误不是代码错误?怪偶语文没学好,理解不了这种高深的文字游戏。

静态测试方法到底可以发现哪些错误?极限是什么?这要从数据和代码的自然属性和业务属性说起。

数据具有自然属性,如一个无符号32位整数,具有最大、最小值,正负数交界处如01-1比较特殊,不能被零除等。这些自然属性,无论在什么代码中都是一样的。程序中的数据通常还具有业务属性,如一个无符号32位整数,在这个代码中可能表示一个人的年龄,有效值为0-200,在另一个代码中可能表示星期几,有效值为0-6。程序要对业务属性做出合适处理,如年龄小于1的为婴儿,要特殊照顾;或者星期一至五要工作,周末要休息。数据的自然属性很少,基本类型就那么几种,高级类型都是基本数型的组合。数据的业务属性则是千变万化无穷无尽的。数据的自然属性是死的,在什么代码中都一样;数据的业务属性是活的,要根据需求来确定。

代码也具有自然属性,如要符合语法规范、数组不能越界、条件语句中含有“=”则可能是“==”的误写等等。代码更具有业务属性,也就是要实现需要的业务功能,否则写得像花一样也没有意义。相对于业务属性,代码的自然属性也是很少的,并且同一语言的代码属性是基本不变的,不管代码用来做什么,自然属性都差不多。代码的业务属性则是千变万化无穷无尽的,并且要符合设计需求。

代码的错误有可能来自自然属性,也可能来自业务属性。由于数据和代码的自然属性是简单且有限的,而业务属性则是复杂且无穷的,因此,来自业务属性错误远远高于来自自然属性的错误。

静态测试方法通过分析代码来发现错误,所依据的只能是数据和代码的自然属性,对业务属性则一无所知。这就是这类方法的极限,也就是说,静态测试方法做到极致,也只能发现一小部分错误。另外,静态分析只能基于现有代码,也不能发现代码缺失造成的错误。我看过一些静态测试的示例,基本上都是使用排序算法之类的小程序,这是一个巧妙的选择,因为这类程序中,数据只有自然属性,例如大小之分,没有业务属性。可惜的是,除非你正在编写通用底层库,否则多数代码和数据都是具有业务属性的。

要发现多数错误必须用动态测试方法,并且测试数据要人工设计,因为,只有人才能理解代码的功能,才能既了解代码和数据的自然属性,也了解业务属性。

静态方法和动态方法所发现的错误并不是互补关系,而是包含关系。人工设计用例时,既会考虑数据和代码的自然属性,也会考虑其业务属性,因此,动态方法既能发现来自自然属性的错误,也能发现来自业务属性的错误。实际上,自然属性引起的错误也会以功能错误的方式表现出来,例如,除零错误、数据越界会引起崩溃,当然也是功能错误;if(a==0)写成if(a=0)也不能实现正确功能,并且会造成else分支不可覆盖。

静态方法通常是自动的,但只是扫描过程自动,其输出通常存在大量的漏报和误报。漏报我们不说它,如果能直接报告一两个明确的错误,那也不错,毕竟是自动的,但误报则是大问题,大量的误报导致需要大量的后续人工分析,并可能掩盖真实的错误,从这一点来说,并不自动。

最方便高效的静态分析工具是编译器。百度说谁最懂中文?当然是中国人最懂中文。那么谁最懂代码?编译器最懂代码。编译警告就是很好的静态分析信息,例如,VC6的编译警告有四级,默认为三级,如果设为四级,你会发现这个十多年前的老工具,其报告潜在错误的能力不逊于一些现代的专门静态测试工具。

静态测试方法当然有它的价值,但并没有那么神奇。如果你要评估静态测试的效果,那么要考虑其他条件,例如做不做动态测试、编译器的报错功能是否已发挥?如果不做动态测试,那么静态分析并不能发现大多数错误,如果要做,静态测试则基本没有意义。我说的也许是错的,最好自己评估一下:如果是在要做动态测试的前提下评估,那么要先做动态测试,再评估静态测试;如果是在不做动态测试的前提下评估,那么,把编译器的警告级别提至最高,先解决警告问题,再评估静态测试,只有这样,才能真正判断测试测试的价值。

 

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

浅论静态测试的价值 的相关文章

随机推荐

  • mysql分表后的联合查询_MySQL分库分表分表后数据的查询(5th)

    前言 在分表完之后显然对于数据的查询会变的比较的复杂 特别是在表的关联方面 在有些情况下根本就不能使用JOIN 其实个人是比较鼓励将那些大的JOIN SQL拆分成几个小的SQL来查询数据 这样虽然总体的效率可能会稍稍下降 如果使用了连接池完
  • 干货教你在PostgreSql中使用JSON字段

    通过本文可掌握在pg数据库中如何正确使用json字段 如何进行数据查询 在where子查询中如何使用 以及对json值进行聚合查询使用 概述 JSON 代表 JavaScript Object Notation JSON是开放的标准格式 由
  • SCAU OJ综合性实验

    在当前目录中存在文件名为 case1 in 其中case后为数字1 不是字母l 写错提交后会判错 的文本文件 其内容为一篇英文文章 以EOF作为结束标志 现要求读取该文本文件内容 统计文章中每个单词出现的次数 并输出出现次数最多的前5个单词
  • 理解 以太坊Serenity - 第一部分: 深度抽象

    Origin post by Vitalik Buterin on December 24th 2015 我们已经公开继续改进以太坊协议的计划和长期开发路线图相当长一段时间了 这个做法也是来自于从1 0版本发布之前或者事后没有能及时处理的错
  • 迅捷fw325r虚拟服务器设置,Fast迅捷FW325R无线路由器设置

    新购买的Fast迅捷FW325R无线路由器要怎么设置呢 其实关于迅捷FW325R无线路由器的设置方法跟其它以falogin cn为默认登录地址的迅捷无线路由器是一样的 首先我们要做的就是正确的安装迅捷FW325R无线路由器 其次 查看电脑的
  • SpringBoot+MybatisPlus+Druid 配置多数据源

    项目上要用到多数据源 发现MybatisPlus从配置到切换数据源有一套快捷的实现 便选用了MybatisPlus的多数据源配置 本文的 dynamic datasource spring boot starter 与 mybatis pl
  • 如何理解和编程实现证据理论的Dempster组合规则?

    由于CSDN编公式太麻烦 我就先在文档里写好 然后转成图片了 OK 接下来我们来一段代码 把上述过程实现了 clear all Matlab code for Dempster s combinatonal rule in belief f
  • zynq ALSA

    设计参考的代码PS和PL端的下载链接如下 linuxkernel版本号4 4 基于Zedboard 的ADAU1761功放芯片 ADI公司kernel和hdlgit链接地址 Took Linux device tree is include
  • 镁光闪存颗粒对照表_内存颗粒型号识别

    容量 MB Samsung 三星 ETRON 钰创 Zentel 力积 Hynix 海力士 Elpida 尔必达 2MB N A EM636165TS 6G N A N A 8MB K4S641632N EM638165TS 6G A3V6
  • 面向对象以及特点

    历史 汇编语言 C语言 对象过程化 C Java javaScript Python PHP 面向对象编程思想 三大特征 1 抽象 封装 抽象是指强调实体的本质 内在的属性 在系统开发中 抽象指的是在决定如何实现对象之前的对象的意义和行为
  • 32通过tcp发送数组_西门子S71500与S7300PN的TCP通信(图文)

    加微信号 15021230050 邀请您加入 信控电气 微信群 点击文章最下方 阅读原文 加入超级工控技术群 免费学习PLC编程技术 包吃住还有工资 西门子S7 1500与S7 300PN的TCP通信 1 概述 2 自动化解决方案 2 1网
  • 摆动排序leetcode324

    给你一个整数数组 nums 将它重新排列成 nums 0 lt nums 1 gt nums 2 lt nums 3 的顺序 你可以假设所有输入数组都可以得到满足题目要求的结果 示例 1 输入 nums 1 5 1 1 6 4 输出 1 6
  • 【单片机】STM32F030硬件SPI的坑

    使用的是STM32F030F4P6 这是一个小封装的单片机 但是五脏俱全 很多功能 就是引脚不多 使用到SPI的时候感觉应该和以前用过的STM32F103系列是一样的 寄存器的结构几乎是完全一样的 寄存器操作的程序甚至都能兼容 但是在使用的
  • Flutter1.0实践要点(Dart语法回顾)

    Flutter1 0实践要点 Flutter 文档 Flutter widgets文档 实践要点 dart文件命名使用小写加下滑线 dart类命名使用驼峰 Dart语法 绝对定位widget Stack Positioned url包裹wi
  • A Survey of Learning on Small Data(二)

    本文是 A Survey of Learning on Small Data 的翻译 原文链接 小数据学习综述 4 几何角度 4 1 Frechet均值 4 2 欧几里得均值 4 3 非欧均值 4 3 1 Poincare质心 4 3 2
  • 面试常问:Hive分区与分桶的区别

    分区表与分桶表的区别 创建表时可以同时为表创建一个或者多个分区 我们在加载数据时为期指定具体的 分区 查询数据时可以指定具体的分区从而提高效率 分区表是把分区当成目录的 分区实际上是将表文件分成多个有标记的小文件以方便查询 分区表 在Hiv
  • Ubuntu下安装AndroidStudio

    前言 接触Ubuntu系统有一段时间了 对Ubuntu下软件的操作有了一定的了解 本文结合所学的知识 在Ubuntu系统下安装android开发工具 Android Studio 步骤 第一步 安装JDK 打开终端 使用快捷键 CTR AL
  • Result of ‘Stream.peek()‘ is ignored

    firstPublish getFunds stream filter firstFund gt adviceCodeSet contains firstFund getCode peek firstFund gt firstFund se
  • 不要再焦虑了:BATJ大厂给程序员们价值百万的职业规划(18-35岁,35岁以后)

    顺坡下山 另辟蹊径 虽然你感觉互联网程序员好像已经人满为患了 但中国很多其他行业还根本招不到什么像样的程序员的 只是现在制造业国企程序员待遇太低 一般也就万把块 比制造业其他工种稍微高一点 但比互联网低很多 只要肯降薪去这些国企央企 也算一
  • 浅论静态测试的价值

    曾经看过一篇介绍某静态测试工具的文章 说该工具可以发现所有的代码错误 我觉得很好奇 问 如果我写了一个加法函数 把加号写成减号 如int add int a int b return a b 可以找出来吗 答 这是代码功能错误 当然不能找出