Skip to content

Commit d337266

Browse files
authored
Fail the build when naming conventions violated (eugenp#3974)
* Failing build if unit test name does not follow one of the following conventions : ..IntegrationTest, ..LongRunningUnitTest, ..ManualTest, ..JdbcTest, ..LiveTest * Custom PMD Rules project * Fixed this issue when unit test classes were not being scanned by custom PMD rule (This happened after I pulled code from upstream project) * Don't fail the build if PMD custom rule fails * Reconfigure PMD * Reformat POM * Adjust PMD rules * Rename test
1 parent ecca8c9 commit d337266

5 files changed

Lines changed: 148 additions & 23 deletions

File tree

baeldung-pmd-rules.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?xml version="1.0"?>
2+
<ruleset name="Baeldung custom pmd rules" xmlns="http://pmd.sf.net/ruleset/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd"
4+
xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd">
5+
<description>Baeldung custom PMD rules</description>
6+
<rule name="UnitTestMustFollowNamingConventionRule" message="Test class name doesn't follow the naming convention" class="org.baeldung.pmd.UnitTestNamingConventionRule">
7+
<description>Test does not follow Baeldung naming convention</description>
8+
<priority>3</priority>
9+
</rule>
10+
</ruleset>

custom-pmd/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
## Custom PMD Rules

custom-pmd/pom.xml

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
3+
<modelVersion>4.0.0</modelVersion>
4+
<groupId>org.baeldung.pmd</groupId>
5+
<artifactId>custom-pmd</artifactId>
6+
<version>0.0.1-SNAPSHOT</version>
7+
<packaging>jar</packaging>
8+
<name>custom-pmd</name>
9+
<url>http://maven.apache.org</url>
10+
11+
<properties>
12+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
13+
<maven-compiler-plugin.version>3.7.0</maven-compiler-plugin.version>
14+
<pmdVersion>6.0.1</pmdVersion>
15+
</properties>
16+
17+
<dependencies>
18+
<dependency>
19+
<groupId>net.sourceforge.pmd</groupId>
20+
<artifactId>pmd-core</artifactId>
21+
<version>${pmdVersion}</version>
22+
</dependency>
23+
<dependency>
24+
<groupId>net.sourceforge.pmd</groupId>
25+
<artifactId>pmd-java</artifactId>
26+
<version>${pmdVersion}</version>
27+
</dependency>
28+
</dependencies>
29+
30+
<build>
31+
<plugins>
32+
<plugin>
33+
<groupId>org.apache.maven.plugins</groupId>
34+
<artifactId>maven-compiler-plugin</artifactId>
35+
<version>${maven-compiler-plugin.version}</version>
36+
<configuration>
37+
<source>1.8</source>
38+
<target>1.8</target>
39+
</configuration>
40+
</plugin>
41+
</plugins>
42+
</build>
43+
</project>
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package org.baeldung.pmd;
2+
3+
import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceDeclaration;
4+
import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule;
5+
6+
import java.util.Arrays;
7+
import java.util.List;
8+
import java.util.Objects;
9+
10+
public class UnitTestNamingConventionRule extends AbstractJavaRule {
11+
12+
private static List<String> allowedEndings = Arrays.asList(
13+
"IntegrationTest",
14+
"LongRunningUnitTest",
15+
"ManualTest",
16+
"JdbcTest",
17+
"LiveTest");
18+
19+
public Object visit(ASTClassOrInterfaceDeclaration node, Object data) {
20+
String className = node.getImage();
21+
Objects.requireNonNull(className);
22+
23+
if (className.endsWith("Test") || className.endsWith("Tests")) {
24+
if (allowedEndings.stream()
25+
.noneMatch(className::endsWith)) {
26+
addViolation(data, node);
27+
}
28+
}
29+
30+
return data;
31+
}
32+
}

pom.xml

Lines changed: 62 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
34
<modelVersion>4.0.0</modelVersion>
45
<groupId>com.baeldung</groupId>
56
<artifactId>parent-modules</artifactId>
@@ -27,7 +28,18 @@
2728
<exec-maven-plugin.version>1.6.0</exec-maven-plugin.version>
2829
</properties>
2930

31+
<reporting>
32+
<plugins>
33+
<plugin>
34+
<groupId>org.apache.maven.plugins</groupId>
35+
<artifactId>maven-jxr-plugin</artifactId>
36+
<version>2.3</version>
37+
</plugin>
38+
</plugins>
39+
</reporting>
40+
3041
<modules>
42+
<module>custom-pmd</module>
3143
<module>parent-boot-5</module>
3244
<module>asm</module>
3345
<module>atomix</module>
@@ -49,7 +61,7 @@
4961
<module>bootique</module>
5062

5163
<module>cdi</module>
52-
<!-- <module>core-java-9</module> -->
64+
<!--<module>core-java-9</module>-->
5365
<module>core-java</module>
5466
<module>core-java-io</module>
5567
<module>core-java-8</module>
@@ -63,12 +75,12 @@
6375

6476
<module>ethereumj</module>
6577

66-
<!--<module>ejb</module> -->
78+
<!--<module>ejb</module>-->
6779

6880
<module>feign</module>
6981
<module>flips</module>
7082

71-
<!-- <module>testing-modules/gatling</module> --> <!-- not meant to run as part of the standard build -->
83+
<!--<module>testing-modules/gatling</module> -->
7284

7385
<module>geotools</module>
7486
<module>testing-modules/groovy-spock</module>
@@ -88,12 +100,12 @@
88100
<module>httpclient</module>
89101
<module>hystrix</module>
90102

91-
<!-- <module>image-processing</module> --> <!-- TODO: to add back -->
103+
<!--<module>image-processing</module>-->
92104
<module>immutables</module>
93105
<module>influxdb</module>
94106

95107
<module>jackson</module>
96-
<!-- <module>persistence-modules/java-cassandra</module> -->
108+
<!--<module>persistence-modules/java-cassandra</module>-->
97109
<module>vavr</module>
98110
<module>java-lite</module>
99111
<module>java-rmi</module>
@@ -104,7 +116,7 @@
104116
<module>javafx</module>
105117
<module>jgroups</module>
106118
<module>jee-7</module>
107-
<!-- <module>jhipster/jhipster-monolithic</module> -->
119+
<!--<module>jhipster/jhipster-monolithic</module>-->
108120
<module>jjwt</module>
109121
<module>jpa-storedprocedure</module>
110122
<module>jsf</module>
@@ -114,19 +126,16 @@
114126
<module>testing-modules/junit-5</module>
115127
<module>jws</module>
116128

117-
<!--
118-
<module>libraries</module>
119-
-->
129+
<!--<module>libraries</module>-->
120130
<module>libraries-data</module>
121131
<module>linkrest</module>
122132
<module>logging-modules/log-mdc</module>
123133
<module>logging-modules/log4j</module>
124134
<module>logging-modules/log4j2</module>
125135
<module>logging-modules/logback</module>
126136
<module>lombok</module>
127-
<!-- <module>kotlin</module> -->
128137
<module>mapstruct</module>
129-
<!-- <module>metrics</module> -->
138+
<module>metrics</module>
130139
<module>maven</module>
131140
<module>mesos-marathon</module>
132141
<module>testing-modules/mockito</module>
@@ -145,7 +154,6 @@
145154

146155
<module>persistence-modules/querydsl</module>
147156

148-
<!-- <module>raml</module> -->
149157
<module>reactor-core</module>
150158
<module>persistence-modules/redis</module>
151159
<module>testing-modules/rest-assured</module>
@@ -160,7 +168,7 @@
160168
<module>spring-5</module>
161169
<module>spring-5-reactive</module>
162170
<module>spring-5-mvc</module>
163-
<!-- <module>spring-5-security</module> --> <!-- TODO: uncomment -->
171+
<module>spring-5-security</module>
164172
<module>spring-activiti</module>
165173
<module>spring-akka</module>
166174
<module>spring-amqp</module>
@@ -199,7 +207,7 @@
199207
<module>spring-integration</module>
200208
<module>spring-jenkins-pipeline</module>
201209
<module>spring-jersey</module>
202-
<!-- <module>jmeter</module> --> <!-- TODO: uncomment -->
210+
<!--<module>jmeter</module> -->
203211
<module>spring-jms</module>
204212
<module>spring-jooq</module>
205213
<module>persistence-modules/spring-jpa</module>
@@ -290,7 +298,7 @@
290298
<module>lucene</module>
291299
<module>vraptor</module>
292300
<module>persistence-modules/java-cockroachdb</module>
293-
<module>spring-security-thymeleaf</module>
301+
<module>spring-security-thymeleaf</module>
294302
<module>persistence-modules/java-jdbi</module>
295303
<module>jersey</module>
296304
<module>java-spi</module>
@@ -354,7 +362,7 @@
354362

355363
<build>
356364
<plugins>
357-
365+
358366
<plugin>
359367
<groupId>org.codehaus.mojo</groupId>
360368
<artifactId>exec-maven-plugin</artifactId>
@@ -363,7 +371,7 @@
363371
<executable>maven</executable>
364372
</configuration>
365373
</plugin>
366-
374+
367375
<plugin>
368376
<groupId>org.apache.maven.plugins</groupId>
369377
<artifactId>maven-surefire-plugin</artifactId>
@@ -380,7 +388,7 @@
380388
</excludes>
381389
</configuration>
382390
</plugin>
383-
391+
384392
<plugin>
385393
<groupId>org.apache.maven.plugins</groupId>
386394
<artifactId>maven-compiler-plugin</artifactId>
@@ -390,17 +398,48 @@
390398
<target>1.8</target>
391399
</configuration>
392400
</plugin>
393-
401+
<plugin>
402+
<groupId>org.apache.maven.plugins</groupId>
403+
<artifactId>maven-pmd-plugin</artifactId>
404+
<version>3.9.0</version>
405+
<dependencies>
406+
<dependency>
407+
<groupId>org.baeldung.pmd</groupId>
408+
<artifactId>custom-pmd</artifactId>
409+
<version>0.0.1-SNAPSHOT</version>
410+
</dependency>
411+
</dependencies>
412+
<configuration>
413+
<failurePriority>5</failurePriority> <!-- TODO change to 0 after fixing the project -->
414+
<aggregate>true</aggregate>
415+
<failOnViolation>false</failOnViolation>
416+
<verbose>true</verbose>
417+
<linkXRef>true</linkXRef>
418+
<includeTests>true</includeTests>
419+
<sourceEncoding>UTF-8</sourceEncoding>
420+
<targetJdk>1.8</targetJdk>
421+
<rulesets>
422+
<ruleset>${user.dir}/baeldung-pmd-rules.xml</ruleset>
423+
</rulesets>
424+
</configuration>
425+
<executions>
426+
<execution>
427+
<phase>compile</phase>
428+
<goals>
429+
<goal>check</goal>
430+
</goals>
431+
</execution>
432+
</executions>
433+
</plugin>
394434
</plugins>
395-
435+
396436
<extensions>
397437
<extension>
398438
<groupId>com.vackosar.gitflowincrementalbuilder</groupId>
399439
<artifactId>gitflow-incremental-builder</artifactId>
400440
<version>3.4</version>
401441
</extension>
402442
</extensions>
403-
443+
404444
</build>
405-
406445
</project>

0 commit comments

Comments
 (0)