静态代码扫描为整个发展组织增加价值。无论您在开发组织中发挥的作用如何,静态代码扫描解决方案都具有附加价值,拥有软件开发中所需要的尖端功能,最大限度地提高质量并管理软件产品中的风险。
背景
微服务架构模式具有服务间独立,可独立开发部署等特点,独立开发诱发了技术上的分离,HTTP通信增加了问题诊断的复杂度,对系统的功能、性能和安全方面的质量保障带来了很大的挑战。
“
微服务架构对测试的挑战
微服务架构模式下多个独立业务服务同时开展开发工作,每个系统都有各自的业务范围和开发周期要求,这样一来,下图所示的传统流程中产品经理提供需求,需求人员进行需求分析、开发人员进行开发,最后交给测试人员进行测试的方法,就无法满足测试覆盖和测试效率的要求。 相对于传统的单体模式而言,微服务模式下对测试带来的挑战总结起来包括以下内容:
“
微服务架构下如何开展测试
针对上面提到的微服务对测试的挑战,一方面为了保证在服务各个层级上对微服务进行全面的测试,特别是对于分布式系统;另一方面又要确保测试执行的效率,这样才能保证持续集成/持续交付(CI/CD)。因此,总体的测试策略采用如下解决方法:
下面结合分层自动化测试的思想,首先对静态代码扫描进行介绍。
静态代码扫描
“
静态代码扫描背景
静态代码分析是指在不运行代码的方式下,通过词法分析、语法分析、控制流、数据流分析等技术对程序代码进行扫描的技术。它的目的是验证代码是否满足规范性、安全性、可靠性、可维护性的要求。静态代码扫描处于分层自动化测试的最底层,它和单元测试同级别。为了保证公司代码的规范性、安全性、可靠性的要求,通过定制公司级的静态代码扫描规范、扫描规则和扫描实施流程保证实施高效落地。
“
静态代码扫描意义
软件开发人员最终负责代码质量。代码质量是非功能性需求的一部分,因此是开发人员的直接责任。代码质量不应该存在技术债务,在开发的过程中每一步都提供反馈,从IDE到发布。这使得开发人员能够尽早做出有关代码质量的决策,使他们能够做得更好,并提供质量更好的软件产品。
DevOps需要确保软件的构建方式正确。DevOps中涉及的责任很多,其中包括支持开发流程,自动化测试,确保质量,提高生产力.....并最终实现持续部署。良好的代码质量是实现所有这些目标的必要条件,尽管不是充分条件。静态代码扫描可在任何构建/测试/部署步骤中添加的代码质量检验门槛,能够自动执行一组统一的质量标准,从而确保组织交付更好的软件。
代码静态扫描可降低风险并提高团队生产力。管理人员需要能够安全地运行软件,并且需要花费合理的投资回报。我们的解决方案一目了然地显示了他们面临的技术债务以及他们缓解的成本。它还具有开箱即用的功能,可以系统地提高开发团队的可维护性和长期生产力。这使管理人员能够以最佳成本使用风险控制方法确保其组织能够交付更好的软件。
“
静态代码扫描介绍
静态代码扫描处在特性分支开发完成之后,具体的描述如下:
“
静态代码扫描流程
随行付静态代码扫描平台的具体实现是通过集成SonarQube平台工具、Jenkins集成工具、IDE SonarLint插件和CheckStyle本地化规则模板等开源工具、插件集而成。实现本地化代码的实施检测,版本构建后的二次检测,以及邮件反馈等功能的流程闭环,保证投产前代码符合随行付代码规范的要求。具体的流程如下图所示:
质量阀要求: 1.新覆盖率大于等于80%; 2.新增Bugs为0; 3.新增漏洞为0; 4.新增坏味道为0;
SonarQube与规则
SonarQube是一个用于代码质量管理的开源平台,支持25+种编程语言的质量扫描。SonqrQube由远程机、Server端和数据库构成。远程客户机可以通过各种不同的分析机制,从而将被分析的项目代码上传到SonarQube server 并进行代码质量的管理和分析,SonarQube 还会通过Web API将分析的结果以可视化、可度量的方式展示给出来。逻辑结构如下图所示:
“
SonarQube的整合能力
SonarQube平台中支持整合各种静态代码扫描检测工具。SonarQube中各种代码检测工具分析对象及应用技术对比:
Java静态分析工具 | 分析对象 | 应用技术 |
---|---|---|
CheckStyle | Java源文件 | 缺陷模式匹配 |
FindBugs | 字节码 | 缺陷模式匹配;数据流分析 |
PMD | Java源代码 | 缺陷模式匹配 |
可以很方便的帮我们检查Java代码中的格式错误,它能够自动化代码规范检查过程,从而使得开发人员从这项重要,但是枯燥的任务中解脱出来。基本上都是根据开发规则定制规则。主要涵盖以下内容:
Findbugs是一个静态分析工具,它检查类或者JAR文件,将字节码与一组缺陷模式进行对比以发现可能的问题。主要涵盖以下内容:
一种开源分析Java代码错误的工具,其原理为使用JavaCC生成解析器来解析源代码并生成AST(抽象语法树)。与其他分析工具不同的是,PMD通过静态分析获知代码错误。也就是说,在不运行Java程序的情况下报告错误。PMD附带了许多可以直接使用的规则,利用这些规则可以找出Java源程序的许多问题,例如:
此外,用户还可以自己定义规则,检查Java代码是否符合某些特定的编码规范。例如,你可以编写一个规则,要求PMD找出所有创建Thread和Socket对象的操作。
由表中可以看出几种工具对于代码检查各有侧重。其中,Checkstyle 更偏重于代码编写格式,及是否符合编码规范的检验, 对代码 bug 的发现功能较弱;而 FindBugs,PMD着重于发现代码缺陷。在对代码缺陷检查中,这三种工具在针对的代码缺陷类别也各有不同,且类别之间有重叠。
“
规则定制
考虑到Sonar Java规则已经包含了PMD和CheckStyle规则,因此我们选择了Sonar的默认规则,并对其进行了定制化。下图中SonarQube中展示了部分定制化规则内容。
定制化后的规则覆盖的代码缺陷类型如下表所示(部分规则):
代码缺陷分类 | 示例 |
---|---|
引用操作 | 空指针引用 |
对象操作 | 对象比较(使用==而不是equals) |
表达式复杂化 | 对于的if语句 |
数组使用 | 数组下标越界 |
未使用变量或代码段 | 未使用变量 |
资源回收 | I/O未关闭 |
方法调用 | 未使用方法返回值 |
代码设计 | 空的try/catch/finally块 |