在最近做Java
服务端代码静态测试过程中,目前采取的方案如下:
- 测试拉取代码到本地。使用
IDE:Intellij
,插件:SpotBugs
(无增强插件)进行静态测试,更新BUG
信息,维护文档和代码中的注解。 - 开发修复禅道
BUG
。 - QA拉取修复代码分支,与本地分支(含有抑制注解)进行合并,然后进行
BUG
回归。 - 循环以上过程,直至该分支代码
零BUG
。
我在自己的项目(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
,会在源码的位置看到一个小虫子(颜色代表不同级别),代码下面会出现波浪线提醒。
点击小虫子图标或者使用Intellij
快捷提示都可以见到下面的修复选项。
一共四个选项,两个条件: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,原创分享爱好者,腾讯云、开源中国和掘金社区首页推荐,知乎八级强者,欢迎关注。