26
votes

I have a jar in my maven repository that contains junit tests, which should be run in different projects, because it is able to inspect the project and test for certain features of it. Unforunately surefire doesn't pick up tests that are contained in a jar, as this Feature Request shows.

In the feature request they propose to unpack the jar to be then executed by surefire.

I successfully unpacked the jar using the maven-dependency-plugin, but the contained tests are not executed anyway. This is how I configured the maven-dependency-plugin to unpack my jar:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>unpack</id>
            <phase>process-test-classes</phase>
            <goals>
                <goal>unpack</goal>
            </goals>
            <configuration>
                <artifactItems>
                    <artifactItem>
                        <groupId>de.mwx.test</groupId>
                        <artifactId>selenium-test-base</artifactId>
                        <version>0.1</version>
                        <overWrite>true</overWrite>
                          <outputDirectory>
                              ${project.build.directory}/classes
                          </outputDirectory>
                    </artifactItem>
                </artifactItems>
            </configuration>
        </execution>
    </executions>
</plugin>

Any help would be appriciated.

3
Why are the tests in another jar? Are they tests for your project, or another? If another, why are you running them? If for your app, why aren't they in your project?Dave Newton
The other jar is actually a test framework that operates on the current project and executes miscellaneous tasks. It seemed to me like the most modular way: But it wasn't the intended use for surefix, I guess.devsnd
But maven projects already define a standard for a project's tests. And IMO it doesn't make sense to make a project dependent on its tests--if anything, tests would be dependent on the module under test, since tests use the module, but not vice-versa.Dave Newton
It does make sense to make a project to be dependent of its tests if the project itself is a test. the depending jar is a framework that calls the tests in the current project. This makes it easy to configure a fleet of tests on the fly.devsnd
IMO, no, that doesn't make sense.Dave Newton

3 Answers

41
votes

There is a way of running a test in maven from another jar. from maven-surefire-plugin version 2.15 you can tell maven to scan your test jars for tests and run them. You don't need to extract the tests jar. Just add a dependency to your test jar and:

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
            <dependenciesToScan>
                <dependency>test.jar.group:test.jar.artifact.id</dependency>
            </dependenciesToScan>
        </configuration>
    </plugin>

Took this stuff from https://gist.github.com/aslakknutsen/4520226 And https://issues.apache.org/jira/browse/SUREFIRE-569

As expected, this works for JUnit and Testng. Will probably work for anything that surefire can run.

3
votes

(This is just restating what is in a comment above from khmarbaise, but since it wasn't clarified, I think it's worth restating):

Use the test-classes directory instead of the classes folder as outputDirectory:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>unpack</id>
            <phase>process-test-classes</phase>
            <goals>
                <goal>unpack</goal>
            </goals>
            <configuration>
                <artifactItems>
                    <artifactItem>
                        <groupId>de.mwx.test</groupId>
                        <artifactId>selenium-test-base</artifactId>
                        <version>0.1</version>
                        <overWrite>true</overWrite>
                          <outputDirectory>
                              ${project.build.directory}/test-classes
                          </outputDirectory>
                    </artifactItem>
                </artifactItems>
            </configuration>
        </execution>
    </executions>
</plugin>
1
votes

As described in the issue you need to have a Suite which is contains in your project which is NOT located in the test jar.