coverity代码检测工具介绍_微服务测试之静态代码扫描

静态代码扫描为整个发展组织增加价值。无论您在开发组织中发挥的作用如何,静态代码扫描解决方案都具有附加价值,拥有软件开发中所需要的尖端功能,最大限度地提高质量并管理软件产品中的风险。

背景

微服务架构模式具有服务间独立,可独立开发部署等特点,独立开发诱发了技术上的分离,HTTP通信增加了问题诊断的复杂度,对系统的功能、性能和安全方面的质量保障带来了很大的挑战。

“微服务架构对测试的挑战

微服务架构模式下多个独立业务服务同时开展开发工作,每个系统都有各自的业务范围和开发周期要求,这样一来,下图所示的传统流程中产品经理提供需求,需求人员进行需求分析、开发人员进行开发,最后交给测试人员进行测试的方法,就无法满足测试覆盖和测试效率的要求。

480a04a2ebb36b72378a949a29475889.png

相对于传统的单体模式而言,微服务模式下对测试带来的挑战总结起来包括以下内容:

  • 1. 微服务系统模块层次化,需要保证模块内部代码的质量。这种场景下传统的端到端的测试无法满足测试要求;
  • 2. 需要保证各个微服务系统内部模块间的正确性。系统模块间以及前端和后端通常会同时开展开发工作,模块间或者前后端通过接口(通常是Restful http接口)进行连接,而模块和后端往往没有界面,为了保证各个系统单个依赖系统的正确性,因此需要借助Mock技术隔离依赖的前提下进行接口级的测试;
  • 3. 需要保证微服务系统中的接口一致性,即契约的一致性。需要通过契约测试手段保证契约的正确性,进而保证同步开发过程中的前后开发的正确性和一致性;
  • 4. 需要保障单个微服务系统的正确性。需要进行组件级的测试进行微服务系统的正确性;
  • 5. 需要保障整个系统的正确性。各个微服务系统串接之后通过端到端的测试保证整体系统的正确性;

8385e4e8b1d1b38ffdf020c114ab1c09.png

“微服务架构下如何开展测试

针对上面提到的微服务对测试的挑战,一方面为了保证在服务各个层级上对微服务进行全面的测试,特别是对于分布式系统;另一方面又要确保测试执行的效率,这样才能保证持续集成/持续交付(CI/CD)。因此,总体的测试策略采用如下解决方法:

  • 1. 开展「质量」文化。让开发人员建立起代码「质量」意识,用于保障模块内部的质量;
  • 2. 采用自动化测试手段。在微服务架构中,开发分解为负责不同服务的多个小组,测试人员往往每天要花费大量的时间,了解不同团队的开发进度。如果还需要手动进行回归测试(Regression Test),最终将会不堪重负。所以自动化测试在微服务模式下是必须采取的手段。
  • 3. 分层的自动化测试策略。自动化测试分层在Mike Cohn 提出的测试金字塔(Test Pyramid)原理中进行了详细的阐述。它提倡在代码级、接口级、应用级进行不同粒度的测试来保证系统的质量。从自动化测试投入比例来看,单元测试和静态代码扫描的投入比例最大,其次是接口自动化测试,最后是UI自动化测试。同时为了提高测试效率和测试覆盖率,功能测试需要借助探索式测试手段开展测试。

f971934167aa86fb4e7c365ff9e3a901.png
  • 4. 采用流水线技术进行可视化快速反馈。由于微服务系统非常多,这样往往会增加了运维和沟通成本,为了提高沟通效率,需要借助流水线的技术,可视化查看每一个构建(Build)、测试(Test)、部署(Deploy)过程,快速做出质量反馈和处理决策。通过可视化流水线最终可以实现各个环节的监控,采用DevOps手段打通业务、开发、测试和运维的部门墙。

43963beca61dbeb4a7bba98dc33075c0.png

下面结合分层自动化测试的思想,首先对静态代码扫描进行介绍。

静态代码扫描

“静态代码扫描背景

静态代码分析是指在不运行代码的方式下,通过词法分析、语法分析、控制流、数据流分析等技术对程序代码进行扫描的技术。它的目的是验证代码是否满足规范性、安全性、可靠性、可维护性的要求。静态代码扫描处于分层自动化测试的最底层,它和单元测试同级别。为了保证公司代码的规范性、安全性、可靠性的要求,通过定制公司级的静态代码扫描规范、扫描规则和扫描实施流程保证实施高效落地。

“静态代码扫描意义

为开发者

软件开发人员最终负责代码质量。代码质量是非功能性需求的一部分,因此是开发人员的直接责任。代码质量不应该存在技术债务,在开发的过程中每一步都提供反馈,从IDE到发布。这使得开发人员能够尽早做出有关代码质量的决策,使他们能够做得更好,并提供质量更好的软件产品。

为DevOps

DevOps需要确保软件的构建方式正确。DevOps中涉及的责任很多,其中包括支持开发流程,自动化测试,确保质量,提高生产力.....并最终实现持续部署。良好的代码质量是实现所有这些目标的必要条件,尽管不是充分条件。静态代码扫描可在任何构建/测试/部署步骤中添加的代码质量检验门槛,能够自动执行一组统一的质量标准,从而确保组织交付更好的软件。

为管理者

代码静态扫描可降低风险并提高团队生产力。管理人员需要能够安全地运行软件,并且需要花费合理的投资回报。我们的解决方案一目了然地显示了他们面临的技术债务以及他们缓解的成本。它还具有开箱即用的功能,可以系统地提高开发团队的可维护性和长期生产力。这使管理人员能够以最佳成本使用风险控制方法确保其组织能够交付更好的软件。

“静态代码扫描介绍

静态代码扫描处在特性分支开发完成之后,具体的描述如下:

  • 1. 开发人员从Master分支拉取特性分支作为开发分支;
  • 2. 开发完特性分支后、代码构建、单元测试、静态代码扫描;
  • 3. 通过后合并到Master分支,用于投产;

62e27d0de5089ffc6b42ea64c221fb41.png

“静态代码扫描流程

随行付静态代码扫描平台的具体实现是通过集成SonarQube平台工具、Jenkins集成工具、IDE SonarLint插件和CheckStyle本地化规则模板等开源工具、插件集而成。实现本地化代码的实施检测,版本构建后的二次检测,以及邮件反馈等功能的流程闭环,保证投产前代码符合随行付代码规范的要求。具体的流程如下图所示:

85fb295e746bda91bd2488996995402b.png
  • 1.本地化IDE中通过SonarLint插件实现和SonarQube平台规则、规范的同步、实现本地代码检查;随行付定制化了java规则、XML规则257条,javascript规则86条,用于检测代码的规范性、代码缺陷、漏洞、坏味道、重复率等信息。并将定制化的规则放到了SonarQube平台上,SonrLint插件的规则比较全面,包括所有的sonajava规则和javascript规则,为了保证本地使用定制的规则,且同sonarqube中的规则一致,需要远程连接SonarQube服务器,并绑定项目。以Eclipse为例,展示SonarQube连接和项目绑定过程:

15ff8dff7a8d33125267844cc5af3ab5.png

37a586e37f824a21a605325b6028a85e.png
  • 2.代码提交到代码库GitLab中后,在Jenkins中测试环境构建时,自动触发Sonar扫描,并将扫描结果发布到SonarQube平台。下图为SonarQube展示的一个项目的结果:

6f7f7cd08187e0978a09c17e3c3448db.png
  • 3.SonarQube平台根据质量阀的要求,不满足质量阀要求则邮件通知开发人员。
质量阀要求:1.新覆盖率大于等于80%;2.新增Bugs为0;3.新增漏洞为0;4.新增坏味道为0;

e4cda50b1023c3df55a8715b0609db89.png
  • 4.开发人员收到邮件后,进行代码处理,直到满足规范要求为止。
  • 5.以周为单位统计SonarQube平台中静态代码扫描出来的Bugs漏洞坏味道的数量,定时自动发送周报给相关干系人,报告中会包含问题处理情况的趋势图。

5b1aecbc9e3e6f0d7d86699bde49dfab.png

SonarQube与规则

SonarQube是一个用于代码质量管理的开源平台,支持25+种编程语言的质量扫描。SonqrQube由远程机、Server端和数据库构成。远程客户机可以通过各种不同的分析机制,从而将被分析的项目代码上传到SonarQube server 并进行代码质量的管理和分析,SonarQube 还会通过Web API将分析的结果以可视化、可度量的方式展示给出来。逻辑结构如下图所示:

2bcb65a883bc404747e1fc18992ca22a.png

“SonarQube的整合能力

SonarQube平台中支持整合各种静态代码扫描检测工具。SonarQube中各种代码检测工具分析对象及应用技术对比:

Java静态分析工具分析对象应用技术CheckStyleJava源文件缺陷模式匹配FindBugs字节码缺陷模式匹配;数据流分析PMDJava源代码缺陷模式匹配

CheckStyle

可以很方便的帮我们检查Java代码中的格式错误,它能够自动化代码规范检查过程,从而使得开发人员从这项重要,但是枯燥的任务中解脱出来。基本上都是根据开发规则定制规则。主要涵盖以下内容:

  • Javadoc 注释:检查类及方法的 Javadoc 注释
  • 命名约定:检查命名是否符合命名规范
  • 标题:检查文件是否以某些行开头
  • Import 语句:检查 Import 语句是否符合定义规范
  • 代码块大小,即检查类、方法等代码块的行数
  • 空白:检查空白符,如 tab,回车符等
  • 修饰符:修饰符号的检查,如修饰符的定义顺序
  • 块:检查是否有空块或无效块
  • 代码问题:检查重复代码,条件判断,魔数等问题
  • 类设计:检查类的定义是否符合规范,如构造函数的定义等问题

FindBugs

Findbugs是一个静态分析工具,它检查类或者JAR文件,将字节码与一组缺陷模式进行对比以发现可能的问题。主要涵盖以下内容:

  • Bad practice 坏的实践:常见代码错误,用于静态代码检查时进行缺陷模式匹配
  • Correctness 可能导致错误的代码,如空指针引用等
  • 国际化相关问题:如错误的字符串转换
  • 可能受到的恶意攻击,如访问权限修饰符的定义等
  • 多线程的正确性:如多线程编程时常见的同步,线程调度问题
  • 运行时性能问题:如由变量定义,方法调用导致的代码低效问题

PMD

一种开源分析Java代码错误的工具,其原理为使用JavaCC生成解析器来解析源代码并生成AST(抽象语法树)。与其他分析工具不同的是,PMD通过静态分析获知代码错误。也就是说,在不运行Java程序的情况下报告错误。PMD附带了许多可以直接使用的规则,利用这些规则可以找出Java源程序的许多问题,例如:

  • 潜在的 Bugs:检查潜在代码错误,如空的 try/catch/finally/switch 语句
  • 未使用代码(Dead code):检查未使用的变量,参数,方法等
  • 可选的代码:String/StringBuffer的滥用
  • 复杂的表达式:检查不必要的 if 语句,可被 while 替代的 for 循环
  • 重复的代码:检查重复的代码
  • 循环体创建新对象:检查在循环体内实例化新对象
  • 资源关闭:检查 Connect,Result,Statement 等资源使用之后是否被关闭掉

此外,用户还可以自己定义规则,检查Java代码是否符合某些特定的编码规范。例如,你可以编写一个规则,要求PMD找出所有创建Thread和Socket对象的操作。

三种工具对比

ca99b3b43ad43722bcfd09e8b8e761f4.png

由表中可以看出几种工具对于代码检查各有侧重。其中,Checkstyle 更偏重于代码编写格式,及是否符合编码规范的检验, 对代码 bug 的发现功能较弱;而 FindBugs,PMD着重于发现代码缺陷。在对代码缺陷检查中,这三种工具在针对的代码缺陷类别也各有不同,且类别之间有重叠。

“规则定制

考虑到Sonar Java规则已经包含了PMD和CheckStyle规则,因此我们选择了Sonar的默认规则,并对其进行了定制化。下图中SonarQube中展示了部分定制化规则内容。

fd320a4202400d3e314716bbcc35a125.png

定制化后的规则覆盖的代码缺陷类型如下表所示(部分规则):

代码缺陷分类示例引用操作空指针引用对象操作对象比较(使用==而不是equals)表达式复杂化对于的if语句数组使用数组下标越界未使用变量或代码段未使用变量资源回收I/O未关闭方法调用未使用方法返回值代码设计空的try/catch/finally块

总结

本篇介绍了微服务架构架构对测试的挑战,在微服务架构下如何开展测试工作以及在微服务架构下的如何实现静态代码扫描。后续文章将介绍,敬请关注:

  • 1. 微服务测试之单元测试
  • 2. 微服务测试之契约测试
  • 3. 微服务测试之接口测试
  • 4. 微服务测试之UI自动化测试
  • 5. 微服务测试之探索式测试

作者简介

王田,随行付架构部测试架构师。负责测试方法论布道、自动化测试工具研究与推广。

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

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

相关文章

XML引入以及与html的区别

1.1 引入HTML: 负责网页的结构 CSS&#xff1a; 负责网页的样式&#xff08;美观&#xff09;Javascript&#xff1a; 负责在浏览器端与用户进行交互。负责静态的网页制作的语言HTML语言特点&#xff1a;1&#xff09;由标签组成。 <title> <p> <hr/> <br…

ADF:在任务流终结器中支持bean作用域

介绍 当我们需要在任务流消失之前完成一些最终工作&#xff08;干净的资源&#xff0c;紧密的连接等&#xff09;时&#xff0c;这是使用任务流终结器的非常普遍的推荐做法。 和往常一样&#xff0c;我们使用在任务流中声明的托管bean。 托管Bean可以具有不同的范围-请求&#…

Python 异常处理--raise函数用法

在Python中&#xff0c;要想引发异常&#xff0c;最简单的形式就是输入关键字raise&#xff0c;后跟要引发的异常的名称。异常名称标识出具体的类&#xff1a; Python异常处理是那些类的对象。执行raise语句时&#xff0c;Python会创建指定的异常类的一个对象。raise语句还可指…

大学计算机教学ppt数制,大学计算机基础 第3讲 数制及其相互转换 国家精品课程课件(可编辑)...

大学计算机基础第3讲数制及其相互转换国家精品课程课件PPT第1 章计算机基础知识第3 讲数制及其相互转换主要教学内容数制的基本概念1 数制转换2 小结3 学习目标1 理解数制的基本概念。2 掌握数制间的转换。3 能够灵活应用转换关系完成数制之间的转换。重点与难点不同数制之间的…

linux中匿名用户怎么登陆_南京课工场IT培训:Linux中vsftpd服务配置(匿名,用户,虚拟用户)...

vsftpd概述vsftpd 是“very secure FTP daemon”的缩写&#xff0c;安全性是它的一个最大的特点。vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字&#xff0c;它可以运行在诸如 Linux、BSD、Solaris、 HP-UNIX等系统上面&#xff0c;是一个完全免费的、开放源代码的ftp服务…

Java _ JDK _ Arrays, LinkedList, ArrayList, Vector 及Stack

(最近在看JDK源码&#xff0c;只是拿着它的继承图在看&#xff0c;但很多东西不记录仍然印象不深&#xff0c;所以开始记录JDK阅读系列。) &#xff08;一&#xff09;Arrays Arrays比较特殊&#xff0c;直接继承自Arrays -》List(Interface) -》Collection(Interface)。(Maybe…

server2016做文件服务器,『配置』服务器搭建 Office Online Server2016 实现文档预览 番外 错误篇...

安装一个或多个角色、角色服务或功能失败。找不到源文件。请再次尝试在新的“添加角色和功能”向导会话中安装角色、角色服务或功能&#xff0c;然后在向导的“确认”页中单击“指定备用源路径”以指定安装所需的源文件的有效位置。目标服务器的计算机帐户必须能够访问该位置。…

Java High CPU故障排除指南–第1部分

本文是该系列的第1部分&#xff0c;它将为您提供有关如何进行故障排除和识别Java高CPU问题根本原因的综合指南。 该指南也适用于独立的Java程序&#xff0c;但旨在帮助涉及Java EE企业日常生产支持的个人。 它还将包括最常见的高级CPU问题列表以及高级解决方案。 生产问题解决…

PHP数据结构之三 线性表中的单链表的PHP实现

线性表的链式存储&#xff1a;用一组任意的存储单元存储线性表中的数据元素。用这种方法存储的线性表简称线性链表。 链式存储线性表的特点&#xff1a;存储链表中结点的一组任意的存储单元可以是连续的&#xff0c;也可以是不连续的&#xff0c;甚至是零散分布在内存中的任意位…

php进程间通信 yoc_swoole的process模块创建和使用子进程

swoole中为我们提供了一个进程管理模块 Process&#xff0c;替换PHP的 pcntl 扩展&#xff0c;方便我们创建进程&#xff0c;管理进程&#xff0c;和进程间的通信。swoole提供了2种进程间的通信&#xff1a;1、基于 unix socket 的管道 pipe。2、基于 sysvmsg 的消息队列。我们…

ajax回复留言,Ajax 留言板模拟

这一节我们利用 Ajax 制作一个留言板模拟&#xff0c;之所以叫模拟&#xff0c;是由于没有将留言内容存入数据库&#xff0c;而只是假像地处理&#xff0c;因为这里着重讨论 Ajax&#xff0c;暂时就不涉及数据库操作。这里我们模拟了留言失败的情况&#xff0c;每次提交有 50% …

RabbitMQ:计划邮件传递

本月初&#xff0c;我在ComoRichWeb上的RabbitMQ上做了一个演讲&#xff0c;与会人员提出的一个问题是“是否可以发布一条消息供以后使用&#xff1f;” 我回答说&#xff0c;就我所知&#xff0c;这是不可能的&#xff0c;但是可能会有一些技巧来实现它。 好吧&#xff0c;今天…

mysqls压力测试怎么用_阿里研究员:测试稳定性三板斧,我怎么用?

阿里妹导读&#xff1a;如何治理测试稳定性问题&#xff1f;很多人会说&#xff1a;环境、流程管控、监控、工具化、加机器、专人负责、等等。这些都是对的。不过这些都是解决方案层面的&#xff0c;而不是方法论和理论体系层面的。今天&#xff0c;阿里研究员郑子颖来说说测试…

HttpModule与HttpHandler详解

ASP.NET对请求处理的过程&#xff1a;当请求一个*.aspx文件的时候&#xff0c;这个请求会被inetinfo.exe进程截获&#xff0c;它判断文件的后缀&#xff08;aspx&#xff09;之后&#xff0c;将这个请求转交给 ASPNET_ISAPI.dll&#xff0c;ASPNET_ISAPI.dll会通过http管道&…

【iOS开发】---- 强大的UI修改工具 UIAppearance-有图片效果

iOS5及其以后提供了一个比较强大的工具UIAppearance&#xff0c;可以轻松的统一你的界面&#xff0c;它提供如下两个方法&#xff1a; (id)appearance (id)appearanceWhenContainedIn:(Class <>)ContainerClass,... 第一个方法是统一全部改&#xff0c;比如你设置UINav…

7月9日王者荣耀服务器维护,王者荣耀 7月9日体验服停机更新公告

亲爱的召唤师&#xff1a;为了增加版本的稳定性&#xff0c;我们计划在2021年7月9日16:00-17:00对《王者荣耀》体验服进行停机维护。【更新时间】7月9日16:00-17:00(15:30关闭PVP)【更新方式】停机更新【更新范围】王者荣耀修炼之地体验服【下载地址】体验服更新完毕后&#xf…

使用Jetty设置JNDI(嵌入式)

我在开发工作区上运行嵌入式Jetty&#xff0c;从而节省了一些编译和部署恶性循环的时间。 我与Jetty的合作不多&#xff0c;易用性使我着迷于它。 我需要设置JNDI才能检索与数据库相关的活动的连接池。 尽管某些地方有完整的文档&#xff0c;但大多数都是分散的。 因此&#xf…

交华为换机access配置_华为交换机Hybrid接口及基础配置

一、回顾VLANVLAN基本概念VLAN即虚拟局域网&#xff0c;是将一个物理的LAN在逻辑上划分成多个广播域(多个VLAN)的通信技术。VLAN内的主机间可以直接通信&#xff0c;而VLAN间不能直接互通&#xff0c;从而将广播报文限制在一个VLAN内。由于VLAN之间的隔离&#xff0c;所以一些类…

HttpClient使用之下载远程服务器中的文件(注意目录遍历漏洞)

参考文献&#xff1a; http://bbs.csdn.net/topics/390952011 http://blog.csdn.net/ljj_9/article/details/53306468 1.下载地址 http://hc.apache.org/downloads.cgi Apache-》Projects-》HttpComponents 2.DownloadServlet 1 package com.servlet;2 3 import java.io.Buffer…

HDOJ-1263

水果 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 5303 Accepted Submission(s): 2022 Problem Description夏天来了~~好开心啊,呵呵,好多好多水果~~Joe经营着一个不大的水果店.他认为生存之道就是经营最受顾…