在最近做​​Java​​服务端代码静态测试过程中,目前采取的方案如下:

  • 测试拉取代码到本地。使用​​IDE:Intellij​​​,插件:​​SpotBugs​​​(无增强插件)进行静态测试,更新​​BUG​​信息,维护文档和代码中的注解。
  • 开发修复禅道​​BUG​​。
  • QA拉取修复代码分支,与本地分支(含有抑制注解)进行合并,然后进行​​BUG​​回归。
  • 循环以上过程,直至该分支代码​​零BUG​​。

SpotBugs注解SuppressWarnings在Java&Groovy中的应用_错误类型

我在自己的项目(​​Java​​​&​​Groovy​​)中实验通过,分享一下在两种语言的实践经验。

总体来讲,​​Java​​​还是很方便的,​​Intellij​​​自带的修复提示基本满足需求,​​Groovy​​​代码验证误报的较多,使用​​Intellij​​修复提醒功能时,几乎是瘫痪状态。

  • 关于错误类型及其详解,网上很多人都写了,我建议大家去看官网文档:**spotbugs.readthedocs.io/en/stable/b…

添加依赖

使用​​SpotBugs​​​注解​​SuppressWarnings​​需要添加依赖。

Gradle

// https://mvnrepository.com/artifact/com.google.code.findbugs/annotations
compile group: 'com.google.code.findbugs', name: 'annotations', version: '3.0.1'

Maven

<!-- https://mvnrepository.com/artifact/com.google.code.findbugs/annotations -->
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>annotations</artifactId>
<version>3.0.1</version>
</dependency>

Java

首先看一个​​BUG​​,会在源码的位置看到一个小虫子(颜色代表不同级别),代码下面会出现波浪线提醒。

SpotBugs注解SuppressWarnings在Java&Groovy中的应用_静态测试_02

点击小虫子图标或者使用​​Intellij​​快捷提示都可以见到下面的修复选项。

SpotBugs注解SuppressWarnings在Java&Groovy中的应用_错误类型_03

一共四个选项,两个条件:​​clear​​​和​​suppress​​​。前者是清楚这个错误,但只是清除单次测试结果,不影响再次扫描。后者是添加注解​​uppressFBWarnings("DM_DEFAULT_ENCODING")​​​,引号内容是错误类型,具体解释在​​SpotBugs​​面板的右侧,内容跟官网文档一致。

使用​​@SuppressFBWarnings("DM_DEFAULT_ENCODING")​​​注解有三个地方:1、针对某个变量(成员变量或者类变量);2、方法;3、类(据我测试这个应该范围是生成的​​classes​​文件,内部类啥的应该都会起作用)。

注解后面​​String​​​字符串是错误类型,下面是​​Java​​中注解的单个类型和多个类型的语法:

  • 单个:​​@SuppressFBWarnings("DM_DEFAULT_ENCODING")​​​或者​​@SuppressFBWarnings(value = "ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD")​
  • 多个​​@SuppressFBWarnings({"MS_SHOULD_BE_FINAL","NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE", "NS_DANGEROUS_NON_SHORT_CIRCUIT"})​

Groovy

功能操作都是一样的,但是​​Groovy​​​语言环境中,不能自动添加​​@SuppressFBWarnings("DM_DEFAULT_ENCODING")​​,需要手动添加,着实非常不爽,而且误报率较高。

在注解的语法上有些许的区别(多个错误类型),如下:

  • 单个:​​@SuppressFBWarnings("DM_DEFAULT_ENCODING")​​​或者​​@SuppressFBWarnings(value = "ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD")​
  • 多个:​​@SuppressFBWarnings(["HE_EQUALS_USE_HASHCODE", "EQ_UNUSUAL", "MS_SHOULD_BE_FINAL"])​

这是因为​​Java​​​和​​Groovy​​​对于定义数组语法的差异导致的,​​Java​​​使用​​{}​​​而​​Groovy​​​使用​​[]​​。


公众号FunTester,原创分享爱好者,腾讯云、开源中国和掘金社区首页推荐,知乎八级强者,欢迎关注。