Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

mvn test vs mvn surefire:test

I am running a single test with Maven.

Which is the difference of running it in these two ways:

mvn -Dtest=DatabaseTest test

mvn -Dtest=DatabaseTest surefire:test

I can see that test shows:

[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ rac.mybatis ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 2 resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ rac.mybatis ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ rac.mybatis ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /home/etomort/smip/oracle-rac/mybatis-rac/src/test/resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ rac.mybatis ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ rac.mybatis ---
[INFO] Surefire report directory: /home/etomort/smip/oracle-rac/mybatis-rac/target/surefire-reports

While surefire:test shows:

[INFO] --- maven-surefire-plugin:2.12.4:test (default-cli) @ rac.mybatis ---
[INFO] Surefire report directory: /home/etomort/smip/oracle-rac/mybatis-rac/target/surefire-reports

This question has very valuable explanation, though current one points to a typical doubt one can face and it is a very concrete use case. The answer provided by @Shadow clarifies it. The maven-lifecycle-vs-phase-vs-plugin-vs-goal question can be consulted to widen and for deeper understand of Maven way of working.

like image 562
nephewtom Avatar asked Mar 07 '23 10:03

nephewtom


2 Answers

The difference is that test runs the complete build up to the points where tests are executed, whereas surefire:test only executes the tests, re-using intermediate results from a previous build.

So if you e.g. edit a test and only run surefire:test, the new version of the test will not be compiled and Maven will therefore execute some old version of the test. In general, it will be hard to say which version of the test will be executed in this way, so this is why people in general use mvn clean test instead of mvn surefire:test.

like image 85
oberlies Avatar answered Mar 16 '23 13:03

oberlies


test is a lifecycle phase and since Maven is convention based, it means that by default there are certain plugins already bound to each phase.

You can also add your own to a phase but you can also invoke the goal of a plugin manually mvn plugin:goal.

Surefire is the official test plugin, bound to the test phase.

like image 29
Shadow Avatar answered Mar 16 '23 14:03

Shadow