I have a big project with around 5000 test cases. When running mvn clean install
it will run the test
goal twice (one as part of the install and the second time as part of the surefire
plugin).
Why it needs to run the test
for the second time? And is there away to force surefire
to use the test
goal results instead of re-invoking it's own?
I see it as a waste of time and machine resource, especially recently the second round of running the test
caused a PermGen
build error and no matter how much heap I pump into maven runner it still dies in the second testing round.
This is my surefire pluging configuration:
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<executions>
<execution>
<id>default-test</id>
<phase>test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<parallel>classes</parallel>
<threadCount>3</threadCount>
</configuration>
</execution>
</executions>
</plugin>
Is there a way to tweak the plugin to better handle machine resources?
Here is the full default maven profile which gets executed:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<archive>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
</manifest>
<manifestEntries>
<Build-Number>${build.number}</Build-Number>
<Job-Name>${job.name}</Job-Name>
<Build-Url>${build.url}</Build-Url>
<Git-Commit>${git.commit}</Git-Commit>
<Git-Branch>${git.branch}</Git-Branch>
<Timestamp>${maven.build.timestamp}</Timestamp>
<StyleGuide-Version>${styleguide.version}</StyleGuide-Version>
</manifestEntries>
</archive>
<warName>pss</warName>
</configuration>
</plugin>
<plugin>
<groupId>com.cj.jshintmojo</groupId>
<artifactId>jshint-maven-plugin</artifactId>
<version>1.3.0</version>
<executions>
<execution>
<goals>
<goal>lint</goal>
</goals>
</execution>
</executions>
<configuration>
<options>maxparams:5,camelcase,eqeqeq,forin,immed,latedef,noarg,noempty,nonew,expr</options>
<directories>
<directory>src/main/webapp/js/page</directory>
</directories>
<excludes>
<exclude>src/main/webapp/js/page/marketingPreferences.js</exclude>
<exclude>src/main/webapp/js/page/changeCarParkingDetails.js</exclude>
<exclude>src/main/webapp/js/page/angularjs-app.js</exclude>
<exclude>src/main/webapp/js/page/content-cover.js</exclude>
<exclude>src/main/webapp/js/page/amendmentConfirm.js</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.lesscss</groupId>
<artifactId>lesscss-maven-plugin</artifactId>
<version>1.3.3</version>
<executions>
<execution>
<id>bingleless</id>
<configuration>
<sourceDirectory>${project.basedir}/src/main/webapp/app-resources/</sourceDirectory>
<outputDirectory>${project.basedir}/src/main/webapp/app-resources/</outputDirectory>
<includes>
<include>**\/policy-self-service\/**\/*pss-sg.less</include>
</includes>
<compress>true</compress>
</configuration>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>yuicompressor-maven-plugin</artifactId>
<version>1.1</version>
<executions>
<execution>
<goals>
<goal>compress</goal>
</goals>
</execution>
</executions>
<configuration>
<excludes>
<exclude>**/*.min.js</exclude>
<exclude>**/*.min.css</exclude>
<exclude>**/style-guide/**</exclude>
<exclude>**/generated/**</exclude>
<exclude>**/app-resources/common/**</exclude>
<exclude>**/app-resources/bower_components/**</exclude>
<exclude>**/app-resources/policy-self-service/**</exclude>
</excludes>
<nosuffix>true</nosuffix>
<jswarn>false</jswarn>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<configuration>
<logViolationsToConsole>true</logViolationsToConsole>
</configuration>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
<configuration>
<parallel>classes</parallel>
<threadCount>3</threadCount>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-report-plugin</artifactId>
<version>${maven-surefire-report-plugin.version}</version>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>report-only</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
To skip running the tests for a particular project, set the skipTests property to true. You can also skip the tests via the command line by executing the following command: mvn install -DskipTests.
The Maven surefire plugin provides a test parameter that we can use to specify test classes or methods we want to execute. If we want to execute a single test class, we can execute the command mvn test -Dtest=”TestClassName”.
mvn clean: Cleans the project and removes all files generated by the previous build. mvn compile: Compiles source code of the project. mvn test-compile: Compiles the test source code. mvn test: Runs tests for the project.
I think the <execution>
in your pom.xml
causes the 2nd test run. Maven sees it as another goal to execute in addition to the default goal in the test phase.
Since maven-surefire-plugin
is a plugin used by default in Maven for test phase, you only need to provide the <configuration>
part outside of <execution>
. Modify your pom.xml
as below
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<configuration>
<parallel>classes</parallel>
<threadCount>3</threadCount>
</configuration>
</plugin>
</plugins>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With