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