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
中放置的规则逻辑代码的测试代码mvn clean install -f pom_SQ_8_9_LTS.xml
命令/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
,这个就是写入本次规则插件的主要代码
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;}}
程序说明:
//
Noncompliant
是指违反规则的测试,在写测试用例的时候,必须加这个注释foo3
和foo4
的参数类型和返回类型是相同的,违反规则
2、测试classMyFirstCustomCheckTest.java
package org.sonar.samples.java.checks;import org.junit.jupiter.api.Test;class MyFirstCustomCheckTest { @Test 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;
@Rule(key = "MyFirstCustomRule")public class MyFirstCustomCheck extends IssuableSubscriptionVisitor {
@Override 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!"); } } }
@Override public List<Kind> nodesToVisit() { return Collections.singletonList(Kind.METHOD); }}
程序说明:SonarQube的规则插件是基于AST算法的,要注意这里面的两个方法。
Kind.METHOD
这个关键词,如果你有其他希望测试的,可使用其他类型的关键词5、这样主要的规则代码就完成。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。