-
本篇介绍了如何使用java来进行SonarQube的自定义规则插件的开发
-
基本上就是直接翻译Writing Custom Java Rules 101这个SonarQube的官方Readme内容
-
建议具有一定Java,Maven和Junit的基础,当然按照步骤是能够完成整个开发,但是如果中间出现操作失误或者由于配置环境不同,一定的基础知识能够帮助你更好的解决问题
开发之前需要的环境
-
Java要尽量在1.8版本以上
-
Maven安装最新版就行
-
推荐使用Intellij idea或者eclipse等主流IDE
-
本次规则插件主要针对SonarQube8.9以上的版本进行开发
主要开发流程
-
git clone
sonar-java
这个项目 -
进入到开发目录
./docs/java-custom-rules-example/
中,对该目录下的各个文件夹和文件进行说明: -
pom.xml
和pom_SQ_8_9_LTS.xml
: 由于SonarQube的规则插件是基于Maven开发的,所有开发需要的依赖和插件都需要在这里写明,由于本次是编写面向SonarQube8.9以上版本的规则插件,所以这一次使用pom_SQ_8_9_LTS.xml
-
./src/main
: 这个路径主要放规则插件的规则逻辑代码 -
./src/test
: 由于本次规则插件是基于TDD(测试驱动开发)进行开发,这个目录放置针对./src/main
中放置的规则逻辑代码的测试代码 -
使用Maven进行打包的时候使用
mvn clean install -f pom_SQ_8_9_LTS.xml
命令 -
本次开发主要就是写三个文件
1. 测试文件:文件路径/src/test/files/
,建立一个文件名为MyFirstCustomCheck.java
,用来测试规则代码
2. 测试class:文件路径/src/test/java
下的org.sonar.samples.java.checks
包,建立一个文件名为MyFirstCustomCheckTest.java
,用于调用junit进行单元测试
3. 规则代码:文件路径/src/main/java
下的org.sonar.samples.java.checks
包,建立一个文件名为MyFirstCustomCheck.java
,这个就是写入本次规则插件的主要代码 -
主要开发流程中各个文件的代码
本次开发的规则:如果一个函数有一个参数,那么他的返回值和这个参数不能是一个类型 -
//
Noncompliant
是指违反规则的测试,在写测试用例的时候,必须加这个注释 -
由于
foo3
和foo4
的参数类型和返回类型是相同的,违反规则 -
nodesToVisit(): 由于本次规则是针对函数的输入值和返回值的问题,所以就是对于函数的静态代码检查,所以会使用
Kind.METHOD
这个关键词,如果你有其他希望测试的,可使用其他类型的关键词 -
visitNode():AST算法会把代码中的单词和符号进行归类排序成为树状,每个树枝都是一个Node,本次规则是针对函数的规则,所以就需要找Method类,接下来根据代码就能够理解内容了。
1、测试文件MyFirstCustomCheck.java
class MyClass {
MyClass(MyClass mc) { }
int foo1() { return 0; }
void foo2(int value) { }
int foo3(int value) { return 0; } // Noncompliant
Object foo4(int value) { return null; }
MyClass foo5(MyClass value) {return null; } // Noncompliant
int foo6(int value, String name) { return 0; }
int foo7(int ... values) { return 0;}
}
程序说明:
2、测试classMyFirstCustomCheckTest.java
package org.sonar.samples.java.checks;
import org.junit.jupiter.api.Test;
class MyFirstCustomCheckTest {
void test() {
CheckVerifier.newVerifier()
.onFile("src/test/files/MyFirstCustomCheck.java")
.withCheck(new MyFirstCustomCheck())
.verifyIssues();
}
}
3、规则代码MyFirstCustomCheck.java
package org.sonar.samples.java.checks;
import org.sonar.check.Rule;
import org.sonar.plugins.java.api.IssuableSubscriptionVisitor;
import org.sonar.plugins.java.api.tree.Tree.Kind;
import java.util.Collections;
import java.util.List;
"MyFirstCustomRule") (key =
public class MyFirstCustomCheck extends IssuableSubscriptionVisitor {
public void visitNode(Tree tree) {
MethodTree method = (MethodTree) tree;
if (method.parameters().size() == 1) {
Symbol.MethodSymbol symbol = method.symbol();
Type firstParameterType = symbol.parameterTypes().get(0);
Type returnType = symbol.returnType().type();
if (returnType.is(firstParameterType.fullyQualifiedName())) {
reportIssue(method.simpleName(), "Never do that!");
}
}
}
public List<Kind> nodesToVisit() {
return Collections.singletonList(Kind.METHOD);
}
}
程序说明:SonarQube的规则插件是基于AST算法的,要注意这里面的两个方法。
5、这样主要的规则代码就完成,接下来还有一下其他相关的文件需要配置。
关于苏州华克斯信息科技有限公司
联系方式:400-028-4008
0512-62382981
专业的测试及安全产品服务提供商
Fortify | Webinspect | AppScan
SonarQube | 极狐GitLab
LoadRunner | UFT(QTP) | ALM(QC)
Micro Focus (原HPE)金牌合作伙伴
SonarQube中国总代理
极狐GitLab铂金级合伙伴
HCL中国合作伙伴
原文始发于微信公众号(华克斯):SonarQube自定义规则开发
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论