【软件测试】学习笔记-静态测试方法

这篇文章详细讨论人工静态测试方法和自动静态测试方法,来帮你理解研发流程上是如何保证代码质量的,以及如何搭建自己的自动静态代码扫描方案,并且应用到项目的日常开发工作中去。

人工静态方法本质上属于流程上的实践,实际能够发现问题的数量很大程度依赖于个人的能力,所以从技术上来讲这部分内容可以讨论的点并不多。但是,这种方法已经在目前的企业级测试项目中被广泛地应用了,所以我们还是需要理解这其中的流程,才能更好地参与到人工静态测试中。

而自动静态方法,可以通过自动化的手段,以很低的成本发现并报告各种潜在的代码质量问题,目前已经被很多企业和项目广泛采用,并且已经集成到CI/CD流水线了。作为测试工程师,我们需要完成代码静态扫描环境的搭建。

人工静态方法

通过我上一次的分析,我们知道了人工静态方法检查代码错误,主要有代码走查、结对编程,以及同行评审这三种手段。那么我们接下来就看一下这三种方法是如何执行的。

  • 代码走查(Code Review),是由开发人员检查自己的代码,尽可能多地发现各类潜在错误。但是,由于个人能力的差异,以及开发人员的“思维惯性”,很多错误并不能在这个阶段被及时发现。
  • 结对编程(Pair Programming),是一种敏捷软件开发的方法,一般是由两个开发人员结成对子在一台计算机上共同完成开发任务。其中,一个开发人员实现代码,通过被称为“驾驶员”;另一个开发人员审查输入的每一行代码,通常被称为“观察员”。- 当“观察员”对代码有任何疑问时,会立即要求“驾驶员”给出解释。解释过程中,“驾驶员”会意识到问题所在,进而修正代码设计和实现。- 实际执行过程中,这两个开发人员的角色会定期更换。
  • 同行评审(Peer Review),是指把代码递交到代码仓库,或者合并代码分支(Branch)到主干(Master)前,需要和你同技术级别或者更高技术级别的一个或多个同事对你的代码进行评审,只有通过所有评审后,你的代码才会被真正递交。- 如果你所在的项目使用GitHub管理代码,并采用GitFlow的分支管理策略,那么在递交代码或者分支合并时,需要先递交Pull Request(PR),只有这个PR经过了所有评审者的审核,才能被合并。这也是同行评审的具体实践。目前,只要你采用GitFlow的分支管理策略,基本都会采用这个方式。

对于以上三种方式,使用最普遍的是同行评审。因为同行评审既能较好地保证代码质量,又不需要过多的人工成本投入,而且递交的代码出现问题后责任明确,另外代码的可追溯性也很好。

结对编程的实际效果虽然不错,但是对人员的利用率比较低,通常被用于一些非常关键和底层算法的代码实现。

自动静态方法

自动静态方法,主要有以下三个特点:

  • 相比于编译器,可以做到对代码更加严格、个性化的检查;
  • 不真正检测代码的逻辑功能,只是站在代码本身的视角,基于规则,尽可能多地去发现代码错误;
  • 由于静态分析算法并不实际执行代码,完全是基于代码的词法分析、语法分析、控制流分析等技术,由于分析技术的局限性以及代码写法的多样性,所以会存在一定的误报率。

基于这些特点,自动静态方法通常能够以极低的成本发现以下问题:

  • 使用未初始化的变量;
  • 变量在使用前未定义;
  • 变量声明了但未使用;
  • 变量类型不匹配;
  • 部分的内存泄漏问题;
  • 空指针引用;
  • 缓冲区溢出;
  • 数组越界;
  • 不可达的僵尸代码;
  • 过高的代码复杂度;
  • 死循环;
  • 大量的重复代码块;

正是由于自动静态方法具有自动化程度高,检查发现问题的成本低以及能够发现的代码问题广等特点,所以该方法被很多企业和项目广泛应用于前期代码质量控制和代码质量度量。

在实际工程实践中,企业往往会结合自己的编码规范定制规程库,并与本地IDE开发环境和持续集成的流水线进行高度整合。

代码本地开发阶段,IDE环境就可以自动对代码实现自动静态检查;当代码递交到代码仓库后,CI/CD流水线也会自动触发代码静态检查,如果检测到潜在错误,就会自动邮件通知代码递交者。

接下来,我们一起来看两个自动静态方法发现错误的实际案例,希望可以加深你对自动静态方法的认识。

自动静态方法的实际例子

第一个例子,自动静态方法检查语法特征错误。

如图1左侧所示的C语言代码,存在数组越界的问题,一种典型的语法特征错误。

图1右侧,就是通过C语言的自动静态扫描工具splint发现的这个问题,并给出的分析结果。

图1 数组越界的错误

第二个例子,自动静态方法检查内存空间被释放后继续被赋值的错误。

如图2左侧所示的C语言代码,我们用malloc函数申请了一个内存空间,并用指针a指向了这个空间,然后新建了一个指针b也指向这个空间,也就是指针a和指针b实际上指向了同一个内存空间。之后,我们把指针a指向的空间释放掉了,意味着指针b指向的空间也被释放了。但是,此时代码却试图去对指针b指向的空间赋值,显然这会导致不可预料的后果。

幸运的是,C语言的自动静态扫描工具splint发现了这个问题,并给出了详细解释。

图2 内存空间释放后还继续使用的错误

实际案例:Sonar实战

现在,我们已经了解了自动静态代码扫描的基本概念,那怎么把这些知识落地到你的实际项目中呢?我们就从目前主流的自动静态工具Sonar的使用开始吧。

考虑到你可能以前并没有接触过Sonar,所以我会按照step by step的节奏展开。如果你已经用过Sonar了,你可以跳过在Mac 电脑上建立Sonar的步骤,从完成你的Maven项目的自动静态分析开始。

通过这个Sonar实例,你可以掌握:

  • 搭建自己的SonarQube服务器;
  • 扫描Maven项目,并将结果报告递交到SonarQube服务器;
  • 在IntelliJ IDE中集成SonarLint插件,在IDE中实现实时的自动静态分析;

首先,在Sonar官网下载LTS(Long-term Support)版本的SonarQube 6.7.5。这里需要注意的是,我不推荐在实际工程项目中使用最新版的SonarQube,而是建议使用LTS版本以保证稳定性和兼容性。

解压后运行其中的bin/macosx-universal-64目录下的sonar.sh,这里需要注意运行sonar.sh时要带上“console”参数。如果执行完成的界面如下图3所示,那么说明你的SonarQube服务已经成功启动。

图3 SonarQube启动成功的界面

此时,你可以尝试访问localhost:9000,并用默认账号(用户名和密码都是“admin”)登录。

为了简化建立SonarQube的步骤,所有的内容我都使用了默认值。比如,我直接使用了SonarQube内建的数据库,端口也采用了默认的9000。但是,在实际工程项目中,为了Sonar数据的长期可维护和升级,我们通常会使用自己的数据库,需要执行下面这些步骤:

  1. 安装SonarQube之前,先安装数据库;
  2. 建立一个空数据库并赋予CRUD权限;
  3. 修改SonarQube的conf/sonar.properties中的JDBC配置,使其指向我们新建的数据库。我们也可以采用同样的方法,来修改默认的端口。

因为要在Maven项目中执行代码静态扫描,为此我们需要先找到$MAVEN_HOME/conf下的settings.xml文件,在文件中加入Sonar相关的全局配置,具体需要加入的内容如下所示:

<settings>
    <pluginGroups>
        <pluginGroup>org.sonarsource.scanner.maven</pluginGroup>
    </pluginGroups>
    <profiles>
        <profile>
            <id>sonar</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <sonar.host.url>
                  http://myserver:9000
                </sonar.host.url>
            </properties>
        </profile>
     </profiles>
</settings>

最后,我们就可以在Maven项目中,执行“mvn clean verify sonar:sonar”命令完成静态代码扫描。

如果你是第一次使用这个命令,那么mvn会自动下载依赖maven-sonar-plugin,完成后发起代码的静态扫描,并会自动把扫描结果显示到SonarQube中。

图4 SonarQube的静态扫描结果页面

扫描结果是Passd,但同时也发现了三个Code Smell问题,或者说是改进建议,如图5所示。

  1. Class建议放在package中;
  2. 导入了java.io.BufferedInputStream,但没有在实际代码中使用,建议删除;
  3. 建议变量名字不要包含下划线。

图5 详细扫描结果示例

至此,你已经使用Sonar完成了一次代码的静态扫描,是不是还挺方便的?

但是,在日常工作中你可能还想要实时看到Sonar分析的结果,这样可以大幅提高修改代码的效率。为此,我们可以在IDE中引入SonarLint插件。你可以通过IDE的plugin(插件)管理界面安装SonarLint。

安装完成后重启IDE,你就可以在IDE环境中实时看到Sonar的静态分析结果了,如图6所示。

图6 在IDE中直接查看静态扫描结果

另外,在IDE中绑定SonarQube,就可以把SonarLint和SonarQube集成在一起了,如图7所示。集成完成后,IDE本地的代码扫描就能使用SonarQube端的静态代码规则库了,在企业级的项目中,一般要求所有开发人员都使用统一的静态代码规则库,所以一般都会要求本地IDE的SonarLint与SonarQube集成。

图7 IDE中的SonarLint和SonarQube绑定

目前,自动静态扫描通常都会和持续集成的流水线做绑定,最常见的应用场景是当你递交代码后,持续集成流水线就会自动触发自动静态扫描,这一功能是通过Jenkins以及Jenkins上的SonarQube插件来完成的,当你在Jenkins中安装了SonarQube Plugin,并且将SonarQube服务器相关的配置信息加入Plugin之后,你就可以在Jenkins Job的配置中增加Sonar静态扫描步骤了。

总结

人工静态方法,主要有代码走查、结对编程和同行评审三种常用方法。在工程实践中,同行评审因为可以保证代码质量、效率高、责任明确等特点,已经被广泛采用。

自动静态方法,因为自动化程度高、成本低、发现的代码问题广等特点,是常用的代码级测试方法。

在这里,测试工程师需要完成代码静态扫描环境的搭建,考虑到你以前可能没有接触过Sonar,我按照step by step的思路,带你一起搭建了一套代码静态扫描环境,并分享了一个Maven项目代码静态扫描的实例。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

详解Java多线程之循环栅栏技术CyclicBarrier

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;工作中&#xff0c;咱们经常会遇到需要多个线程协同工作的情况。CyclicBarrier&#xff0c;直译过来就是“循环屏障”。它是Java中用于管理一组线程&#xff0c;并让它们在某个点上同步的工具。简单来说&#xf…

[AutoSar]BSW_OS 01 Autosar OS入门(一)

目录 关键词平台说明一、Autosar OS 的位置二、Autosar OS 与OSEK三、TASK 关键词 嵌入式、C语言、autosar、OS、BSW 平台说明 项目ValueOSautosar OSautosar厂商vector芯片厂商TI编程语言C&#xff0c;C编译器HighTec (GCC) 一、Autosar OS 的位置 如在[AutoSar]基础部分 a…

imgaug库指南(19):从入门到精通的【图像增强】之旅

引言 在深度学习和计算机视觉的世界里&#xff0c;数据是模型训练的基石&#xff0c;其质量与数量直接影响着模型的性能。然而&#xff0c;获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此&#xff0c;数据增强技术应运而生&#xff0c;成为了解决这一问题的…

教程-右键用vscode(新窗口)打开文件或目录

通过本文可以提高效率&#xff0c;用起来更爽更高效。 本文实现了&#xff08;windows系统&#xff09;&#xff1a; 右键-用vscode(当前窗口)打开文件或目录右键-用vscode-新窗口打开文件或目录 注意&#xff1a; 下面的安装路径要更改为您实际的路径 具体配置步骤&#x…

案例117:基于微信小程序的新闻资讯系统设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder …

使用ArduinoMqttClient库连接阿里云,并实现发送接收数据(ESP8266)

文章目录 引言一、MQTT理论部分二、使用MQTT.fx接入物联网设备三、使用ESP8266连接阿里云四、参考例程 引言 阿里云物联网平台的接入方式有很多种&#xff0c;从阿里云提供的开发文档可以看到&#xff0c;支持的接入协议有MQTT、HTTPS、CoAP、JT/808、GB/32960协议等等&#x…

算法学习系列(十九):DFS、BFS

目录 引言一、DFS1.排列数字2.n-皇后问题 二、BFS1.走迷宫2.八数码问题 引言 关于这个DFS与BFS的问题非常的常见&#xff0c;其实这两个就是搜索的方式不一样而已&#xff0c;核心思想非常容易懂&#xff0c;题目的话也是做一道记一道&#xff0c;还是要针对题来看&#xff0c…

Asp .Net Core 系列: 集成 CORS跨域配置

文章目录 什么是CORS?Asp .Net Core 中如何配置CORS?CorsPolicyBuilder类详解注册以及使用策略三种方式EnableCors 和 DisableCors 特性关于带证书与不带证书代码的实现跨源&#xff08;cross-origin&#xff09;不带请求证书(Credentials)跨源&#xff08;cross-origin&…

InternLM第3次课作业

部署 参考github教程&#xff1a;https://github.com/InternLM/tutorial/tree/main/langchain 问题1&#xff1a; windows端口映射过程命令 ssh -i C:\\Users\\breat/.ssh/id_rsa.pub -CNg -L 7860:127.0.0.1:7860 rootssh.intern-ai.org.cn -p 3 4145 中&#xff0c;提示找不…

哈希-力扣350. 两个数组的交集Ⅱ

题目 给你两个整数数组 nums1 和 nums2 &#xff0c;请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数&#xff0c;应与元素在两个数组中都出现的次数一致&#xff08;如果出现次数不一致&#xff0c;则考虑取较小值&#xff09;。可以不考虑输出结果的顺序。 示…

详细分析Java中的@JsonSerialize注解

目录 前言1. 核心知识2. 基本知识3. Demo3.1 jsontest13.2 jsontest2 4. 总结 前言 对应序列化的相关知识可看我之前的文章&#xff1a;详解Java中的serialVersionUID概念以及作用&#xff08;附上Demo&#xff09; 通过理解核心知识&#xff0c;再去品味总结的基本知识&#…

聚对苯二甲酸乙二醇酯PET的特性有哪些?UV胶水能够粘接聚对苯二甲酸乙二醇酯PET吗?又有哪些优势呢?

聚对苯二甲酸乙二醇酯&#xff08;Polyethylene Terephthalate&#xff0c;PET&#xff09;是一种常见的塑料材料&#xff0c;具有许多特性&#xff0c;包括&#xff1a; 1.化学式&#xff1a; PET的化学式为 (C10H8O4)n&#xff0c;其中n表示重复单元的数量。 2.透明度&#…

Redis-redis事务、乐观锁、Jedis、SpringBoot整合Redis

五、事务 1、事务 ①开启事务、执行事务 127.0.0.1:6379> multi # 开启事务 OK # 入队 127.0.0.1:6379> set k1 v1 QUEUED 127.0.0.1:6379> set k2 v2 QUEUED 127.0.0.1:6379> get k2 QUEUED 127.0.0.1:6379> set k3 v3 QUEUED 127.0.0.1:6379> …

PyCharm连接服务器(利用PyCharm实现远程开发)

利用PyCharm实现远程开发 注&#xff1a;该功能只有在PyCharm专业版下才可以使用&#xff0c;并且必须是官方的正版许可&#xff0c;破解版的是不可以使用的&#xff01;&#xff01;&#xff01;可以通过免费教育许可申请使用权限&#xff08;申请流程&#xff09;。 pycharm…

【漏洞复现】Office365-Indexs-任意文件读取

漏洞描述 Office 365 Indexs接口存在一个任意文件读取漏洞,攻击者可以通过构造精心设计的请求,成功利用漏洞读取服务器上的任意文件,包括敏感系统文件和应用程序配置文件等。通过利用此漏洞,攻击者可能获得系统内的敏感信息,导致潜在的信息泄露风险 免责声明 技术文章…

easyexcel上传校验的方法封装

easyexcel版本3.1.5 使用自定义注解的方式来定义校验的类型&#xff0c;避免冗余代码。 //校验value不能为空&#xff0c;且长度最大为30 RowCheck(value {RowCheckType.EMPTY,RowCheckType.LENGTH},max 30) private String value; 具体代码&#xff1a; 首先定义校验类型…

【深度学习目标检测】十四、基于深度学习的血细胞计数系统-含GUI(BCD数据集,yolov8)

血细胞计数是医学上一种重要的检测手段&#xff0c;用于评估患者的健康状况&#xff0c;诊断疾病&#xff0c;以及监测治疗效果。而目标检测是一种计算机视觉技术&#xff0c;用于在图像中识别和定位特定的目标。在血细胞计数中&#xff0c;目标检测技术可以发挥重要作用。 首先…

python统计分析——小提琴图(sns.violinplot)

参考资料&#xff1a;用python动手学统计学&#xff0c;帮助文档 使用seaborn.violinplot()函数绘制箱线图 sns.violinplot()的做出来的小提琴图比plt.violinplot()更像小提琴。 import numpy as np import pandas as pd from matplotlib import pyplot as plt import seabo…

智能小程序能做什么?

一. 自定义Tab页 涂鸦提供了丰富的场景化、个性化的 ToC 智能服务&#xff0c;不仅可以快速低成本的自由搭建出更多智能服务&#xff0c;还为你提供了基于小程序技术方案的可自主可控的自定义开发链路&#xff0c;为拓展更多品牌化、个性化、差异化智能服务提供生态基础。 我…

【Matlab】在Matlab中安装优化工具yalmip的方法

最近博主想做一些关于多目标优化的问题&#xff0c;因为之前对Matlab有一定经验&#xff0c;所以直接在网上查找了如何在Matlab上实现多目标优化的文献&#xff0c;看到有人提到了yamip&#xff0c;于是博主就试着在Matlab中安装yamip&#xff0c;将其中遇到的问题和一些经验和…